介绍
这篇文章主要介绍春天BPP中怎样创建动态代理Bean,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
<强> v一前言
强>
本文章所讲并没有基于Aspectj,而是直接通过Cglib以及ProxyFactoryBean去创建代理Bean。通过下面的例子,可以看出Cglib方式创建的代理Bean和ProxyFactoryBean创建的代理Bean的区别。
<强> v二,基本测试代码强>
测试实体类,在BPP中创建BppTestDepBean类型的代理Bean。
@ component public static  class BppTestBean  { ,@ autowired ,private BppTestDepBean  depBean; ,public void  test1 (), { depBean.testDep才能(); ,} ,public void  test2 (), { depBean.testDep才能(); ,} ,@TestMethod ,public void  test3 (), { depBean.testDep才能(); ,} } @ component public static  class BppTestDepBean  { ,public void  testDep (), { System.out.println才能(“HEHE"); ,} } @Target (ElementType.METHOD) @Retention (RetentionPolicy.RUNTIME) @Documented public @interface  TestMethod { }
测试类
@RunWith (SpringRunner.class) @SpringBootTest public class  BppTest { ,@ autowired ,private BppTestBean  bppTestBean; ,@Test ,public void 测试(),{ bppTestBean.test1才能(); bppTestBean.test2才能(); bppTestBean.test3才能(); ,} }
<强> v三,使用Cglib创建代理Bean 强>
public class ProxyBpp1 implements BeanPostProcessor { ,private static  final Logger  Logger =, LoggerFactory.getLogger (ProxyBpp1.class); ,@Override ,public Object  postProcessBeforeInitialization (Object bean, String beanName), throws BeansException { if 才能;(bean instanceof  BppTestBean), { ,,Enhancer Enhancer =, new 增强剂(); ,,enhancer.setSuperclass (bean.getClass ()); ,,//标识Spring-generated 代理 ,,enhancer.setInterfaces (new 类[]{SpringProxy.class}); ,,//设置增强 ,,enhancer.setCallback ((MethodInterceptor),(目标,方法,参数,,methodProxy),→, { ,,,if (“test1" .equals (method.getName ())), { ,,,,LOGGER.info (“ProxyBpp1 开始执行…“); ,,,,Object result =, methodProxy.invokeSuper(目标,,args); ,,,,LOGGER.info (“ProxyBpp1 结束执行…“); ,,,,return 结果; ,,,} ,,,return method.invoke(目标,,args); ,,}); ,,return enhancer.create (); ,,} return 才能;豆; ,} }
主要是代理BppTestBean test1的方法,其实这种方式创建的代理Bean使用问题的,@ autowired字段没有注入进来,所以会有出现肺水肿。<代码> methodProxy。invokeSuper(目标,args)> 代码,这一行代码是有问题的,圆盾是代理类对象,而真实的对象是<代码> postProcessBeforeInitialization(对象bean,字符串beanName) 代码>中bean的对象,此bean时对象@ autowired字段已经注入了。所以可以将<代码> methodProxy。invokeSuper(目标,args) 代码>修改为<代码>方法。代码调用bean (args) >解决无法注入@ autowired字段的问题。
<强> v四,使用ProxyFactoryBean创建代理bean 强>
public class ProxyBpp2 implements BeanPostProcessor { ,private static  final Logger  Logger =, LoggerFactory.getLogger (ProxyBpp2.class); ,@Override ,public Object  postProcessBeforeInitialization (Object bean, String beanName), throws BeansException { if 才能;(bean instanceof  BppTestBean), { ,,ProxyFactoryBean pfb =, new ProxyFactoryBean (); ,,pfb.setTarget (bean); ,,pfb.setAutodetectInterfaces(假); ,,NameMatchMethodPointcutAdvisor advisor =, new NameMatchMethodPointcutAdvisor (); ,,advisor.addMethodName (“test1"); ,,advisor.setAdvice ((MethodInterceptor), invocation →, { ,,,LOGGER.info (“ProxyBpp2 开始执行…“); ,,,Object result =, invocation.getMethod () .invoke (invocation.getThis (),, invocation.getArguments ()); ,,,LOGGER.info (“ProxyBpp2 结束执行…“); ,,,return 结果; ,,}); ,,pfb.addAdvisor(顾问); ,,return pfb.getObject (); ,,} return 才能;豆; ,} null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null春天BPP中怎样创建动态代理Bean