然而,在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的时候,返回的实例就是代理对象 。
@Overridepublic Object postAfterProcessor(String beanName, Object bean) { System.out.println("初始化后的bean:" + beanName + " -- " + bean); if (beanName.equals("userService")) { // 创建一个代理对象, 代理的是UserInterface这个 Object proxyInstance = Proxy.newProxyInstance(MyBeanPostProcessor.class.getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandler() { @Override /** * proxy:代理对象 * method:代理对象当前正在执行的方法 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("切面逻辑"); return method.invoke(bean, args); } }); return proxyInstance; } return bean;}
经验总结扩展阅读
- 冰的熔点是多少
- 【ASP.NET Core】MVC控制器的各种自定义:应用程序约定的接口与模型
- 基础版 【网络】内网穿透方案&FRP内网穿透实战
- 金线莲的吃法
- 2023年9月6日是疏通管道吉日吗 2023年9月6日适合疏通管道吗
- 半亩是多少
- 银耳可以泡一晚上再煮吗
- 熊猫便便有什么用
- 清除青苔最有效的方法
- 油是导体还是绝缘体