Fork me on GitHub

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
posted @ 2020-04-08 10:57  迁梦余光  阅读(1595)  评论(0编辑  收藏  举报