现在有一个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]