面向切面编程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

浙公网安备 33010602011771号