aop实现方式有两种,一种是jdk用接口实现,一种是cglib生成子类实现
jdk方式
这种方式必须是针对接口编程,下面给出示例代码
业务接口类
public interface UserService {
public void saveString(User user, String str);
}
业务实现类
public class UserServiceImpl implements UserService {
@Override
public void saveString(User user, String str) {
System.out.println("保存str:" + str);
}
}
生成代理类工厂
public class ProxyFactory implements InvocationHandler {
private Object targectObject;
public Object createProxyInstance(Object obj) {
this.targectObject = obj;
return Proxy.newProxyInstance(this.targectObject.getClass().getClassLoader(), this.targectObject.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
UserService userService = (UserService) this.targectObject;
return method.invoke(userService, args);
}
}
这个代理工厂可以不实现jdk中的InvocationHandler,这个handler是在Proxy.newProxyInstance的时候,需要有个处理,这里直接放这个工厂里面,是共用了targectObject这个对象,一般写法,是要独立出来。
测试代码
public static void main(String[] args) {
ProxyFactory pf = new ProxyFactory();
UserService userService = new UserServiceImpl();
UserService service = (UserService) pf.createProxyInstance(userService);
service.saveString(new User(), "123");
}
cglib方式
该方式是针对类编程的,可以无接口
只给出代理工厂的代码,业务代码同上
public class CglibProxyFactory implements MethodInterceptor {
private Object targetObject;
public Object createIntance(Object obj) {
this.targetObject = obj;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.targetObject.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
UserService userService = (UserService) this.targetObject;
return method.invoke(userService, args);
}
}
同上,该工厂同样实现了cglib的MethodInterceptor ,该接口中的方法是为了enhancer.setCallback使用,一般也独立出来,这里方便处理就放一起了
测试代码
public static void main(String[] args) {
CglibProxyFactory cpf = new CglibProxyFactory();
UserService userService = new UserServiceImpl();
UserService service = (UserService) cpf.createIntance(userService);
service.saveString(new User(), "123");
}