1、AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面向对象编程) 的补充
2、AOP 的主要编程对象是切面(aspect), 而切面模块化横切关注点
3、在应用 AOP 编程时, 仍然需要定义公共功能, 但可以明确的定义这个功能在哪里, 以什么方式应用, 并且不必修改受影响的类. 这样一来横切关注点就被模块化到特殊的对象(切面)里
4、AOP 的好处:
①每个事物逻辑位于一个位置, 代码不分散, 便于维护和升级
②业务模块更简洁, 只包含核心业务代码
5、AOP术语:
①切面(Aspect): 横切关注点(跨越应用程序多个模块的功能)被模块化的特殊对象
②通知(Advice): 切面必须要完成的工作,即:标注有某种注解的简单的 Java 方法
③目标(Target): 被通知的对象
④代理(Proxy): 向目标对象应用通知之后创建的对象
⑤连接点(Joinpoint):程序执行的某个特定位置:如类某个方法调用前、调用后、方法抛出异常后等。连接点由两个信息确定:方法表示的程序执行点;相对点表示的方位。
⑥切点(pointcut):每个类都拥有多个连接点,即AOP的扫描规则。例如 处理逻辑类的所有方法实际上都是连接点,即连接点是程序类中客观存在的事务。AOP 通过切点定位到特定的连接点。类比:连接点相当于数据库中的记录,切点相当于查询条件。切点和连接点不是一对一的关系,一个切点匹配多个连接点,切点通过 org.springframework.aop.Pointcut 接口进行描述,它使用类和方法作为连接点的查询条件
6、在 Spring2.0 以上版本中, 可以使用基于 AspectJ 注解或基于 XML 配置的 AOP(AspectJ比Spring原生的AOP注解好用)
7、基于注解方式配置AOP通知
(1)使用Aspectj来配置Spring的AOP环境,Spring自己也有AOP框架,不过Aspectj好一点
(2)需要的jar包:aspectjrt.jar、aspectjtools.jar、aspectjweaver.jar、org.aspectj.matcher.jar
(3)基于注解的方式配置aop
①配置文件中加入aop命名空间,即:在spring配置文件的命名空间里面勾选aop
②配置文件中添加<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
③把横切关注点代码“beforeMethod()”抽象到切面类“LoggingAspect”中
④把切面类使用@Component加入IOC容器中
⑤切面内需要加入@Aspect注解
⑥在类中声明通知,即:在方法前加入(一个关注点可声明多个注解)
①前置通知(方法执行前执行):@Before
②后置通知(方法执行后执行):@After
③返回通知(方法返回后执行):@AfterRunning、
④异常通知(抛出异常后执行):@AfterThrowing
⑤环绕通知(围绕着方法执行):@Around
⑦为注解添加切入点表达式
⑧在关注点方法的属性加入JoinPoint函数,用于获取相关值
(4)AspectJ使用步骤:
① 添加AspectJ 类库(jar包)
② 将 aop Schema 添加到<beans>
根元素中
③ 在 Spring IOC 容器中启用 AspectJ 注解支持,即配置文件<beans>
中添加<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
④ 使用AOP的类(切面)的类名前面配置@Aspect
(5)AspectJ 支持 5 种类型的通知注解:
① @Before
: 前置通知, 在方法执行之前执行
② @After
: 后置通知, 在方法执行之后执行
③ @AfterRunning
: 返回通知, 在方法返回结果之后执行
④ @AfterThrowing
: 异常通知, 在方法抛出异常之后
⑤ @Around
: 环绕通知, 围绕着方法执行
8、文件
①TestMain.java:测试类
②AOPoperations.java:方法接口
③AOPopeartionsImpl.java:实现接口和接口方法的类
④LoggingAspect.java:优先级较低的切面类
⑤LoggingAspect2.java:优先级较高的切面类
⑥PointCut.java:存放代表可重用的切点表达式的方法的类
⑦annotationNotificationContext.xml:配置方法
9、TestMain.java
package com.demo.sshtest.aop2.annotationNotification;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestMain {
public static void main(String[] args) {
//创建spring的IOC容器
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("annotationNotificationContext.xml");
//从IOC容器中获取bean实例(这里获取的是接口类的实例,而不是实现接口的类的实例)
AOPoperations aoPopeartions = (AOPoperations)applicationContext.getBean(AOPoperations.class);
//使用bean
String result = aoPopeartions.addA("strsdlkfadkljklj");
System.out.println("-------------");
String result2 = aoPopeartions.addB("weefweewf");
System.out.println("-------------");
try {
String result3 = aoPopeartions.addCal("1","2a")<