`
quaff
  • 浏览: 13236 次
  • 性别: Icon_minigender_1
  • 来自: 天朝
文章分类
社区版块
存档分类
最新评论

使用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. }  
分享到:
评论

相关推荐

    Sassmixin准备切换到使用CSS自定义属性又名CSS变量

    Mixin允许你定义一组可以重复使用的样式,类似于函数,通过`@include`语句来调用。这在处理复杂或频繁复用的样式时非常有用,但它仍然需要编译为普通的CSS,增加了额外的步骤。 CSS自定义属性,另一方面,是在CSS...

    Mixin,MIXIN是使用ASM的Java的特性/混合框架.zip

    Mixin框架是Java编程语言中的一个开源项目,它利用ASM库来实现对类的低级别修改,也就是所谓的"混合"(Mixins)。这个框架的核心概念是将功能或行为注入到目标类中,而无需继承或者使用代理模式。在游戏开发、模块化...

    forge-mixin-example:在Minecraft Forge 1.12.2中使用Mixin的示例

    本示例项目"forge-mixin-example"就是针对Minecraft Forge 1.12.2版本,展示如何有效地使用Mixin进行模组开发。 首先,理解Forge的基本概念至关重要。Forge提供了一个API,让开发者可以安全地与Minecraft的运行时...

    小程序mixin混入Page选项合并

    在微信小程序的开发中,`mixin` 是一种常见的代码复用机制,它允许开发者定义一组通用的方法或者属性,然后将这些通用部分混入(mix in)到不同的页面(Page)或组件(Component)中,避免了代码重复,提高了代码的...

    scss使用mixin不生效(浏览器无法编译出来)的解决方法

    然后,在需要应用这个样式的类或元素中,你可以使用`@include`来调用`mixin`: ```scss .my-class { @include my-mixin(red); } ``` 当编译这段SCSS代码时,它将被转换为CSS: ```css .my-class { color: red; ...

    ymixin是来自阅文前端团队的CSS预处理器mixin库

    这里,`respond-to` mixin根据传入的屏幕断点(如'sm'、'md'、'lg')来插入相应的媒体查询,简化了响应式布局的实现。 ymixin库也可能会支持JavaScript与CSS的交互,比如通过`data-*`属性或者CSS变量来实现动态样式...

    Vue使用mixin分发组件的可复用功能

    但需要注意的是,使用mixin也可能导致代码难以追踪,因为mixin中的逻辑可能会影响到使用它的组件,特别是在mixin和组件中定义了相同命名的属性和方法时。 Vue官方推荐,如果mixin中包含同名的钩子函数,最好将这些...

    mixin白皮书

    mixin是一个闪电交易快速的点点对的数字交道项目,它拥有非常好的技术栈。

    前端大厂最新面试题-mixin.docx

    局部混入定义一个 Mixin 对象,有组件 options 的 data、methods 属性,然后将其传入组件的 mixins 选项中。例如: ```javascript var myMixin = { created: function () { this.hello() }, methods: { hello:...

    mixin混入来封装axios请求

    mixin混入来封装axios请求 我们通过mixin来封装axios请求这样每一个组件直接通过混入来进行axios请求。 不必每次需要时都要import引入一次 首先需要下载axios的包 //用npm、cnpm或者yarn都行 npm install axios ...

    A Swift mixin for UITableViewCells and UICollectionViewCells.zip

    A Swift mixin for UITableViewCells and UICollectionViewCells.zip,A Swift mixin for reusing views easily and in a type-safe way (UITableViewCells, UICollectionViewCells, custom UIViews, ViewControllers...

    css-vars:Sass mixin与Sass一起使用CSS自定义属性

    css-vars:将CSS自定义属性与Sass一起使用安装使用npm: npm install css-vars 与纱线: yarn add css-vars 使用Bower: bower install css-var 手动:获取使用@import语句在项目中包含主mixin文件: @import " [%...

    box:一个单一的mixin,用于设置元素的盒模型属性

    $ grunt docs构建文档还有一个Grunt任务: $ grunt sassdoc测验可以从出色的获得测试,并且可以使用以下方式运行测试: $ grunt test原料药基本API 有mixin可以覆盖所有box属性,既可以接受多个参数的属性,也可以...

    modernizr-mixin, 在Sass中,针对测试的简单而全面的mixin.zip

    modernizr-mixin, 在Sass中,针对测试的简单而全面的mixin hardwarebutton混合 一种简单的DRYier测试方法,在Sass中更快更。安装要求 ruby 3.4或者 LibSass 3.2Libsass警告:在 Libsass 3.2.3中有一个已知 Bug,它...

    使用Mixin设计模式进行Python编程的方法讲解

    Mixin模式是一种在python里经常使用的模式,适当合理的应用能够达到复用代码,合理组织代码结构的目的。 Python的Mixin模式可以通过多继承的方式来实现, 举例来说,我们自定义一个简单的具有嵌套结构的数据容器: ...

    Vue mixin混入(混合)配置学习

    Vue mixin 混入允许开发者定义一组属性,包括选项如数据、方法、生命周期钩子等,然后这些属性可以被多个组件继承。当你创建一个组件时,Vue会自动将所有混入对象中的属性合并到该组件的选项中。如果两个混入或组件...

    JS自定义混合Mixin函数示例

    这样,通过创建Author的实例并调用其方法时,就可以看到它已经成功继承了Editor类的hello方法,但是其自身的属性如name和books并没有改变。 最后,文档提到了一些与JavaScript相关的高级主题,包括函数技巧、面向...

    前端开源库-react-addons-pure-render-mixin

    总的来说,“react-addons-pure-render-mixin”是React优化性能的一种手段,通过比较props和state来决定是否需要组件重新渲染。随着React的发展,虽然它已不再是最新的解决方案,但理解其工作原理对于优化React应用...

Global site tag (gtag.js) - Google Analytics