Spring高级-容器实现-BeanFactory后处理器排序(二)
一、@Autowired 和 @Resource(name = "bean4") 同时存在,会优先注入哪个bean?
1、代码
package com.mangoubiubiu.show; import lombok.extern.slf4j.Slf4j; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.context.annotation.AnnotationConfigUtils; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.Ordered; import javax.annotation.Resource; import java.util.logging.Logger; public class TestBeanFactory { public static void main(String[] args) { DefaultListableBeanFactory beanFactory=new DefaultListableBeanFactory(); //bean 的定义 (class ,scope , 初始化 ,销毁方法) AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(Config.class).setScope("singleton").getBeanDefinition(); beanFactory.registerBeanDefinition("config",beanDefinition); //给 BeanFactory 添加一些常用的后处理器 AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory); //BeanFactory 后处理器主要功能,补充了一些bean的定义 beanFactory.getBeansOfType(BeanFactoryPostProcessor.class).values().stream() .forEach(beanFactoryPostProcessor -> { beanFactoryPostProcessor.postProcessBeanFactory(beanFactory); }); //Bean后处理器,针对 bean 的生命周期的各个阶段提供扩展,例如@Autowired @Resource // beanFactory.getBeansOfType(BeanPostProcessor.class).values().forEach(beanFactory::addBeanPostProcessor); beanFactory.getBeansOfType(BeanPostProcessor.class).values().stream() .forEach(beanPostProcessor -> { System.out.println(">>>>>>>>"+beanPostProcessor); beanFactory.addBeanPostProcessor(beanPostProcessor);//建立bean工厂与后处理器之间的联系 }); for(String name : beanFactory.getBeanDefinitionNames()){ System.out.println(name); } beanFactory.preInstantiateSingletons();//准备好所有的单列对象 System.out.println("----------------->"); Bean1 bean = beanFactory.getBean(Bean1.class); System.out.println("----------------->"); System.out.println("-Inner注入的对象为--->"+bean.getInner()); System.out.println("ORDER"+ (Ordered.LOWEST_PRECEDENCE-3)); System.out.println("ORDER"+ (Ordered.LOWEST_PRECEDENCE-2)); /** * 学到了什么: * a. beanFactory 不会做的事 * 1 。不会主动调用BeanFactory 后处理器 * 2. 不会主动添加Bean后处理器 * 3. 不会主动初始化单列 * 4. 不会解析beanFactory 还不会解析 ${} 与 #{} * * b. bean 后处理器会有排序逻辑 */ } @Configuration static class Config{ @Bean public Bean1 bean1(){ return new Bean1(); } @Bean public Bean2 bean2(){ return new Bean2(); } @Bean public Bean3 bean3(){ return new Bean3(); } @Bean public Bean4 bean4(){ return new Bean4(); } } interface Inner{ } static class Bean3 implements Inner{} static class Bean4 implements Inner{} @Slf4j static class Bean1 { public Bean1(){ log.info("构造 Bean1"); } @Autowired private Bean2 bean2; public Bean2 getBean2(){ return bean2; } @Autowired @Resource(name = "bean4") private Inner bean3; public Inner getInner(){ return bean3; } } @Slf4j static class Bean2{ public Bean2(){ log.info("构造 Bean2"); } } }
2、加入排序器
//Bean后处理器,针对 bean 的生命周期的各个阶段提供扩展,例如@Autowired @Resource // beanFactory.getBeansOfType(BeanPostProcessor.class).values().forEach(beanFactory::addBeanPostProcessor); beanFactory.getBeansOfType(BeanPostProcessor.class).values().stream() .sorted(beanFactory.getDependencyComparator()) .forEach(beanPostProcessor -> { System.out.println(">>>>>>>>"+beanPostProcessor); beanFactory.addBeanPostProcessor(beanPostProcessor);//建立bean工厂与后处理器之间的联系 });
3、总结
//给 BeanFactory 添加一些常用的后处理器 AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory);
在给 BeanFactory 添加一些常用的后处理器时,AnnotationConfigUtils里会有方法设置比较器对象,
而XXXProcessorli里会有一个 Order方法
值越小越在前
本文作者:KwFruit
本文链接:https://www.cnblogs.com/mangoubiubiu/p/16089604.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
Spring
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步