spring(九):aop
什么是aop
- 是通过预编译的方式和运行期动态代理实现程序功能的统一维护的一种技术。
AOP在Spring中的作用
提供声明式事务:允许用户自定义切面
- 横切关注点:跨越应用程序多个模块的方法或功能。即:与我们逻辑无关的,但是我们需要专注的部分,就是横切关注点。如:日志,安全,缓存,事务等等
- 切面(aspect):横切关注点被 模块化 的特殊对象。即:它是一个类
- 通知(advice):切面必须要完成的工作。即:它是类中的一个方法
- 目标(target):被通知的对象
- 代理(proxy):向目标对象应用通知之后创建的对象
- 切入点(PointCut):切面通知 执行的 “地点” 的定义
- 连接点(joinPoint):与切入点匹配的执行点
SpringAOP中,通过Advice定义横切逻辑,Spring中支持5种类型的Advice:
即AOP在不改变原有代码的情况下,去增加新的功能。
使用spring实现AOP
使用AOP织入,需要导入一个依赖包
1 | <dependency> |
之后要在xml配置文件中添加约束
1 | xmlns:aop="http://www.springframework.org/schema/aop" |
方式1:使用spring的API接口
动态代理代理的是接口,因为aop用到的是动态代理,所以之后使用getBean方法获取 bean的实例的时候,映射类型需要为接口类型,而不能是实现类类型!,静态代理代理的是实体类
- 首先编写类来继承Advice接口
1 | //程序返回之后加入日志 |
- 然后去spring的文件中注册 , 并实现aop切入实现 , 注意导入约束,配置applicationContext.xml文件
1 | <aop:config> |
- 测试
1 | public class MyTest { |
方式2:使用自定义类(这个类就是上面的切面)实现AOP
- 自己定义一个包含一些方法(对应上面的通知)的一个类(对应上面的切面)
1
2
3
4
5
6
7
8
9//自定义类来实现AOP
public class Diy {
public void before(){
System.out.println("=========方法执行前=======");
}
public void after(){
System.out.println("=========方法执行后=======");
}
} - 在xml中使用切面的方式进行配置
1 | <!--方式2 使用自定义类来实现AOP--> |
这样做,能做的事情有限,但是方便,写起来简单
方式3:使用注解实现AOP
需要引入注解支持:
用到的注解:
- @Aspect():声明在类上面,代表这是一个切面
- @Before():代表是在代理对象的方法执行前切入,()中要传入参数,
“execution( com.hanser.service.UserServiceImpl.(..))”代表切入哪里 - @After():代表是在代理对象的方法执行后切入,()中要传入参数同@Before()
- @around():代表是在代理对象的方法执行环绕切入,()中要传入参数同@Before()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24//方式3:使用注解实现AOP
//@Aspect标注这个类是一个切面
public class AnnotationPointCut {
public void before(){
System.out.println("芜湖");
}
public void after(){
System.out.println("hanser");
}
//在环绕增强中,我们可以给定一个参数,代表我们要获取处理切入的点
public void around(ProceedingJoinPoint pj) throws Throwable {
//这行会在@Before切入之前切入
System.out.println("========环绕前=========");
//代表执行方法
Object proceed = pj.proceed();
//这行会在@After切入之前切入
System.out.println("========环绕后=========");
}
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hakurei Reimu!