BeanDefinition
Spring容器在进行实例化时,会将xml配置的<bean>的信息封装成一个BeanDefinition对象,Spring根据BeanDefinition来创建Bean对象,里面有很多的属性用来描述Bean
BeanDefinition 中几个重要方法如下
- beanClassName:bean 的类名
- initMethodName:初始化方法名称
- properryValues:bean 的属性值
- scope:作用域
- lazyInit:延迟初始化
第一步 拥有 BeanDefinition 后,首先就是通过反射调用构造函数,实例化当前Bean对象
第二部 对一些 @Autowire 或 @Value 属性进行依赖注入
第三步 如果这个Bean实现了 Aware 接口,那就要重写接口里面的方法,比较常见的Aware接口有如下三个
第四步 Bean的后置处理器,用来增强Bean的功能,在Bean的初始化之前执行
第五步 初始化方法,其中的 InitializingBean 也是个接口,如果Bean实现了这个接口,那么也需要重写接口的方法
第六步 也是Bean的后置处理器,在Bean的初始化之后执行,比如AOP,AOP的底层就是动态代理
第六步结束后,我们就能从容器中获取Bean进行使用了,使用结束后,关闭容器,Bean就会销毁
从上面可以看出,Bean的创建和初始化赋值是分开的
下面编写一个类,更直观来展示Bean的生命周期
先定义一个Bean
@Component
public class User implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean {
//构造函数
public User() {
System.out.println("User的构造方法执行了.........");
}
private String name ;
//依赖注入
@Value("张三")
public void setName(String name) {
System.out.println("setName方法执行了.........");
}
//BeanNameAware接口
@Override
public void setBeanName(String name) {
System.out.println("setBeanName方法执行了.........");
}
//BeanFactoryAware接口
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("setBeanFactory方法执行了.........");
}
//ApplicationContextAware接口
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("setApplicationContext方法执行了........");
}
//自定义init
@PostConstruct
public void init() {
System.out.println("init方法执行了.................");
}
//InitializingBean接口
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet方法执行了........");
}
@PreDestroy
public void destory() {
System.out.println("destory方法执行了...............");
}
}
额外定义一个类,用来实现 Bean 的后置处理
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (beanName.equals("user")) {
System.out.println("postProcessBeforeInitialization方法执行了->user对象初始化方法前开始增强....");
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (beanName.equals("user")) {
System.out.println("postProcessAfterInitialization->user对象初始化方法后开始增强....");
//cglib代理对象
Enhancer enhancer = new Enhancer();
//设置需要增强的类
enhancer.setSuperclass(bean.getClass());
//执行回调方法,增强方法
enhancer.setCallback(new InvocationHandler() {
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
//执行目标方法
return method.invoke(method,objects);
}
});
//创建代理对象
return enhancer.create();
}
return bean;
}
}
最后,编写一个测试类并运行
public class UserTest {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
User user = ctx.getBean(User.class);
System.out.println(user);
}
}
输出结果如下