CGLIB
CGLib (Code Generation Library) 是一个强大的、高性能、高质量的 Code 生成类库。它可以在运行期扩展 Java 类与实现 Java 接口。CGLib 比 Java 的 java.lang.reflect.Proxy 类更强的在于它不仅可以接管接口类的方法,还可以接管普通类的方法。
1. 创建springboot项目
2. 导入相关依赖(AOP需要的jar包)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
3. 创建实体类
4)创建一个测试类
@SpringBootTest
public class TestBook {
@Autowired
private Book book;
@Test
public void testBook(){
//使用CGLIB代理为Book类的方法进行增强
//CGLIB代理的原理,创建被代理类的子类,因为子类拥有父类的所有方法,
// 然后进行增强
// 创建增强器(对象)
Enhancer enhancer = new Enhancer();
//指定给哪个类增强
enhancer.setSuperclass(book.getClass());
// enhancer.setInterfaces();//此方法用于有接口的类
//指定增强方法
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
if("look".equals(method.getName())) {
System.out.println("增强代码开始");
book.look();
System.out.println("增强代码结束");
} else if("study".equals(method.getName())) {
System.out.println("增强代码开始");
book.study();
System.out.println("增强代码结束");
}
return null;
}
});
//创建CGLIB代理
Book b = (Book) enhancer.create();
b.look();
b.study();
}
}
5) 测试观察结果
AOP
**AOP=Aspect Oriented Programming(面向切面编程),**简单理解:在不影响源代码的基础上对代码进行增强
AOP的相关概念
- 连接点(Joint point)表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
简单理解:就是方法的调用就称为连接点 - 切入点(Pointcut)表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
简单理解:符合某种规则的连接点
连接点包含切入点,切入点一定是连接点,连接点不一定是切入点 - 通知Advice:Advice 定义了在 pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
简单理解:advice是增强的方法 - 切面(Aspect)Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。
简单理解:狭义上的切面:一个类包含了增强的方法,和指定的规则
广义上的切面=连接点+切入点+通知 - 目标对象(target object):被增强的对象
- 织入(weaving):通过动态代理增强指定的方法
如何实现AOP
1) 在pojo中创建A类
2)创建B类
3)导入aop依赖
4)创建切面类,cn.tedu.aspect,创建FirstAspect类
5)创建TestController进行测试
6)观察结果
串讲总结:今天老师讲的有点晚,笔记就粘贴老师的了,总体一直跟上了老师的节奏,理解上还有很多欠缺,希望能有时间做复习和巩固