Spring IOC的注入
阿新 • • 發佈:2018-12-12
大型的專案更多的是面向介面程式設計,依賴沒有實現,比如支付的實現,多個支付方式定義了不同介面,依賴的不是具體的實現,而是依賴介面,如果通過
ew例項化,比較固定,程式碼維護難度大,改成外部傳入,傳入的時候動態改變實現
面向介面程式設計:通過模組的劃分,出現大量介面。設計介面,其他模組通過實現介面,實現模組之間的相互呼叫
IOC的注入方式:
1.set注入:
name屬性名 ref:引用的某個bean的id標識
<!-- set注入--> <bean id="userService" class="com.sxt.service.UserService"> <property name="userDao" ref="userDao"></property> <property name="flag" value="false"></property> <property name="host" value="110110110"></property> <property name="port" value="8888"></property> </bean> <bean id="userDao" class="com.sxt.dao.UserDao"></bean>
//set注入
@Test
public void test04(){
UserService userService = null;
BeanFactory factory = new ClassPathXmlApplicationContext("spring04.xml");
userService = (UserService) factory.getBean("userService");
userService.test();
}
package com.sxt.service; import com.sxt.dao.UserDao; public class UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public UserService() { } private String host; private Integer port; private Boolean flag; public void setHost(String host) { this.host = host; } public void setPort(Integer port) { this.port = port; } public void setFlag(Boolean flag) { this.flag = flag; } public UserService(String host) { this.host = host; } public void test(){ userDao.test(); System.out.println("UserService.test..."+ host+"---"+"port"+flag); } }
package com.sxt.dao;
public class UserDao {
public void test(){
System.out.println("UserDao.test...");
}
}
第二種:構造器注入的方式
package com.sxt.service; import com.sxt.dao.AccountDao; import com.sxt.dao.UserDao; public class UserService02 { private UserDao userDao; private AccountDao accountDao; private String host; private Integer port; public UserService02(UserDao userDao, AccountDao accountDao, String host, Integer port) { this.userDao = userDao; this.accountDao = accountDao; this.host = host; this.port = port; } public void test(){ userDao.test(); accountDao.test(); System.out.println("UserService.test..."+host+"--"+port); } }
建立物件時的直接根據name值
<?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">
<!-- set注入-->
<bean id="userService02" class="com.sxt.service.UserService02">
<constructor-arg name="userDao" ref="userDao"></constructor-arg>
<constructor-arg name="accountDao" ref="accountDao"></constructor-arg>
<constructor-arg name="host" value="15252"></constructor-arg>
<constructor-arg name="port" value="8888"></constructor-arg>
</bean>
<bean id="userDao" class="com.sxt.dao.UserDao"></bean>
<bean id="accountDao" class="com.sxt.dao.AccountDao"></bean>
</beans>
建立物件時的索引
<bean id="userService02" class="com.sxt.service.UserService02">
<constructor-arg name="userDao" ref="userDao"></constructor-arg>
<constructor-arg name="accountDao" ref="accountDao"></constructor-arg>
<constructor-arg name="host" value="15252"></constructor-arg>
<constructor-arg name="port" value="8888"></constructor-arg>
</bean>
<bean id="userDao" class="com.sxt.dao.UserDao"></bean>
<bean id="accountDao" class="com.sxt.dao.AccountDao"></bean>
//構造器注入
@Test
public void test05(){
UserService02 userService = null;
BeanFactory factory = new ClassPathXmlApplicationContext("spring05.xml");
userService = (UserService02) factory.getBean("userService02");
userService.test();
}
注意:通過構造器會出現迴圈引用
@Test
public void test07(){
UserService03 userService = null;
BeanFactory factory = new ClassPathXmlApplicationContext("spring07.xml");
userService = (UserService03) factory.getBean("userService03");
System.out.println(userService);
}
<bean id="userService03" class="com.sxt.service.UserService03">
<constructor-arg name="accountService" ref="accountService"></constructor-arg>
</bean>
<bean id="accountService" class="com.sxt.service.AccountService">
<constructor-arg name="userService03" ref="userService03"></constructor-arg>
</bean>
package com.sxt.service;
public class AccountService {
private UserService03 userService03;
public void setUserService03(UserService03 userService03) {
this.userService03 = userService03;
}
}
package com.sxt.service;
import com.sxt.dao.AccountDao;
import com.sxt.dao.UserDao;
public class UserService03 {
private AccountService accountService;
public void setAccountService(AccountService accountService) {
this.accountService = accountService;
}
}
而set注入的方式,先初始化再注入,構造器注入,在配置流程上,bean中constructor-arg
可能出現迴圈引用的過程,互相等待