# 常见 Bean 后处理器

# 常见 BeanPostProcessor 使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class A04Application {
public static void main(String[] args) {
//GenericApplicationContext是一个干净的容器, 同时有比DefaultListableApplicationContext方便
// 添加并使用beanFactoryPostProcessor与BeanPostProcessor都有镶银的方法
GenericApplicationContext context = new GenericApplicationContext();

//用原始方法注册三个Bean
context.registerBean("bean1", Bean1.class);
context.registerBean("bean2", Bean2.class);
context.registerBean("bean3", Bean3.class);
//注册Bean4, 探究@ConfiurationProperties注解
context.registerBean("bean4", Bean4.class);

//添加配合@Autowired实现@Value注入的解析器
context.getDefaultListableBeanFactory().setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
//添加处理Autowired注解的后处理器
context.registerBean(AutowiredAnnotationBeanPostProcessor.class);
//添加处理@Resource @PostConstruct @PreDestroy注解的后处理器
context.registerBean(CommonAnnotationBeanPostProcessor.class);

//添加处理@ConfiurationProperties注解的相关bean
ConfigurationPropertiesBindingPostProcessor.register(context.getDefaultListableBeanFactory());

//执行beanFactory后处理器, 添加bean后处理器, 初始化所有单例
context.refresh();

//获取bean4
System.out.println(context.getBean(Bean4.class));

context.close();
}
}

# @Autowired bean 后处理器执行分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
public class DigInAutowired {
public static void main(String[] args) throws Throwable {
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();

//图方便可以直接使用registerSingleton创建单例, 不用先创建BeanDefinition, 然后再添加BeanDefinition了
//但是该方法参数为对象(成品bean), 就不会再走依赖注入初始化那些步骤了
beanFactory.registerSingleton("bean2", new Bean2());
beanFactory.registerSingleton("bean3", new Bean3());

//添加@Value支持
beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
//添加${}解析器
beanFactory.addEmbeddedValueResolver(new StandardEnvironment()::resolvePlaceholders);

//创建Autowired后处理器对象, 并尝试直接自己调用
AutowiredAnnotationBeanPostProcessor processor = new AutowiredAnnotationBeanPostProcessor();
processor.setBeanFactory(beanFactory);

Bean1 bean1 = new Bean1();
System.out.println(bean1);

//执行依赖注入
processor.postProcessProperties(null, bean1, "bean1");

//对postProcessProperties方法进行分解, 通过反射一步一步来进行postProcessProperties中的方法
Method findAutowiringMetadata = AutowiredAnnotationBeanPostProcessor.class.getDeclaredMethod("findAutowiringMetadata", String.class, Class.class, PropertyValues.class);
findAutowiringMetadata.setAccessible(true);
//获取Bean1上添加了@Value, @Autowired的成员变量和方法参数
InjectionMetadata metadata = (InjectionMetadata) findAutowiringMetadata.invoke(processor, "bean1", Bean1.class, null);
System.out.println(metadata);

//调用metadata的inject()方法实现依赖注入
metadata.inject(bean1, "bean1", null);

System.out.println(bean1);

//按类型查找值
//@Autowired属性
Field bean3 = Bean1.class.getDeclaredField("bean3");
DependencyDescriptor descriptor = new DependencyDescriptor(bean3, false);
Object o = beanFactory.doResolveDependency(descriptor, null, null, null);
System.out.println(o);

//@Autowired方法
Method setBean2 = Bean1.class.getDeclaredMethod("setBean2", Bean2.class);
DependencyDescriptor descriptor1 = new DependencyDescriptor(
new MethodParameter(setBean2, 0),
false
);
Object o1 = beanFactory.doResolveDependency(descriptor1, null, null, null);
System.out.println(o1);

//@Autowired @Value
Method setHome = Bean1.class.getDeclaredMethod("setHome", String.class);
DependencyDescriptor descriptor2 = new DependencyDescriptor(
new MethodParameter(setHome, 0),
false
);
Object o2 = beanFactory.doResolveDependency(descriptor2, null, null, null);
System.out.println(o2);
}
}