初始化在spring容器中,不只是完成bean对象的创建,还需要能够对bean进行初始化 。需要创建InitializingBean接口类 。
public interface InitializingBean { public void afterPropertiesSet();}在需要进行初始化的bean对象去实现这个接口的方法 , 这里main可以进行一些操作 。在createBean中 , 会根据判断是否有InitializingBean类,会在实例化之后调用这个方法进行初始化 。
// 5 初始化if (instance instanceof InitializingBean) { ((InitializingBean)instance).afterPropertiesSet();}结果
文章插图
BeanPostProcessorBeanPostProcessor可以对spring中bean的创建去做一些操作 。
BeanPostProcessor接口在spring中定义一个BeanPostProcessor接口,里面会有初始化前后操作的方法,并且将beanName和bean对象带入进行自定义的操作 。
public interface BeanPostProcessor { public Object postBeforeProcessor(String beanName, Object bean); // 初始化前 public Object postAfterProcessor(String beanName, Object bean); // 初始化后}自定义BeanPostProcessor这里可以定义自己的类去实现spring中的BeanPostProcessor,对初始化进行一些相应操作 。并且能够根据某个bean对象来做不同的操作 。原理就是将MyBeanPostProcessor注入到容器中,在扫描的时候将这个对象保存起来,在创建bean的时候去遍历BeanPostProcessor集合,在去调用这个实例的方法 。
@Component // 需要注入springpublic class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postBeforeProcessor(String beanName, Object bean) { System.out.println("初始化前的bean:" + beanName + " -- " + bean); return bean; } @Override public Object postAfterProcessor(String beanName, Object bean) { System.out.println("初始化后的bean:" + beanName + " -- " + bean); return bean; }}然而 , 在spring扫描的时候会进行操作,因为自己实现的BeanPostProcessor是通过Component注解注入spring容器的 。因此可以通过判断有Component注解时候,进行判断是否含有BeanPostProcessor类 , 如果有生成BeanPostProcessor对象,并且将其实例添加到beanPostProcessorList容器中 。在此就需要定义ArrayList<BeanPostProcessor> beanPostProcessorList = new ArrayList<>();来记录BeanPostProcessor 。
// 6 判断是否是并加入beanPostProcessorList,这里不能使用instanceofif (BeanPostProcessor.class.isAssignableFrom(clazz)) { // 直接生成对象 BeanPostProcessor instance = (BeanPostProcessor) clazz.newInstance(); // 然后保存进去 beanPostProcessorList.add(instance);}接着就可以在创建bean对象的时候,在初始化前后去遍历这个BeanPostProcessor链表,调用相应的方法,就能够调用自定义的MyBeanPostProcessor的方法 。
// 6 BeanPostProcessor 初始化前 AOP 遍历beanPostProcessorListfor (BeanPostProcessor beanPostProcessor : beanPostProcessorList) { instance = beanPostProcessor.postBeforeProcessor(beanName, instance);}// 5 初始化if (instance instanceof InitializingBean) { ((InitializingBean)instance).afterPropertiesSet();}// 6 BeanPostProcessor 初始化后 AOPfor (BeanPostProcessor beanPostProcessor : beanPostProcessorList) { instance = beanPostProcessor.postAfterProcessor(beanName, instance);}运行结果:.
文章插图
AOP机制需要通过代理对象 。这样如果不进行操作,返回的对象还是原来的 , 如果是通过操作了,那么返回的就是代理的对象 。这里就简单的打印一句话 。在扫描的时候,扫到userService这个bean的时候,返回的实例就是代理对象 。
推荐阅读
- 【ASP.NET Core】MVC控制器的各种自定义:应用程序约定的接口与模型
- 基础版 【网络】内网穿透方案&FRP内网穿透实战
- FGO日服七周年礼装自选哪个好
- 蚂蚁庄园今日答题答案是什么
- iqooneo5是什么屏幕_iqooneo5屏幕尺寸参数
- 原神如何去雷神的岛屿(原神如何上雷神岛)
- 一次SpringBoot版本升级,引发的血案
- 中 学习ASP.NET Core Blazor编程系列十——路由
- 小米11和vivox60哪个好_小米11和vivox60参数对比
- 苹果13mini屏幕多大尺寸_苹果13mini屏幕尺寸