使用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. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值