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

应用mixin来记录bean属性的改变

2012-11-05 
使用mixin来记录bean属性的改变先定义一个需要被introduce的interfacejava 代码?public?interface?EditAwa

使用mixin来记录bean属性的改变
先定义一个需要被introduce的interface
java 代码?

  1. public?interface?EditAware?{??
  2. ??
  3. ????public?Object?getOldValue(String?propertyName);??
  4. ??
  5. ????public?boolean?isEdited(String?propertyName);??
  6. ??
  7. }??
再写这个interface的mixin
java 代码?
  1. import?org.aopalliance.intercept.MethodInvocation;??
  2. import?org.apache.commons.beanutils.PropertyUtils;??
  3. import?org.apache.commons.lang.StringUtils;??
  4. import?org.springframework.aop.support.DelegatingIntroductionInterceptor;??
  5. ??
  6. public?class?EditAwareMixin?extends?DelegatingIntroductionInterceptor?implements??
  7. ????????EditAware?{??
  8. ??
  9. ????private?transient?Map?map?=?new?HashMap();??
  10. ??
  11. ????public?Object?getOldValue(String?propertyName)?{??
  12. ????????return?map.get(propertyName);??
  13. ????}??
  14. ??
  15. ????public?boolean?isEdited(String?propertyName)?{??
  16. ????????return?map.containsKey(propertyName);??
  17. ????}??
  18. ??
  19. ????public?Object?invoke(MethodInvocation?invocation)?throws?Throwable?{??
  20. ????????if?(invocation.getMethod().getName().indexOf("set")?==?0)?{??
  21. ????????????Object?_this?=?invocation.getThis();??
  22. ????????????String?propertyName?=?invocation.getMethod().getName().substring(3);??
  23. ????????????propertyName?=?StringUtils.uncapitalize(propertyName);??
  24. ????????????Object?oldValue?=?PropertyUtils.getProperty(_this,?propertyName);??
  25. ????????????Object?newValue?=?invocation.getArguments()[0];??
  26. ????????????if?(!isEquals(oldValue,?newValue))??
  27. ????????????????map.put(propertyName,?oldValue);??
  28. ????????}??
  29. ????????return?super.invoke(invocation);??
  30. ????}??
  31. ??
  32. ????public?static?boolean?isEquals(Object?oldValue,?Object?newValue)?{??
  33. ????????if?(oldValue?==?null?&&?newValue?==?null)??
  34. ????????????return?true;??
  35. ????????if?(oldValue?!=?null)??
  36. ????????????return?oldValue.equals(newValue);??
  37. ????????else??
  38. ????????????return?newValue.equals(oldValue);??
  39. ????}??
  40. }??
最后是怎么使用这个mixin
java 代码?
  1. import?org.springframework.aop.framework.ProxyFactory;??
  2. import?org.springframework.beans.BeanUtils;??
  3. ??
  4. public?class?Main?{??
  5. ??
  6. ????public?static?void?main(String[]?args)?{??
  7. ????????User?u1?=?new?User("username1",?"password1");??
  8. ????????User?u2?=?new?User("username2",?"password2");??
  9. ????????ProxyFactory?pc?=?new?ProxyFactory();??
  10. ????????pc.setProxyTargetClass(true);??
  11. ????????pc.setTargetClass(u1.getClass());??
  12. ????????pc.addAdvice(new?EditAwareMixin());??
  13. ????????pc.setTarget(u1);??
  14. ????????u1?=?(User)?pc.getProxy();??
  15. ????????BeanUtils.copyProperties(u2,?u1);??
  16. ????????EditAware?ea?=?(EditAware)?u1;??
  17. ????????System.out.println(ea.isEdited("username"));??
  18. ????????System.out.println(ea.getOldValue("username"));??
  19. ????}??
  20. ??
  21. ????public?static?class?User?{??
  22. ????????private?String?username;??
  23. ????????private?String?password;??
  24. ??
  25. ????????public?User()?{??
  26. ??
  27. ????????}??
  28. ??
  29. ????????public?User(String?username,?String?password)?{??
  30. ????????????this.username?=?username;??
  31. ????????????this.password?=?password;??
  32. ????????}??
  33. ??
  34. ????????public?String?getUsername()?{??
  35. ????????????return?username;??
  36. ????????}??
  37. ??
  38. ????????public?void?setUsername(String?username)?{??
  39. ????????????this.username?=?username;??
  40. ????????}??
  41. ??
  42. ????????public?String?getPassword()?{??
  43. ????????????return?password;??
  44. ????????}??
  45. ??
  46. ????????public?void?setPassword(String?password)?{??
  47. ????????????this.password?=?password;??
  48. ????????}??
  49. ??
  50. ????}??
  51. }??

热点排行