准备Bean
@Data
public class Bean1 {
private Bean2 bean2;
private Bean3 bean3;
private String home;
@Autowired
public void setBean2(Bean2 bean2) {
System.err.println("@Autowired生效 -> " + bean2);
this.bean2 = bean2;
}
@Resource
public void setBean3(Bean3 bean3) {
System.err.println("@Resource生效 -> " + bean3);
this.bean3 = bean3;
}
@Autowired
public void setHome(@Value("${JAVA_HOME}") String home) {
System.err.println("@Autowired @Value生效 -> " + home);
this.home = home;
}
@PostConstruct
public void init() {
System.err.println("@PostConstruct生效");
}
@PreDestroy
public void destroy() {
System.err.println("@PreDestroy生效");
}
}
public class Bean2 {
}
public class Bean3 {
}
@Data
@ConfigurationProperties(prefix = "java")
public class Bean4 {
private String home;
private String version;
}
常见的BeanPostProcessor
GenericApplicationContext genericApplicationContext = new GenericApplicationContext();
genericApplicationContext.registerBean("bean1", Bean1.class);
genericApplicationContext.registerBean("bean2", Bean2.class);
genericApplicationContext.registerBean("bean3", Bean3.class);
genericApplicationContext.registerBean("bean4", Bean4.class);
genericApplicationContext.getDefaultListableBeanFactory().setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
genericApplicationContext.registerBean(AutowiredAnnotationBeanPostProcessor.class);
genericApplicationContext.registerBean(CommonAnnotationBeanPostProcessor.class);
ConfigurationPropertiesBindingPostProcessor.register(genericApplicationContext.getDefaultListableBeanFactory());
genericApplicationContext.refresh();
System.err.println(genericApplicationContext.getBean(Bean4.class));
genericApplicationContext.close();
AutowiredAnnotationBeanPostProcessor
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
beanFactory.registerSingleton("bean2", new Bean2());
beanFactory.registerSingleton("bean3", new Bean3());
beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
beanFactory.addEmbeddedValueResolver(new StandardEnvironment()::resolvePlaceholders);
AutowiredAnnotationBeanPostProcessor autowiredAnnotationBeanPostProcessor = new AutowiredAnnotationBeanPostProcessor();
autowiredAnnotationBeanPostProcessor.setBeanFactory(beanFactory);
Bean1 bean1 = new Bean1();
System.err.println("处理之前:" + bean1);
Method findAutowiringMetadata = AutowiredAnnotationBeanPostProcessor.class.getDeclaredMethod("findAutowiringMetadata", String.class, Class.class, PropertyValues.class);
findAutowiringMetadata.setAccessible(true);
InjectionMetadata metadata = (InjectionMetadata) findAutowiringMetadata.invoke(autowiredAnnotationBeanPostProcessor, null, Bean1.class, null);
metadata.inject(bean1, null, null);
System.err.println("处理之后:" + bean1);
Field bean3Field = Bean1.class.getDeclaredField("bean3");
DependencyDescriptor bean3DD = new DependencyDescriptor(bean3Field, false);
Object bean3 = beanFactory.doResolveDependency(bean3DD, null, null, null);
System.out.println(bean3);
Method setBean2Method = Bean1.class.getDeclaredMethod("setBean2", Bean2.class);
DependencyDescriptor setBean2MethodDD = new DependencyDescriptor(new MethodParameter(setBean2Method, 0), false);
Object bean2 = beanFactory.doResolveDependency(setBean2MethodDD, null, null, null);
System.out.println(bean2);
Method setHomeMethod = Bean1.class.getDeclaredMethod("setHome", String.class);
DependencyDescriptor setHomeMethodDD = new DependencyDescriptor(new MethodParameter(setHomeMethod, 0), false);
Object home = beanFactory.doResolveDependency(setHomeMethodDD, null, null, null);
System.out.println(home);