如何为spring代理类设置属性值

系统 1642 0

 

在问答频道 有朋友问 《如何为spring代理类设置属性值》  就写了个小工具 供使用。思想就不讲了。

现在有一个bean包含了私有属性,如下:

Java代码    收藏代码
  1. @Component   
  2. public   class  Bean {  
  3.     String name;  
  4.   
  5.      public  String getName() {  
  6.          return  name;  
  7.     }  
  8.   
  9.      public   void  setName(String name) {  
  10.          this .name = name;  
  11.     }  
  12.       
  13. }  

它被AOP配置过代理,代理配置为:

 

Java代码    收藏代码
  1. <aop:pointcut expression= "execution(* com..*Bean.*(..))"   
  2.             id= "txBean"  />  

 现在对它进行测试:

Java代码    收藏代码
  1. public   class  BeanTest  extends  SpringContextTestCase{  
  2.      @Autowired   
  3.      private  Bean bean;  
  4.      @Test   
  5.      public   void  testBean(){  
  6.         bean.setName( "dylan" );  
  7.         System.out.println(bean.name);  
  8.         System.out.println(bean.getName());  
  9.     }  
  10. }  

 这里的测试结果中,第一个输出为null,第二个输出为dylan,

由于项目中需要直接通过bean.name的方式来获取属性值,却一直都只能得到null,请问如何才能获取到我所期望的值"dylan"呢

 

 

默认是没有办法的。我帮你写了个AOP切面 帮你完成设置属性。 

Java代码    收藏代码
  1. import  java.beans.PropertyDescriptor;  
  2. import  java.lang.reflect.Field;  
  3. import  java.lang.reflect.Method;  
  4.   
  5. import  org.aspectj.lang.JoinPoint;  
  6. import  org.aspectj.lang.annotation.After;  
  7. import  org.aspectj.lang.annotation.Aspect;  
  8. import  org.springframework.aop.support.AopUtils;  
  9. import  org.springframework.beans.BeanUtils;  
  10. import  org.springframework.core.annotation.Order;  
  11.   
  12. @Aspect   
  13. @Order (Integer.MIN_VALUE)  
  14. public   class  SetterAspect {  
  15.       
  16.      @After (value= "execution(* *.set*(*)) && args(value)" , argNames= "value" )  
  17.      public   void  after(JoinPoint jp, Object value) {  
  18.         Object proxy = jp.getThis();  
  19.         Object target = jp.getTarget();  
  20.           
  21.          if (AopUtils.isAopProxy(proxy)) { //只有代理对象才需要处理   
  22.               
  23.              try  {  
  24.                 Class<?> proxyClass = proxy.getClass();  
  25.                 Class<?> targetClass = target.getClass();  
  26.                 String methodName = jp.getSignature().getName();  
  27.                   
  28.                 Method m = BeanUtils.findDeclaredMethod(proxyClass, methodName,  new  Class[]{value.getClass()});  
  29.                 PropertyDescriptor descriptor = BeanUtils.findPropertyForMethod(m);  
  30.                 String propName = descriptor.getName();  
  31.                   
  32.                 Field f = targetClass.getClass().getDeclaredField(propName);  
  33.                  if (f !=  null ) {  
  34.                     f.setAccessible( true );  
  35.                     f.set(proxy, value);  
  36.                 }  
  37.             }  catch  (Exception e) {  
  38.                 e.printStackTrace(); //记录好异常进行处理   
  39.             }  
  40.         }  
  41.     }  
  42.   
  43. }  

如何为spring代理类设置属性值


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论