AOP的相关术语:
- Joinpoint(连接点) :连接点是指那些被拦截到的点。在Spring中,点指的是方法,因为Spring只支持方法类型的连接点(可以对所有方法进行拦截)
- Pointcut(切入点):切入点是指我们要对哪些Joinpoint进行拦截的定义 (比如一个实现类中多个方法,对某个方法增强就是切入点)
- Advice(通知/增强):通知是指拦截到的Joinpoint之后所要做的事情。通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
- Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下,Introduction可以在运行期为类动态地添加一些方法
- Target(目标对象):是指代理的目标对象
- Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程
- Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类
- Aspect(切面):是切入点和通知的结合
AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待等。
通知注解类型如下:
- @Before:前置通知
- @AfterReturing:后置通知
- @Around:环绕通知
- @After:最终通知
- @AfterThrowing:异常抛出通知
下面例子:
public class CustomerDaoImpl implements CustomerDao{
@Override
public void save() {
System.out.println("保存客户。。。");
}
@Override
public void update() {
System.out.println("修改客户。。。");
}
}
我们使用AOP切面技术在CustomerDaoImpl的save方法之前引入日志:
首先我们先创建一个切面类:
/*
* 切面类:切 入点+通知
*/
public class MyAspectXml {
//通知(具体的增强)
public void log() {
System.out.println("记录日志...");
}
}
接下来我们在容器中配置AOP,在aop配置中,要引入ref="切面类",如果要想把日志在类之前输出就使用 before 关键字。
pointcut 记得要引入类的全路径。 代码通用。
<!-- 配置客户的Dao -->
<bean id="customerDao" class="com.Spring5AOP.CustomerDaoImpl"></bean>
<!--配置切面类 -->
<bean id="myAspectXml" class="com.Spring5AOP.MyAspectXml"></bean>
<!-- 配置AOP -->
<aop:config>
<!-- 配置切面类:切入点+通知 -->
<aop:aspect ref="myAspectXml"> <!-- 引入切面类 -->
<!-- 配置的是前置通知,save方法执行之前,增强的方法会执行 -->
<!-- 切入点表达式:execution (public void com.Spring5AOP.CustomerDaoImpl.save()) -->
<!-- 1.execution() 固定的,不能不写
2.public 可以省略不写
3.void ,返回值可以出现*--->
<aop:before method="log" pointcut="execution (public void com.Spring5AOP.CustomerDaoImpl.save())"/>
</aop:aspect>
</aop:config>
注:切入点表达式
- execution() 固定的, 不能不写
- public 可以省略不写
- void,返回值可以出现* 表示任意的返回值,返回值类型不能不写
- 可以使用 * 代替,不能不编写的,简写方式:*..*方法
最后创建测试类:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext3.xml")
public class AOP_Test {
@Resource(name="customerDao")
private CustomerDao customerDao;
@Test
public void run2() {
customerDao.save();
customerDao.update();
}
}
结果输出: