Spring 實(shí)例化 bean 的方式
- Set注入
- 構(gòu)造器注入
- 靜態(tài)工廠注入
- 實(shí)例化工廠注入
## 案例實(shí)操
#### Set注入
**xml配置(同時(shí)spring也提供了對(duì)于基本數(shù)據(jù)類(lèi)型的set注入方式)**
~~~ xml
<?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">
<bean id="userDao" class="com.xxx.demo.UserDao"></bean>
<!-- setter注入 -->
<bean id="userService" class="com.xxx.demo.UserService">
? ? ? ? <!--ref是對(duì)于外部bean對(duì)象引用熔任,與被引用的bean對(duì)象的id保持一致-->
<property name="userDao" ref="userDao"></property>
</bean>
</beans>
~~~
**UserDao.java**
~~~ java
public class UserDao {
public String userLogin() {
return "我是UserDao中的userLogin()的方法";
}
}
~~~
**UserService.java**
~~~ java
public class UserService {
? ? //一定要提供屬性的setter方法
private UserDao userDao;
public void userlogin() {
String res=userDao.userLogin();
System.out.println(res);
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
~~~
**App.java**
~~~ java
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-config.xml");
UserService userService=applicationContext.getBean("userService", UserService.class);
userService.userlogin();
}
}
~~~
#### 構(gòu)造器注入
**xml配置(也提供對(duì)于基本數(shù)據(jù)類(lèi)型姑食、字符串等值的注入)**
~~~ xml
<?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">
<bean id="userDao" class="com.xxx.demo.UserDao"></bean>
<!-- 構(gòu)造器注入 -->
<bean id="userServiceV2" class="com.xxx.demo.UserServiceV2">
<constructor-arg index="0" ref="userDao"></constructor-arg>
<constructor-arg index="1" value="印度三哥"></constructor-arg>
</bean>
</beans>
~~~
構(gòu)造器注入有三種形式:
index屬性為參數(shù)順序窍奋,如果只有一個(gè)參數(shù)index可以不設(shè)置。
name屬性根據(jù)構(gòu)造器中屬性的名字暖璧。
type屬性,是根據(jù)構(gòu)造器中屬性的類(lèi)型來(lái)匹配的君旦。如果相同類(lèi)型屬性不唯一澎办,注入的屬性按照順序注入進(jìn)來(lái)。
**UserServiceV2.java類(lèi)提供構(gòu)造函數(shù)**
~~~ java
/**
* 實(shí)現(xiàn)構(gòu)造器注入
* @author Best Liu
*
*/
public class UserServiceV2 {
private UserDao userDao;
private String name;
public void userlogin() {
String res=userDao.userLogin();
System.out.println(res);
System.out.println(name);
}
public UserServiceV2(UserDao userDao,String name) {
super();
this.userDao = userDao;
this.name = name;
}
}
~~~
#### 靜態(tài)工廠注入
**xml配置**
~~~ java
<?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">
<!-- 靜態(tài)工廠注入 -->
<bean id="userDao01" class="com.xxx.demo.StaticFactory" factory-method="createuserDao"></bean>
<bean id="userService01" class="com.xxx.demo.UserService">
<property name="userDao" ref="userDao01"></property>
</bean>
</beans>
~~~
**StaticFactory.java**
~~~ java
public class StaticFactory {
public static UserDao createuserDao(){
return new UserDao();
}
}
~~~
**UserService.java**
~~~ java
public class UserService {
private UserDao userDao;
public void userlogin() {
String res=userDao.userLogin();
System.out.println(res);
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
~~~
**tips:靜態(tài)工廠注入就是IoC靜態(tài)工廠和DI的setter注入金砍,將需要注入的屬性對(duì)象利用靜態(tài)工廠創(chuàng)建出來(lái).**
#### 2.4 實(shí)例化工廠
**xml配置**
~~~ xml
<?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">
<!-- 實(shí)例化工廠 -->
<bean id="instanceFactory" class="com.xxx.demo.InstanceFactory"></bean>
<bean id="userDao3" factory-bean="instanceFactory" factory-method="createUserDao"></bean>
<bean id="userService02" class="com.xxx.demo.UserService">
<property name="userDao" ref="userDao3"></property>
</bean>
</beans>
~~~
**InstanceFactory.java**
~~~ java
public class InstanceFactory {
public UserDao createUserDao(){
return new UserDao();
}
}
~~~
tips:重點(diǎn)掌握set局蚀,構(gòu)造器注入,工廠方式了解即可恕稠,實(shí)際開(kāi)發(fā)中基本使用set方式注入bean琅绅。
## 擴(kuò)展
### 循環(huán)依賴(lài)的問(wèn)題的產(chǎn)生
**Bean通過(guò)構(gòu)造器注入,之間彼此相互依賴(lài)對(duì)方導(dǎo)致bean無(wú)法實(shí)例化鹅巍。**
**注入的選擇:開(kāi)發(fā)項(xiàng)目中set方式注入首選**
使用構(gòu)造注入可以在構(gòu)建對(duì)象的同時(shí)一并完成依賴(lài)關(guān)系的建立千扶,對(duì)象一建立則所有的一切也就準(zhǔn)備好了,但如果要建立的對(duì)象關(guān)系很多骆捧,使用構(gòu)造注入會(huì)在構(gòu)建函數(shù)上留下一長(zhǎng)串的參數(shù)澎羞,且不易記憶,這時(shí)使用Set注入會(huì)是個(gè)不錯(cuò)的選擇敛苇。需要視頻配套資料或其他資料+我們小姐姐V lezijie007(加好友暗號(hào) 98 妆绞,不備注不加)
使用Set注入可以有明確的名稱(chēng),可以了解注入的對(duì)象會(huì)是什么枫攀,像setxxx()這樣的名稱(chēng)比記憶Constructor上某個(gè)參數(shù)的位置代表某個(gè)對(duì)象更好括饶。
**xml配置**
~~~ xml
<?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">
<bean id="goodsService" class="com.xxx.demo.GoodsService">
<!-- <constructor-arg index="0" ref="userService"></constructor-arg> -->
<property name="userService" ref="userService"></property>
</bean>
<bean id="userService" class="com.xxx.demo.UserService">
<!-- <constructor-arg index="0" ref="goodsService"></constructor-arg> -->
<property name="goodsService" ref="goodsService"></property>
</bean>
</beans>
~~~
**GoodsService.java**
~~~ java
public class GoodsService {
private UserService userService;
/*public GoodsService(UserService userService) {
super();
this.userService = userService;
}*/
public void setUserService(UserService userService) {
this.userService = userService;
}
}
~~~
**UserService.java**
~~~ java
public class UserService {
private GoodsService goodsService;
/* public UserService(GoodsService goodsService) {
super();
this.goodsService = goodsService;
}
*/
public void setGoodsService(GoodsService goodsService) {
this.goodsService = goodsService;
}
}
~~~