Spring AOP底层动态代理的实现
(1)第一种情况,有接口情况,使用动态代理创建接口实现类代理对象,采用的是JDK自带的动态代理方式,只支持代理实现了接口的类。
(2)第二种情况,没有接口情况,使用动态代理创建类的子类代理对象,使用cglib(第三方开源技术)的动态代理方式,没有实现接口也可以。
JDK动态代理:
定义一个接口:UserDao
/**
* 创建一个接口
* @author:LiChong
* @date:2018/7/30
*/
public interface UserDao {
void add();
}
定义一个实现类:
/**
* 实现UserDao接口的实现类
*
* @author:LiChong
* @date:2018/7/30
*/
public class UserDaoImp implements UserDao {
@Override
public void add() {
System.out.println("add()");
}
}
创建代理类并增强方法
@Test
public void jdkProxyTest1() {
// jdk动态代理测试,只支持接口
UserDao userDao = new UserDaoImp();
UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(), userDao.getClass()
.getInterfaces(),
(proxy, method, args) -> {
System.out.println("=========");
Object invoke = method.invoke(userDao, args);
System.out.println("=========");
return invoke;
});
userDaoProxy.add();
}
结果:
=========
add()
=========
Cglib 实现动态代理
因为这里是有Spring,Spring自带整合了Cglib,因为SpringAOP内部实现就是通过Cglib实现的,引入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
可以看到
定义一个类UserService 不需要实现接口
public class UserService {
public void add() {
System.out.println("add");
}
}
创建代理类并增强方法
@Test
public void cglibProxyTest1() {
UserService service = new UserService();
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(service.getClass());
enhancer.setCallback((org.springframework.cglib.proxy.InvocationHandler) (object, method, args) -> {
System.out.println("=========");
Object invoke = method.invoke(service, args);
System.out.println("=========");
return invoke;
});
UserService proxy = (UserService) enhancer.create();
proxy.add();
}
结果:
=========
add
=========