spring 循環依賴,構造函數注入與setter注入(屬性注入)有什么優劣,三種注入方式又有什么優劣


https://blog.csdn.net/u010853261/article/details/77940767

 

 

做了一些實踐:

 

一 注解方式注入時,循環依賴

@Component("ioca")              // 該句對IOCC的注入是必要的
@Qualifier("ioca2")             // 此句同樣有效
//@Component("iocaerror")       // 該句對IOCC的注入失敗
public class IOCA {

    /**
     * 這會造成循環依賴
     */
    // 循環依賴, Autowired非必須,spring會自己去找bean factory中類型為IOCB的bean
//    public IOCA(@Autowired IOCB iocb) {
//
//    }
}

 

@Component
public class IOCB {

    /**
     * 這會造成循環依賴
     */
    // 循環依賴,Autowired非必須,spring會自己去找bean factory中類型為IOCA的bean
//    public IOCB(@Autowired IOCA ioca) {
//
//    }
}

 

注意點:

1 構造函數中,Autowired注解不是必須的,spring會自己按類型去找

 

 

二 java bean方式注入時,循環依賴

@Configuration
@ImportResource("testspringxml.xml")
public class TestConfig {

    /**
     * 這會造成循環依賴,autowired非必須,spring會自己去找bean factory中類型為xxx的bean
     */
//    @Bean
//    public IOCA getA(@Autowired IOCB iocb) {
//        return new IOCA(null);
//    }
//
//    @Bean
//    public IOCB getB(@Autowired IOCA ioca) {
//        return new IOCB(null);
//    }

}

 

注意點:

1 本例中,請忽視Importresource注解,它用於案例三

2 autowired非必須

 

 

三 xml方式注入

 

@Component("ioca")              // 該句對IOCC的注入是必要的
@Qualifier("ioca2")             // 此句同樣有效
//@Component("iocaerror")       // 該句對IOCC的注入失敗
public class IOCA {

    /**
     * 這會造成循環依賴
     */
    // 循環依賴, Autowired非必須,spring會自己去找bean factory中類型為IOCB的bean
//    public IOCA(@Autowired IOCB iocb) {
//
//    }
}

 

<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="iocc" class="com.example.demo.ioc.IOCC">

    </bean>
</beans>

 

public class IOCC {

    /**
     * Autowired非必須,spring會自己去找bean factory中類型為IOCA,名稱為ioca的bean
     * 
     * 此處如果ioca3,或IOCA那邊注解使用iocaerror等進行注入,則會報錯
     * Parameter 0 of constructor in com.example.demo.ioc.IOCC required 
     * a bean of type 'com.example.demo.ioc.IOCA' that could not be found.
     * 
     */
    public IOCC(@Autowired @Qualifier("ioca") IOCA ioca) {

    }

    public void run() {
        System.out.println("被xml,importresource注入的ioc類運行");
    }
}

 

@Configuration
@ImportResource("testspringxml.xml")
public class TestConfig {

 

IOCC iocc = (IOCC)SpringContextUtil.getBean(IOCC.class);
		iocc.run();

 

注意點:

1 xml方式=@Configuration + @ImportResource + xml

bean方式=@Configuration+@bean

 

@Component("ioca")              // 該句對IOCC的注入是必要的
@Qualifier("ioca2") 

兩個注入名稱都有效

 

若使用

@Component("iocaerror") 

注入IOCA,或者不注入IOCA,

public IOCC(@Autowired @Qualifier("ioca") IOCA ioca)

此句將報錯,找不到bean(類型、名稱雙重尋找)

 

若使用

public IOCC(@Autowired @Qualifier("ioca3") IOCA ioca)

同樣會與3一樣報錯,因為類型、名稱雙重尋找

 

5

2020.2.18補充

@Configuration
//@ImportResource("testspringxml.xml")  跑testcase junit時提示找不到testspringxml.xml
@ImportResource("classpath:testspringxml.xml")
public class TestConfig {

 

 

 

既然有構造函數注入和setter注入(屬性注入)方式,各自有什么優劣

1 使用構造器注入的方法,可以明確成員變量的加載順序,用於成員變量inicialize相互依賴的情況

public class TestController {

        @Autowired

        private TestService testService;

        private String testname;

                 public TestController(){

                         this.testname = testService.getTestName();

                 }

 }

  

 

https://blog.csdn.net/uaucome/article/details/85259654

https://www.cnblogs.com/acm-bingzi/p/springAutowired.html

2 使用構造函數注入,會導致循環依賴,setter注入(屬性注入)不會

 

那么注解、java bean、xml三種注入方式有什么優劣

1 注解方式顯然,不能用於那種源文件不在手上的類

2 java bean方式和xml方式本質一樣,但java bean方式可在實例化注入時,提供更豐富的代碼級的修飾和擴展,比如——

注入一個別人寫的tcpClient,這個client在注入時,除了實例化並裝配進spring bean factory,還要實打實的建立一條tcp連接,這個過程如果對方代碼沒有封裝好,使用xml的方式是辦不到的,xml只能實例化裝配,不能建立連接;至於源文件在自己手上,隨便怎么搞

(1)java bean:

new

建立tcp連接

return 裝配完成

 

(2)xml:

new

裝配完成


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM