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接口@Overridepublic void setBeanName(String name) {System.out.println("setBeanName方法执行了.........");}//BeanFactoryAware接口@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("setBeanFactory方法执行了.........");}//ApplicationContextAware接口@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {System.out.println("setApplicationContext方法执行了........");}//自定义init@PostConstructpublic void init() {System.out.println("init方法执行了.................");}//InitializingBean接口@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("afterPropertiesSet方法执行了........");}@PreDestroypublic void destory() {System.out.println("destory方法执行了...............");}}
额外定义一个类,用来实现 Bean 的后置处理
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (beanName.equals("user")) {System.out.println("postProcessBeforeInitialization方法执行了->user对象初始化方法前开始增强....");}return bean;}@Overridepublic 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() {@Overridepublic 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);}}
输出结果如下