1

我们目前正在尝试实现对 SlingModels 的扩展,以允许将 slingmodel 直接持久化到 JCR。

我们的策略考虑了 2 个起始条件: 1. 一个要持久化的新对象 2. 从 JCR 中检索、更改并再次持久化的对象

对于情况 1,我们使用反射来检查对象,为模型创建一个新节点,为找到的任何原始变量插入属性,并递归地对任何作为变量和集合找到的复杂模型对象使用相同的持久性方法。

我关于最佳方法的问题与情况 2 相关。如果我们从存储库中拉出一个对象,我们不能保证该节点同时不会同步更改。因此,我们希望在 SlingModel 上实现一个更改观察器,以记录所做的任何更改的事务日志。然后,在将对象再次持久化回 JCR 时,可以使用这些事务来设置相关属性。

我考虑过使用观察者模式,但这意味着我们需要在每个 SlingModel 的 setter 中实现一个函数,这根本不理想,因为它需要开发人员记住添加代码并正确执行。

理想情况下,我想直接在变量上实现拦截器之类的东西,或者如果不可能的话,在 setter 本身上实现,并要求每个模型然后需要为每个变量使用 getter/setter。我们可以配置代码扫描工具来强制开发人员实现 getter/setter。

在这里接近变更观察者的最佳方式是什么?

4

1 回答 1

1
import java.util.List;

public class Teacher {

    private String userName;
    private String cource;
    private List<Student> students;

    public List<Student> getStudents() {
        return students;
    }

    public void setStudents(List<Student> students) {
        this.students = students;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getCource() {
        return cource;
    }

    public void setCource(String cource) {
        this.cource = cource;
    }
}

public class Student {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}


public class ClassFacadeCglib implements MethodInterceptor{

    private Object target; 

    public Object getInstance(Object target) {  
        this.target = target;  
        Enhancer enhancer = new Enhancer();  
        enhancer.setSuperclass(this.target.getClass());  
        // callback method
        enhancer.setCallback(this);  
        // create proxy object
        return enhancer.create();  
    }  

    @Override
    public Object intercept(Object obj, Method method, Object[] args,  
        MethodProxy proxy) throws Throwable {

        if(method.getName().startsWith("set")){
                System.out.println(method.getName()+" start");  
                proxy.invokeSuper(obj, args);  
                System.out.println(method.getName()+" end..");  
        }

        if(method.getName().startsWith("get")){
            System.out.println(method.getName()+" start");  
            proxy.invokeSuper(obj, args);  
            System.out.println(method.getName()+" end");  
        }

        return null;  
    }

}


public class Main {

    public static void main(String[] args) {  
        ClassFacadeCglib cglib=new ClassFacadeCglib();  
        Teacher teacher=(Teacher)cglib.getInstance(new Teacher());  
        teacher.setCource("Math");
        teacher.getUserName(); 
    } 

}

注意:
运行需要 cglib-full-2.0.2.jar。见https://repo1.maven.org/maven2/cglib/cglib-full/2.0.2/

于 2015-11-03T05:30:08.567 回答