这里介绍下aop最简单的两种实现方式。
1、动态代理
2、cglib
首先看动态代理。
动态代理大家都知道是必须基于接口的实现
1、接口
2、要代理的类
3、代理类
其中还添加了4个afert 与 before方法。Spring aop就是通过配置文件来完全实现的。下章我们也会通过配置文件来实现。
4、测试类
5、User javebean类
cglib原理完全一样,只是实现的不一样
1、被代理的类
2、代理类
3、测试类
通过以上就可以看出通过代理,我们可以获取被代理类的方法,类名,参数以及返回值。
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);
}
}
通过以上就可以看出通过代理,我们可以获取被代理类的方法,类名,参数以及返回值。