dinguangx 2012-09-14 13:34
浏览 512
已采纳

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

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

@Component
public class Bean {
    String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
}

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

 

<aop:pointcut expression="execution(* com..*Bean.*(..))"
            id="txBean" />

 现在对它进行测试:

 

public class BeanTest extends SpringContextTestCase{
    @Autowired
    private Bean bean;
    @Test
    public void testBean(){
        bean.setName("dylan");
        System.out.println(bean.name);
        System.out.println(bean.getName());
    }
}

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

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

  • 写回答

1条回答 默认 最新

  • jinnianshilongnian 2012-09-14 17:05
    关注

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

    [code="java"]

    import java.beans.PropertyDescriptor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;

    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.Aspect;
    import org.springframework.aop.support.AopUtils;
    import org.springframework.beans.BeanUtils;
    import org.springframework.core.annotation.Order;

    @Aspect
    @Order(Integer.MIN_VALUE)
    public class SetterAspect {

    @After(value="execution(* *.set*(*)) && args(value)", argNames="value")
    public void after(JoinPoint jp, Object value) {
        Object proxy = jp.getThis();
        Object target = jp.getTarget();
    
        if(AopUtils.isAopProxy(proxy)) {//只有代理对象才需要处理
    
            try {
                Class<?> proxyClass = proxy.getClass();
                Class<?> targetClass = target.getClass();
                String methodName = jp.getSignature().getName();
    
                Method m = BeanUtils.findDeclaredMethod(proxyClass, methodName, new Class[]{value.getClass()});
                PropertyDescriptor descriptor = BeanUtils.findPropertyForMethod(m);
                String propName = descriptor.getName();
    
                Field f = targetClass.getClass().getDeclaredField(propName);
                if(f != null) {
                    f.setAccessible(true);
                    f.set(proxy, value);
                }
            } catch (Exception e) {
                e.printStackTrace();//记录好异常进行处理
            }
        }
    }
    

    }
    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型