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
2
@Component("ioca") // 該句對IOCC的注入是必要的 @Qualifier("ioca2")
兩個注入名稱都有效
3
若使用
@Component("iocaerror")
注入IOCA,或者不注入IOCA,
public IOCC(@Autowired @Qualifier("ioca") IOCA ioca)
此句將報錯,找不到bean(類型、名稱雙重尋找)
4
若使用
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
裝配完成