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 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料