春天BPP中怎样创建动态代理Bean

  介绍

这篇文章主要介绍春天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