likes
comments
collection
share

ignoreDependencyType(Class<?> type);

作者站长头像
站长
· 阅读数 33

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的实现方式有三种:

  1. 手动注入:xml的配置形式,你指定一个bean,然后再指定你要注入到这个bean的注入对象,这个就是完全的手动注入了。
  2. 半自动注入:@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,这两种。
  • ignoreDependencyType(Class<?> type);
  1. 自动注入:结合上面所说在postProcessBeanFactory方法中设置自动注入模型,即使B类被去掉了@Autowrite注解也还是可以被DI到A类上,这才是真正的自动注入,DI!
转载自:https://juejin.cn/post/7383029376383123493
评论
请登录