zoukankan      html  css  js  c++  java
  • 为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. }  
  • 相关阅读:
    常见规格液晶显示器尺寸/点距/分辨率
    Disk genius(Diskgenius)修复硬盘分区表
    IIS上注册.Net
    PowerDesigner中如何导入表结构
    关于VS命名空间的引用
    启动Word时出现“复制文件或文件夹时出错"对话框?
    能够删除的安卓(Android)系统自带程序详细列表和说明
    五种方法 解决Windows最大终端连接数
    查看本机打开的端口
    RAID技术概述
  • 原文地址:https://www.cnblogs.com/doudouxiaoye/p/5789287.html
Copyright © 2011-2022 走看看