1. 程式人生 > >Spring IOC的注入

Spring IOC的注入

大型的專案更多的是面向介面程式設計,依賴沒有實現,比如支付的實現,多個支付方式定義了不同介面,依賴的不是具體的實現,而是依賴介面,如果通過

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

可能出現迴圈引用的過程,互相等待