ignoreDependencyType(Class<?> type);
ignoreDependencyType(Class<?> type);
- Ignore the given dependency type for autowiring:for example, String. Default is none.@param type the dependency type to ignore。
- 忽略自动织入的给定依赖类型:例如,String。默认值为none。@param type要忽略的依赖类型。
- 该方法的意思是当你在postProcessBeanFactory()方法中调用该方法设置一个主动被忽略的bean那么该bean将不再DI生效。
DI的实现方式有三种:
- 手动注入:xml的配置形式,你指定一个bean,然后再指定你要注入到这个bean的注入对象,这个就是完全的手动注入了。
- 半自动注入:@Autowrite注解,我们可以给被注入对象上打上@Component注解被加载到spring的容器中,然后通过@Autowrite注解来完成依赖注入,但是为什么说这个@Autowrite注解是半自动DI呢?原因是这个注解的寻找被注入对象的方式是通过Bean的名字在spring容器中寻找的,所以当被注入的bean是一个接口的时候就比较麻烦了,你肯定要指定一个该接口下一个实现子类才能完成注入,因为接口中是没有任何的实现逻辑的。但是话说到这个这个@Autowrite注解就完全不行了嘛,其实也不是啦,前面不是说过了嘛,他是通过bean在spring容器中的名字来完成DI的,所以你可以指定一个你想要被注入的子实现类的beanName来完成DI,虽然有点麻烦但还是可以完成DI的。ok,最后说一下为什么说@Autowrite注解的形式并不是自动注入,
- 首先来看A类
@Slf4j(topic = "e")
@Component
public class A {
@Autowrite
B b;
public void setB(B b) {
this.b = b;
}
public void printInfo() {
log.debug("bean-b:{}", b);
}
}
- 再看B类
@Component
public class B {}
- 我们现在B类上加上了@Autowrite注解表示该类为被注入的Bean,并且在B类上也有@Component注解,在spring完成bean的实例化装载后会将B类装载到spring容器中。
- 在BeanFactoryPostProcessorTest类中实现了BeanFactoryPostProcessor接口的中子实现方法postProcessBeanFactory()方法,设置所有自动注入属性如果是B则被忽略。
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
ScannedGenericBeanDefinition m = (ScannedGenericBeanDefinition) beanFactory.getBeanDefinition("m");
//设置所有自动注入属性如果是B则被忽略
beanFactory.ignoreDependencyType(B.class);
m.setBeanClass(M.class);
}
- 这个时候我们启动程序是不会有B类相关的内容被输出的,因为B类被忽略了。
- ok,为了证明@Autowrite注解并不是符合自动注入的含义,我们现在将A类中的代码改变一下,将B类上的@Autowrite注解去掉。
- 但是我们会在postProcessBeanFactory()方法中加入一个设置,设置当前的自动注入的模型。
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
ScannedGenericBeanDefinition m = (ScannedGenericBeanDefinition) beanFactory.getBeanDefinition("m");
//设置自动注入模型
m.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
m.setBeanClass(M.class);
}
- 我们会发现就算把@Autowrite注解去掉也还是会将B类注入进来,说明就算没有了你@Autowrite注解我依旧可以完成DI。原因是在构建A类的BeanDefinition的时候其实已经配置好了A类的模型,然后在B类上又有@Component注解所以B类在spring容器中是存在,由于我们之前在postProcessBeanFactory方法设置了自动注入的mode,所以B类自然就被注入到了A中,完成DI。
- 关于设置自动注入模型中的三个枚举类型,我们也可以看到spring官方推荐的这四种:
-
- 按照类型注入
- 按照名字注入
- 按照构造器注入
- 不注入
- 这其实也验证了之前我们的说法,springDI的实现 set constructo,这两种。
- 自动注入:结合上面所说在postProcessBeanFactory方法中设置自动注入模型,即使B类被去掉了@Autowrite注解也还是可以被DI到A类上,这才是真正的自动注入,DI!
转载自:https://juejin.cn/post/7383029376383123493