面向切面编程AOP的前世今生

一、Java API 中动态代理

Person.java

package com.xiaojiang.dynamicProxy;

/**
 * Created by shijjian
 * on 2016/12/23.
 */
public class Person {
    private String name;
    private Integer id;

    public String getName() {
        return name;
    }

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

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Person(Integer id,String name) {
        this.name = name;
        this.id = id;
    }

    public Person() {
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", id=" + id +
                '}';
    }
}

  

PersonService.java

package com.xiaojiang.dynamicProxy;

/**
 * Created by shijjian
 * on 2016/12/23.
 */
public interface PersonService {
    public void addPerson(Person person);
    public void deletePerson(Integer id);
    public void updatePerson(Person person);

}

  

PersonServiceImpl.java

package com.xiaojiang.dynamicProxy;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by shijjian
 * on 2016/12/23.
 */
public class PersonServiceImpl implements PersonService {
    private static Map<Integer,Person> persons = new HashMap<Integer,Person>();
    static{
        persons.put(1001,new Person(1001,"zhangsan"));
        persons.put(1002,new Person(1002,"lisi"));
        persons.put(1003,new Person(1003,"wangwu"));

    }

    public static Map<Integer, Person> getPersons() {
        return persons;
    }

    @Override
    public void addPerson(Person person) {
        persons.put(person.getId(),person);
    }

    @Override
    public void deletePerson(Integer id) {
        if(id==1001){
            throw new RuntimeException("1001不能被删除");
        }
        persons.remove(id);
    }

    @Override
    public void updatePerson(Person person) {
        persons.put(person.getId(),person);
    }
}

PersonServiceProxy.java

package com.xiaojiang.dynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Created by shijjian
 * on 2016/12/23.
 */
public class PersonServiceProxy {
    private PersonService target = null;

    public PersonServiceProxy(PersonService target  ){
        this.target = target;
    }

    public PersonService getPersonServiceProxy(){
        PersonService proxy = (PersonService) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        Object result=null;
                        System.out.println("开启事务");
                        try{
                             result = method.invoke(target,args);
                            System.out.println("提交事务");
                        }catch (Exception e){
                            e.printStackTrace();
                            System.out.println("回滚事务");
                        }
                        return result;
                    }
                });
        return proxy;
    }

}

ProxyTest.java

package com.xiaojiang.dynamicProxy;

/**
 * Created by shijjian
 * on 2016/12/23.
 */
public class ProxyTest {
    public static void main(String[] args) {
        PersonService personService = new PersonServiceImpl();
        PersonService proxy = new PersonServiceProxy(personService).getPersonServiceProxy();
        proxy.addPerson(new Person(1004,"zhaoliu"));
        System.out.println(PersonServiceImpl.getPersons());

        //proxy.deletePerson(1001);
       // System.out.println(PersonServiceImpl.getPersons());
    }
}

运行结果:

开启事务
提交事务
{1001=Person{name='zhangsan', id=1001}, 1002=Person{name='lisi', id=1002}, 1003=Person{name='wangwu', id=1003}, 1004=Person{name='zhaoliu', id=1004}}

Process finished with exit code 0

ProxyTest.java

package com.xiaojiang.dynamicProxy;

/**
 * Created by shijjian
 * on 2016/12/23.
 */
public class ProxyTest {
    public static void main(String[] args) {
        PersonService personService = new PersonServiceImpl();
        PersonService proxy = new PersonServiceProxy(personService).getPersonServiceProxy();
       /* proxy.addPerson(new Person(1004,"zhaoliu"));
        System.out.println(PersonServiceImpl.getPersons());*/

        proxy.deletePerson(1001);
        System.out.println(PersonServiceImpl.getPersons());
    }
}

运行结果:

java.lang.reflect.InvocationTargetException
开启事务
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
回滚事务
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
{1001=Person{name='zhangsan', id=1001}, 1002=Person{name='lisi', id=1002}, 1003=Person{name='wangwu', id=1003}}
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at com.xiaojiang.dynamicProxy.PersonServiceProxy$1.invoke(PersonServiceProxy.java:26)
	at com.sun.proxy.$Proxy0.deletePerson(Unknown Source)
	at com.xiaojiang.dynamicProxy.ProxyTest.main(ProxyTest.java:14)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: java.lang.RuntimeException: 1001不能被删除
	at com.xiaojiang.dynamicProxy.PersonServiceImpl.deletePerson(PersonServiceImpl.java:31)
	... 12 more

Process finished with exit code 0

  

 

  

 

posted @ 2016-12-23 10:30  Steven_Jiang  阅读(188)  评论(0)    收藏  举报