文章目录
基础知识
需要看源码理解
入口 - DefaultListableBeanFactory#resolveDependency
依赖描述符 - DependencyDescriptor
自定绑定候选对象处理器 - AutowireCandidateResolver
public class AnnotationDependencyInjectionResolutionDemo {
@Autowired // 依赖查找(处理) + 延迟
@Lazy
private User lazyUser;
// DependencyDescriptor ->
// 必须(required=true)
// 实时注入(eager=true)
// 通过类型(User.class)
// 字段名称("user")
// 是否首要(primary = true)
@Autowired // 依赖查找(处理)
private User user;
@Autowired // 集合类型依赖注入
private Map<String, User> users; // user superUser
@MyAutowired
private Optional<User> userOptional; // superUser
@Inject
private User injectedUser;
@InjectedUser
private User myInjectedUser;
// @Bean(name = AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)
// public static AutowiredAnnotationBeanPostProcessor beanPostProcessor() {
// AutowiredAnnotationBeanPostProcessor beanPostProcessor = new AutowiredAnnotationBeanPostProcessor();
// // @Autowired + @Inject + 新注解 @InjectedUser
// Set<Class<? extends Annotation>> autowiredAnnotationTypes =
// new LinkedHashSet<>(asList(Autowired.class, Inject.class, InjectedUser.class));
// beanPostProcessor.setAutowiredAnnotationTypes(autowiredAnnotationTypes);
// return beanPostProcessor;
// }
@Bean
@Order(Ordered.LOWEST_PRECEDENCE - 3)
@Scope
public static AutowiredAnnotationBeanPostProcessor beanPostProcessor() {
AutowiredAnnotationBeanPostProcessor beanPostProcessor = new AutowiredAnnotationBeanPostProcessor();
beanPostProcessor.setAutowiredAnnotationType(InjectedUser.class);
return beanPostProcessor;
}
public static void main(String[] args) {
// 创建 BeanFactory 容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
// 注册 Configuration Class(配置类) -> Spring Bean
applicationContext.register(AnnotationDependencyInjectionResolutionDemo.class);
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(applicationContext);
String xmlResourcePath = "classpath:/META-INF/dependency-lookup-context.xml";
// 加载 XML 资源,解析并且生成 BeanDefinition
beanDefinitionReader.loadBeanDefinitions(xmlResourcePath);
// 启动 Spring 应用上下文
applicationContext.refresh();
// 依赖查找 QualifierAnnotationDependencyInjectionDemo Bean
AnnotationDependencyInjectionResolutionDemo demo = applicationContext.getBean(AnnotationDependencyInjectionResolutionDemo.class);
// 期待输出 superUser Bean
System.out.println("demo.user = " + demo.user);
System.out.println("demo.injectedUser = " + demo.injectedUser);
// 期待输出 user superUser
System.out.println("demo.users = " + demo.users);
// 期待输出 superUser Bean
System.out.println("demo.userOptional = " + demo.userOptional);
// 期待输出 superUser Bean
System.out.println("demo.myInjectedUser = " + demo.myInjectedUser);
// 显示地关闭 Spring 应用上下文
applicationContext.close();
}
}
版权声明:本文为qq_41196535原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。