Aspect Oriented Programming 面向切面编程。AOP还是以OOP为基础,只不过将共同逻辑封装为组件,然后通过配置的方式将组件动态切入到原有组件中。这样做的有点有:可以在不修改原有组件功能代码的基础上,对组件进行扩充,对公共需要和传统业务进行解耦。
2,语法
1.切面组件(加什么功能?) Aspect
在组件中寻找共通位置和时机,将追加功能切入到原有组件中。追加的功能组件一般被称为切面组件。
2. 切入点(给谁加?) Pointcut
切入点用于指定切入目标组件或方法。 Spring 提供了多种表达式,下面介绍方法方法限定表达式、类型限定表达式(使用的最多)、Bean名称限定表达式
方法限定表达式
execution( 修饰符? 返回类型 方法名 ( 参数列表 ) 抛出异常? ) // 所有以 find 开头的方法要被切入追加功能 execution(* find*(..)) //DeptService 类中所有方法要切入追加功能 execution(* cn.xdl.service.DeptService.*(..)) //cn.xdl.service 包下所有类所有方法 execution(* cn.xdl.service.*.*(..)) //cn.xdl.service 包及子包下所有类所有方法 execution(* cn.xdl.service..*.*(..))
类型限定表达式
within( 类型 ) //DeptService 组件所有方法要被切入追加功能 within(cn.xdl.service.DeptService) //cn.xdl.service 包下所有类所有方法 within(cn.xdl.service.*) //cn.xdl.service 包及子包下所有类所有方法 within(cn.xdl.service..*)
Bean 名称限定表达式
bean(Spring 容器中组件的 id 名 ) //id=deptService 组件的所有方法 bean(deptService) //id 以 Service 结尾的组件的所有方法 bean(*Service)
3. 通知(什么时候加?) Advice
通知用于决定切面组件追加的时机,例如在原有组件方法前、方法后、抛出异常之后等。
try{ // 追加逻辑 -- 》前置通知 <aop:before> // 原有组件的方法 // 追加逻辑 -- 》后置通知 <aop:after-returning> } catch(){ // 追加逻辑 -- 》异常通知 <aop:after-throwing> }finally{ // 追加逻辑 -- 》最终通知 <aop:after> } //环绕通知:等价于前置 + 后置综合效果 <aop:around>
3,Demo
首先利用注解的方式把SpringMVC的框架搭建好。下面是项目的结构图:
User类:
package cn.xdl.bean; public class User { private int id; private String name; private String password; public User() { super(); } public User(int id, String name, String password) { super(); this.id = id; this.name = name; this.password = password; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }