BeanDefinition
Spring容器在进行实例化时,会将xml配置的的信息封装成一个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); } }
输出结果如下