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);
}
}


通过以上就可以看出通过代理,我们可以获取被代理类的方法,类名,参数以及返回值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值