怎么为spring代理类设置属性值
如何为spring代理类设置属性值在问答频道 有朋友问《如何为spring代理类设置属性值》?就写了个小工具 供使用
如何为spring代理类设置属性值
在问答频道 有朋友问《如何为spring代理类设置属性值》?就写了个小工具 供使用。思想就不讲了。
现在有一个bean包含了私有属性,如下:
Java代码??

- @Component??
- public?class?Bean?{??
- ????String?name;??
- ??
- ????public?String?getName()?{??
- ????????return?name;??
- ????}??
- ??
- ????public?void?setName(String?name)?{??
- ????????this.name?=?name;??
- ????}??
- ??????
- }??
它被AOP配置过代理,代理配置为:
?
Java代码??

- <aop:pointcut?expression="execution(*?com..*Bean.*(..))"??
- ????????????id="txBean"?/>??
?现在对它进行测试:
Java代码??

- 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切面 帮你完成设置属性。?
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();//记录好异常进行处理??
- ????????????}??
- ????????}??
- ????}??
- ??
- } ?