Spring中AutowireMode(自動裝配模型)


主要包含如下幾種類型:

//不自動注入
AbstractBeanDefinition.AUTOWIRE_NO
//根據類型自動裝配(但是這個類型是根據set***方法進行裝配的)
AbstractBeanDefinition.AUTOWIRE_BY_TYPE
//根據名稱自動裝配
AbstractBeanDefinition.AUTOWIRE_BY_NAME
//根據構造函數自動裝配
AbstractBeanDefinition.AUTOWIRE_CONSTRUCTOR

默認為AUTOWIRE_NO

 

如下示例可以證明:

 

定義了兩個測試類:

@Repository
public class UserDao1 {
    private BookDao1 bookDao1;


    public BookDao1 getBookDao1() {
        return bookDao1;
    }


    public void setBookDao1(BookDao1 bookDao1) {
        System.out.println("setBookDao1.......");
        this.bookDao1 = bookDao1;
    }
}


@Repository
public class BookDao1 {

配置類:

@Configuration
@ComponentScan("com.tian")
public class AppConfig {


}

測試發現,最終BookDao1並沒有自動注入:

@Test
public void test_auto(){
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
    System.out.println(context.getBean(UserDao1.class).getBookDao1());
}

可以通過修改spring自動注入模型進行調整,擴展ImportBeanDefinitionRegistrar:

public class MyImportRegistrar implements ImportBeanDefinitionRegistrar {


    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        GenericBeanDefinition beanDefinition = (GenericBeanDefinition) registry.getBeanDefinition("userDao1");
        
//修改自動注入模型  
beanDefinition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
        registry.registerBeanDefinition("userDao1", beanDefinition);
    }
}

 

再次執行上面的測試發現BookDao1就會被自動注入了;當然這也說明了一個問題:AUTOWIRE_BY_TYPE是根據set屬性進行注入的;這個裝配模型中AUTOWIRE_BY_TYPE並不等於通常大家所說的@Autowired可以通過類型來找對應的類。

public void setBookDao1(BookDao1 bookDao1) {
}



參見:https://juejin.im/post/5d99fcc7e51d457822796ea1


免責聲明!

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



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