通过jdk动态代理 实现aop 必须要有 接口类和实现类
文件列表如下
先写接口类和实现类具体如下
接口省略
package com.qst.a_proxy.a_jdk;
public class UserServerImpl implements UserService {
@Override
public void addUser() {
System.out.println("com.qst.a_proxy.a_jdk UserServer addUser");
}
@Override
public void updateUser() {
System.out.println("com.qst.a_proxy.a_jdk UserServer updateUser");
}
@Override
public void deleteUser() {
System.out.println("com.qst.a_proxy.a_jdk UserServer deleteUser");
}
}
切面类为
package com.qst.a_proxy.a_jdk;
public class MyAspect {
public void before() {
System.out.println("前插入");
}
public void after() {
System.out.println("后插入");
}
}
通过动态代理实现需要手写工厂类
package com.qst.a_proxy.a_jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyBeanFactory {
public static UserService createService() {
// 1 目标类
final UserService userservice = new UserServerImpl();
//2 切面类
final MyAspect myaspect = new MyAspect();
/*3代理类 将目标类(切入点)和切面类(通知)结合--->切面
* 参数1,loder 类加载器 动态代理类 运行时创建 任何类都需要类加载器将其加载到内存 一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
* 写法: 一般情况:当前类.Class.getClassLoader
* 目标实例.getClass().getClassLoader
* 参数2:interfaces 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
* 方式一: 目标类实例.getClass().getInterfaces();只能获得自己的接口 不能得到他父类的接口
* 方式二:new Class[] {UserService.class}
*参数3: 一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上一般使用匿名内部类
* 提供了一invoke方法,代理类的每一个方法执行时,都会调用一次invoke
* 参数1 bojec proxy 代理对象
* 参数2 Method method :代理对象当前执行的方法的描述对象(反射)
* 参数3 Object[] args :方法的实际参数
* */
UserService proxyservice =(UserService)Proxy.newProxyInstance(
MyBeanFactory.class.getClassLoader(),
userservice.getClass().getInterfaces(),new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//目标前执行
myaspect.before();
Object obj = method.invoke(userservice, args);
myaspect.after();
return obj;
}
});
return proxyservice;
}
}
测试代码如下
package com.qst.a_proxy.a_jdk;
public class Testjdk {
public static void main(String[] args) {
// TODO Auto-generated method stub
UserService userservice = MyBeanFactory.createService();
userservice.addUser();
userservice.updateUser();
userservice.deleteUser();
}
}
结果如下
建议 看懂即可以后sprong框架由简单的实现方式