spring中jdk的动态代理机制
JDK动态代理 对“装饰者”设计模式简化。使用前提:必须有接口
- 目标类
public interface UserService {
public void addUser();
public void updateUser();
public void deleteUser();
}
- 切面类
public class MyAspect {
public void before(){
System.out.println("鸡首");
}
public void after(){
System.out.println("牛后");
}
}
- 工厂类
public class MyBeanFactory {
public static UserService createService(){
//1.目标类
final UserService userService = new UserServiceImpl();
//2.切面类
final MyAspect myAspect = new MyAspect();
/*3.代理类 :将目标类(切入点)和切面类(通知) 结合 --->切面*/
UserService proxService = (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 null;
}
});
return proxService;
}
}
在这里我们主要讲一下这个工厂类:
- 这个newProxyInstance()方法是spring中,Proxy代理中的静态方法,见源码:
主要的作用就是新建一个代理对象,有三个参数: - ClassLoader loader :获得当前类的类加载器,将类通过类加载器加载到内存中
- Class<?>[] interfaces:代理类需要实现的接口
- InvocationHandler h :这是一个接口
调用其中的invoke方法运行对象
- 最后就是测试类
@Test
public void demo01(){
UserService userService = MyBeanFactory.createService();
userService.addUser();
userService.deleteUser();
userService.updateUser();
}
总结:在进行实现jdk动态代理时,主要需要掌握设计模式中的代理模式,生成代理对象,代理对象来代理目标类的所有操作,提高生产时的灵活性,这个是必须掌握的。