欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-16 15:17:05
...

 

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

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

Java代码   如何为spring代理类设置属性值
            
    
    博客分类: spring杂谈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代码   如何为spring代理类设置属性值
            
    
    博客分类: spring杂谈java开发常见问题分析  
  1. <aop:pointcut expression="execution(* com..*Bean.*(..))"  
  2.             id="txBean" />  

 现在对它进行测试:

Java代码   如何为spring代理类设置属性值
            
    
    博客分类: spring杂谈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代码   如何为spring代理类设置属性值
            
    
    博客分类: spring杂谈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. }