读书人

AOP的最容易的两种实现方式

发布时间: 2012-12-21 12:03:49 作者: rapoo

AOP的最简单的两种实现方式
这里介绍下aop最简单的两种实现方式。
1、动态代理
2、cglib
首先看动态代理。
动态代理大家都知道是必须基于接口的实现
1、接口

import com.xxx.aop.User;public interface IUserbean {public void addUser(User user);public User getUser(int id);}


2、要代理的类
import com.xxx.aop.User;public class UserbeanImpl implements IUserbean {public void addUser(User user) {System.out.println("Add user");}public User getUser(int id) {User u = new User();u.setName("li1");return u;}}



3、代理类
import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import com.xxx.aop.User;public class JDKProxy implements InvocationHandler {private Object target;public Object bind(Object target) {this.target = target;return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if (method.getName().equals("getUser")) {before((Integer) args[0]);} else {before(args);}Object result = null;result = method.invoke(target, args);if (method.getName().equals("getUser")) {afert((User) result);} else {afert(result);}return result;}private void afert(Object o) {System.out.println(o);}private void before(int id) {System.out.println(id);}private void before(Object[] args) {System.out.println(((User) args[0]).getName());}private void afert(User user) {System.out.println(user.getName());}}

其中还添加了4个afert 与 before方法。Spring aop就是通过配置文件来完全实现的。下章我们也会通过配置文件来实现。
4、测试类
import com.xxx.aop.User;public class TestProxy {public static void main(String[] args) {JDKProxy proxy = new JDKProxy();IUserbean userBean = (IUserbean) proxy.bind(new UserbeanImpl());User user = new User();user.setId(1);user.setName("li");userBean.addUser(user);userBean.getUser(1);}}


5、User javebean类
public class User {private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}


cglib原理完全一样,只是实现的不一样

1、被代理的类
import com.xxx.aop.User;public class UserBean {public UserBean() {}public void addUser(User user) {System.out.println("this is addUser() method!");}public void deleteUser() {System.out.println("this is deleteUser() method!");}public void getUser(User user) {throw new NullPointerException("It is null");}public void updateUser() {System.out.println("this is updateUser() method!");}}


2、代理类
public class CGLibProxy implements MethodInterceptor {private Object targetObject;public Object createProxyObject(Object targetObject) {this.targetObject = targetObject;Enhancer enhancer = new Enhancer();enhancer.setSuperclass(this.targetObject.getClass());enhancer.setCallback(this);return enhancer.create();}public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {before(args);Object result = null;try {result = methodProxy.invoke(targetObject, args);} catch (Exception e) {System.out.println(e.getMessage());}afert(args);return result;}private void before(Object[] args) {System.out.println(((User) args[0]).getName());}private void afert(Object[] args) {System.out.println(((User) args[0]).getName());}}


3、测试类
import com.xxx.aop.User;public class TestProxy {public static void main(String[] args) {CGLibProxy cProxy = new CGLibProxy();UserBean userBean = (UserBean) cProxy.createProxyObject(new UserBean());User user = new User();user.setId(1);user.setName("li");userBean.addUser(user);userBean.getUser(user);}}


通过以上就可以看出通过代理,我们可以获取被代理类的方法,类名,参数以及返回值。

读书人网 >编程

热点推荐