applicationContext配置模板
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--導入其他spring配置-->
<import resource="{path}/beans.xml"/>
<!--設置別名:在獲取Bean的時候可以使用別名獲取-->
<alias name="hello" alias="hello123"/>
<bean id="hello" class="com.kuang.pojo.Hello">
<property name="name" value="Spring"/>
</bean>
</beans>
1.IOC方面
jar包和測試
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.10.RELEASE</version>
</dependency>
@Test
public void test(){
//解析beans.xml文件 , 生成管理相應的Bean對象
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//getBean : 參數即爲spring配置文件中bean的id .
Hello hello = (Hello) context.getBean("hello");
hello.show();
}
1.注入方式:
(1)構造器無參注入(略)
構造器有參注入
<!-- 有參注入一共有三種方式 -->
<bean id="user" class="com.jyy.pojo.User">
<!-- index指構造方法 , 下標從0開始 -->
<constructor-arg index="0" value="jyy"/>
<!-- name指參數名 -->
<constructor-arg name="name" value="jyy"/>
<!-- type指類型 -->
<constructor-arg type="java.lang.String" value="jyy"/>
</bean>
(2)Set注入(需要該屬性寫了setter方法)(如果屬性是boolean類型 , 沒有set方法 , 是 is)
<!--value注入基本類型,ref注入引用-->
<bean id="student" class="com.jyy.pojo.Student">
<property name="name" value="張三"/>
<property name="teacher" ref="teacher1"/>
</bean>
<bean id="teacher1" class="com.jyy.pojo.Teacher">
<property name="name" value="老師"/>
</bean>
(3)數組Array / List / Map / Set / Null空值 / Properties類
<bean id="student" class="com.jyy.pojo.Student">
<!--1.普通值注入-->
<property name="name" value="張三" />
<!--2.引用注入-->
<property name="address" ref="address" />
<!--3.array注入-->
<property name="books">
<array>
<value>西遊記</value>
<value>紅樓夢</value>
<value>水滸傳</value>
<value>三國演義</value>
</array>
</property>
<!--4.list注入-->
<property name="hobbys">
<list>
<value>聽歌</value>
<value>敲代碼</value>
<value>看電影</value>
</list>
</property>
<!--5.map注入-->
<property name="card">
<map>
<entry key="身份證" value="12312414"></entry>
<entry key="銀行卡" value="3121312"></entry>
</map>
</property>
<!--6.set注入-->
<property name="games">
<set>
<value>LOL</value>
<value>COC</value>
<value>BOB</value>
</set>
</property>
<!--6.空值注入 eg. String wife = null-->
<property name="wife">
<null/>
</property>
<!--7.Properties類注入-->
<property name="info">
<props>
<prop key="學號">123124</prop>
<prop key="性別">man</prop>
</props>
</property>
</bean>
(4)p命名(代替property標籤進行setter注入) 和 c命名(代替constructor-arg標籤進行構造器注入):
導入約束 : xmlns:p="http://www.springframework.org/schema/p"
<!--P(屬性: properties)命名空間 , 屬性依然要設置set方法-->
<bean id="user" class="com.jyy.pojo.User" p:name="張三" p:age="22"/>
導入約束 : xmlns:c="http://www.springframework.org/schema/c"
<!--C(構造: Constructor)命名空間 , 屬性依然要設置set方法,同時需要有參構造器-->
<bean id="user" class="com.jyy.pojo.User" c:name="張三" c:age="23"/>
(5)autowire標籤實現自動裝配(沒啥大用處,不如註解方便)
假如user類中有cat和dog屬性,可以通過autowire自動幫我們配置
<bean id="dog" class="com.jyy.pojo.Dog"/>
<bean id="cat" class="com.jyy.pojo.Cat"/>
<!--通過類型自動注入-->
<bean id="user" class="com.kuang.pojo.User" autowire="byType">
<property name="str" value="主人"/>
</bean>
<!--通過名稱自動注入-->
<bean id="user" class="com.kuang.pojo.User" autowire="byName">
<property name="str" value="主人"/>
</bean>
2. Bean作用域/生命週期,scope屬性
使用標籤:scope
<bean id="user" class="com.jyy.pojo.User" scope="singleton">
3.註解
步驟:aop包 + xml中開啓註解 + 類中使用註解
使用註解需要導入aop的包
在spring配置文件中引入context文件頭,並開啓註解
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
<context:annotation-config/>
3.1 對類中的引用類型屬性註解(代替<property ref>標籤)
(1)@Autowired(需要aop的包,自動根據類型匹配)
@Autowired(required=false) 說明:false,對象可以爲null;true,對象必須存對象,不能爲null
User類
public class User {
@Autowired
private Cat cat;
@Autowired
private Dog dog;
private String str;
public Cat getCat() {
return cat;
}
public Dog getDog() {
return dog;
}
public String getStr() {
return str;
}
}
配置文件
<context:annotation-config/>
<bean id="dog" class="com.kuang.pojo.Dog"/>
<bean id="cat" class="com.kuang.pojo.Cat"/>
<bean id="user" class="com.kuang.pojo.User"/>
(2)@Qualifier:不能單獨使用
@Autowired是根據類型自動裝配的,加上@Qualifier則可以根據byName的方式自動裝配
<bean id="dog1" class="com.kuang.pojo.Dog"/>
<bean id="dog2" class="com.kuang.pojo.Dog"/>
<bean id="cat1" class="com.kuang.pojo.Cat"/>
<bean id="cat2" class="com.kuang.pojo.Cat"/>
@Autowired
@Qualifier(value = "cat2")
private Cat cat;
@Autowired
@Qualifier(value = "dog2")
private Dog dog;
如果不加@Qualifer,系統無法分辨,因爲bean中有兩個Cat類和Dog類
(3)@Resource
@Resource如有指定的name屬性,先按該屬性進行byName方式查找裝配;其次再進行默認的byName方式進行裝配;如果以上都不成功,則按byType的方式自動裝配。
public class User {
//如果允許對象爲null,設置required = false,默認爲true
@Resource(name = "cat2")
private Cat cat;
@Resource
private Dog dog;
private String str;
}
<bean id="dog" class="com.kuang.pojo.Dog"/>
<bean id="cat1" class="com.kuang.pojo.Cat"/>
<bean id="cat2" class="com.kuang.pojo.Cat"/>
<bean id="user" class="com.kuang.pojo.User"/>
總結:@Autowired, @Qualifier, @Resource這三個註解寫在類的屬性上(引用類),注入bean時無需再用<property>標籤
3.2 對類進行註解(代替<bean>標籤)
配置掃描哪些包下的註解
<context:component-scan base-package="com.jyy.pojo"/>
@Component 對類進行配置
@Component("user")
// 相當於配置文件中 <bean id="user" class="當前註解的類"/>
public class User {
public String name = "張三";
}
@Component等價於以下三種,
@Controller:web層
@Service:service層
@Repository:dao層
3.3 對類中的基本類型註解(代替<property value>標籤)
(1)如果不用set方法,直接在屬性上加註解
@Component("user")
public class User {
@Value("張三")
public String name;
}
(2)如果提供了set方法,在set方法上加註解
@Component("user")
public class User {
public String name;
@Value("張三")
public void setName(String name) {
this.name = name;
}
}
3.4 聲明週期
直接在類上加@Scope註解
@Controller("user")
@Scope("prototype")
public class User {
@Value("張三")
public String name;
}
3.5 < context:annotation-config / > 和 < context:component-scan / >區別
<context:annotation-config>:給類中屬性賦值(@Autowired) ,但仍然需要在xml中配置bean,把類手動加到容器中。
< context:component-scan / >:<context:annotation-config> + 自動把掃描出的類加入容器(@Component)
Reference:
狂神說公衆號:https://www.bilibili.com/video/BV1WE411d7Dv
概述及IOC理論推導: https://mp.weixin.qq.com/s/VM6INdNB_hNfXCMq3UZgTQ
快速上手Spring: https://mp.weixin.qq.com/s/Sa39ulmHpNFJ9u48rwCG7A
依賴注入(DI): https://mp.weixin.qq.com/s/Nf-cYENenoZpXqDjv574ig
自動裝配: https://mp.weixin.qq.com/s/kvp_3Uva1J2Q5ZVqCUzEsA
使用註解開發: https://mp.weixin.qq.com/s/dCeQwaQ-A97FiUxs7INlHw