肥宅兜

导航

为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. }  

posted on 2016-08-19 22:35  肥宅兜  阅读(1149)  评论(0编辑  收藏  举报