aop jdk cglib方法实现

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

 

}

 

 

 

 

 

你可能感兴趣的:(cglib)