论坛首页 Java企业应用论坛

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

浏览 2627 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-07-04  
先定义一个需要被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. }  
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics