强烈推荐一个大神的人工智能的教程:http://www.captainai.net/zhanghan
相关概念 |
1.连接点(Joinpoint):类里面哪些方法可以被增强,这些方法称为连接点
2.切入点:在类里可以有很多的方法被增强,实际增强的方法称为切入点
3.通知/增强:增强的逻辑,称为增强
- 前置通知:在方法之前执行
- 后置通知:在方法之后执行
- 异常通知:方法出现异常
- 最终通知:在后置之后执行
- 环绕通知:在方法之前和之后执行
4.切面(Aspect):增强具体方法的过程称为切面(把增强用到切入点的过程)
表达式配置切入点 |
- execution(<访问修饰符>?<返回类型><方法名>(<参数><异常>)
以上表达式中的访问修饰符和返回类型,方法名都可使用*表示,其中需要注意的地方是访问修饰符和返回类型之间必须有一个空格。
execution(* zh.spring.aop.Book.*(..))
AOP原理 |
AOP的使用 |
- spring-aop
- aopalliance
- aspectjweaver
- spring-aspects
建立被增强的类Book:
public class Book {
public void add(){
System.out.println("add......");
}
}
建立aop增强类MyBook:
public class MyBook {
public void before1(){
System.out.println("前置增强...");
}
public void after1(){
System.out.println("后置增强...");
}
public void around1(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
//方法之前
System.out.println("方法之前...");
//执行被增强的方法
proceedingJoinPoint.proceed();
//方法之后
System.out.println("方法之后...");
}
}
在resource下创建spring-aop.xml配置文件,分别配置前置,后置和环绕通知:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--1. 配置对象-->
<bean id="book" class="zh.spring.aop.Book"></bean>
<bean id="myBook" class="zh.spring.aop.MyBook"></bean>
<!--2. 配置aop操作-->
<aop:config>
<!--2.1 配置切入点-->
<aop:pointcut id="pointcut1" expression="execution(* zh.spring.aop.Book.*(..))"/>
<!--2.2 配置切面-->
<aop:aspect ref="myBook">
<!--配置增强类型 method:增强类里使用哪个方法作为前置-->
<aop:before method="before1" pointcut-ref="pointcut1"/>
<!--后置增强-->
<aop:after-returning method="after1" pointcut-ref="pointcut1"/>
<!--环绕通知-->
<aop:around method="around1" pointcut-ref="pointcut1"/>
</aop:aspect>
</aop:config>
</beans>
写测试类,测试结果:
public class TestAOP {
@Test
public void testAop(){
//加载spring配置文件,创建对象
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-aop.xml");
//得到配置创建的对象
Book book =(Book)context.getBean("book");
book.add();
}
}
执行结果如下:
前置增强...
方法之前...
add......
方法之后...
后置增强...
四个处理器的优先级 |
Before-->Around-->AfterReturning-->After