Spring-1.3

Spring 和 Junit 的整合:
首先要先加入下面这两个 junit 的包
在这里插入图片描述
再加入 spring 和 Junit 整合的包
在这里插入图片描述
在这里插入图片描述
@RunWith 注解是加载 spring-test… 这个 jar 包里的SpringJUnitClassRunner这个类,这个类会创建容器
@ContextConfiguration 注解是指示配置文件,如果不加 classpath 则会通过相对路径来找
在这里插入图片描述
AOP面向切面编程:
在这里插入图片描述
底层实现原理是代理机制,有动态代理和静态代理之分
在这里插入图片描述
JDK动态代理:在这里插入图片描述
首先需要实现 InvocationHandler 这个接口,需要实现 invoke 这个方法。
在类里面先封装一个 被代理的目标对象 target ,然后构造函数进行初始化,然后需要写一个生成代理对象的方法,在方法里面调用 JDK 自带的 Proxy 的静态方法 newProxyInstance 生成代理对象的实例,有三个参数,第一个参数是被代理的目标对象 target 的类加载器,第二个参数是被代理的目标对象 target 实现的接口,第三个参数是处理器对象,会调用该处理器对象的 invoke 方法(回调函数)。
需要注意区分 被代理的目标对象和代理对象

在这里插入图片描述
invoke 回调函数有3个参数,第一个是生成的代理对象,第二个是目标对象调用的方法,第三个参数是该方法的参数,返回值就是 method 方法的返回值。
在 invoke 回调函数里面适当位置进行功能增强,然后利用反射进行核心业务的调用。
测试:
在这里插入图片描述

CGLIB动态代理:
Cglib的引入为了解决类的直接代理问题(生成代理子类),不需要接口也可以代理
JDK动态代理和CGLIB动态代理的区别:
JDK动态代理:class $proxy implements target实现的接口
CGLIB动态代理:class $proxy extends target(被代理对象)

CGLIB动态代理需要依赖相应的 jar 包,都依赖在 spring-core 包里,所以先引入 spring-core 包即可。
代理类:需要继承 MethodInterceptor 类,需要实现 intercept 这个方法
在这里插入图片描述
和 JDK 代理相似,先封装一个被代理对象 target ,然后用构造函数进行初始化,然后写一个生成代理对象的类:
在这里插入图片描述
intercept 方法:
在这里插入图片描述
回调方法 intercepr 方法有4个参数,第一个是代理对象,第二个是目标方法,第三个是该方法的参数,第四个是该方法的代理对象,返回值就是目标方法的返回值。
测试:
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Desperate_gh/article/details/112134211
1.3