@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("BeanPostProcessor--->postProcessBeforeInitialization beanName: " + beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("BeanPostProcessor--->postProcessAfterInitialization beanName: " + beanName);
return bean;
}
}
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
System.out.println("BeanFactoryPostProcessor--->postProcessBeanFactory");
System.out.println("获取到的ConfigurableListableBeanFactory:"+configurableListableBeanFactory.getClass().getName());
BeanDefinition beandefinition = configurableListableBeanFactory.getBeanDefinition("userService");
System.out.println(beandefinition.getBeanClassName());
System.out.println(beandefinition.getScope());
// userService.setScope("prototype");
// System.out.println(userService.getScope());
}
}
@Service
public class UserService implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean {
@Override
public void setBeanName(String s) {
System.out.println("BeanNameAware--->setBeanName");
System.out.println("获取到的BeanName:"+s);
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("BeanFactoryAware--->setBeanFactory");
System.out.println("获取到的BeanFactory:"+beanFactory.getClass().getName());
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("ApplicationContextAware--->setApplicationContext");
System.out.println("获取到的ApplicationContext:"+applicationContext.getClass().getName());
}
@Override
public void afterPropertiesSet() {
System.out.println("InitializingBean--->afterPropertiesSet");
}
public void show() {
System.out.println("show方法执行了");
}
@PostConstruct
public void initMethod() {
System.out.println("@PostConstruct--->initMethod");
}
@PreDestroy
public void destroy() {
System.out.println("@PreDestroy--->destroy");
}
public UserService() {
System.out.println("UserService类的构造方法执行了");
}
}
@Configuration
@ComponentScan("com.liaoxiang")
public class AppConfig {
}
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = (UserService)context.getBean("userService");
context.close();
}
}
执行结果:
还有一些其他的点,多余单例的bean默认情况下是立即加载(创建对象实例),而对于多例的bean则是在用的时候才创建。如果对单例的bean使用了@Lazy
注解,那么对象的创建也将延迟到使用的时候才创建。如果其他类里面使用了注解注入当前类,那么当前类在容器启动的时候会被创建。
BeanFactoryPostProcessor
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
System.out.println("BeanFactoryPostProcessor--->postProcessBeanFactory");
System.out.println("获取到的ConfigurableListableBeanFactory:"+configurableListableBeanFactory.getClass().getName());
BeanDefinition beandefinition = configurableListableBeanFactory.getBeanDefinition("userService");
System.out.println(beandefinition.getBeanClassName());
System.out.println(beandefinition.getScope());
// userService.setScope("prototype");
// System.out.println(userService.getScope());
}
}
拿到BeanDefinition
可以做的操作如下