首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

怎么为spring代理类设置属性值

2012-11-21 
如何为spring代理类设置属性值在问答频道 有朋友问《如何为spring代理类设置属性值》?就写了个小工具 供使用

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

在问答频道 有朋友问《如何为spring代理类设置属性值》?就写了个小工具 供使用。思想就不讲了。

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

Java代码??怎么为spring代理类设置属性值
  1. @Component??
  2. public?class?Bean?{??
  3. ????String?name;??
  4. ??
  5. ????public?String?getName()?{??
  6. ????????return?name;??
  7. ????}??
  8. ??
  9. ????public?void?setName(String?name)?{??
  10. ????????this.name?=?name;??
  11. ????}??
  12. ??????
  13. }??

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

?

Java代码??怎么为spring代理类设置属性值
  1. <aop:pointcut?expression="execution(*?com..*Bean.*(..))"??
  2. ????????????id="txBean"?/>??

?现在对它进行测试:

Java代码??怎么为spring代理类设置属性值
  1. public?class?BeanTest?extends?SpringContextTestCase{??
  2. ????@Autowired??
  3. ????private?Bean?bean;??
  4. ????@Test??
  5. ????public?void?testBean(){??
  6. ????????bean.setName("dylan");??
  7. ????????System.out.println(bean.name);??
  8. ????????System.out.println(bean.getName());??
  9. ????}??
  10. }??

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

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

?

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

Java代码??怎么为spring代理类设置属性值
  1. import?java.beans.PropertyDescriptor;??
  2. import?java.lang.reflect.Field;??
  3. import?java.lang.reflect.Method;??
  4. ??
  5. import?org.aspectj.lang.JoinPoint;??
  6. import?org.aspectj.lang.annotation.After;??
  7. import?org.aspectj.lang.annotation.Aspect;??
  8. import?org.springframework.aop.support.AopUtils;??
  9. import?org.springframework.beans.BeanUtils;??
  10. import?org.springframework.core.annotation.Order;??
  11. ??
  12. @Aspect??
  13. @Order(Integer.MIN_VALUE)??
  14. public?class?SetterAspect?{??
  15. ??????
  16. ????@After(value="execution(*?*.set*(*))?&&?args(value)",?argNames="value")??
  17. ????public?void?after(JoinPoint?jp,?Object?value)?{??
  18. ????????Object?proxy?=?jp.getThis();??
  19. ????????Object?target?=?jp.getTarget();??
  20. ??????????
  21. ????????if(AopUtils.isAopProxy(proxy))?{//只有代理对象才需要处理??
  22. ??????????????
  23. ????????????try?{??
  24. ????????????????Class<?>?proxyClass?=?proxy.getClass();??
  25. ????????????????Class<?>?targetClass?=?target.getClass();??
  26. ????????????????String?methodName?=?jp.getSignature().getName();??
  27. ??????????????????
  28. ????????????????Method?m?=?BeanUtils.findDeclaredMethod(proxyClass,?methodName,?new?Class[]{value.getClass()});??
  29. ????????????????PropertyDescriptor?descriptor?=?BeanUtils.findPropertyForMethod(m);??
  30. ????????????????String?propName?=?descriptor.getName();??
  31. ??????????????????
  32. ????????????????Field?f?=?targetClass.getClass().getDeclaredField(propName);??
  33. ????????????????if(f?!=?null)?{??
  34. ????????????????????f.setAccessible(true);??
  35. ????????????????????f.set(proxy,?value);??
  36. ????????????????}??
  37. ????????????}?catch?(Exception?e)?{??
  38. ????????????????e.printStackTrace();//记录好异常进行处理??
  39. ????????????}??
  40. ????????}??
  41. ????}??
  42. ??
  43. } ?

热点排行