如何为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"呢

默认是没有办法的。我帮你写了个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]