1、AOP面向切面编程
面向切面编程的本质:面向切面编程,指扩展功能不修改源代码,将功能代码从业务逻辑代码中分离出来。
1主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等等。
2主要意图:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
2、AOP原理
- 将复杂的需求分解出不同方面,将散布在系统中的公共功能集中解决
- 采用代理机制组装起来运行,在不改变原程序的基础上对代码段进行增强处理,增加新的功能。
3、AOP相关术语
1 增强处理类型
- 前置增强:目标方法调用前
- 后置增强:目标方法调用后
- 环绕增强:前置+后置
- 异常抛出增强:只有在目标方法抛出异常时才执行
- 最终增强:finally
2 AOP的设计单元
术语名称 | 描述 |
切面(Aspect) | 横切关注点而被模块化的类,称之为切面 |
通知(Advice) | 切面要完成的工作,具体指代切面类中的某个方法 |
连接点(Join Point) | 一个应用在执行的过程中能被插入切面的一个点 |
切点(Point Cut) | 通配表达式,可以匹配一个或多个连接点 |
织入(Weaving) | 将切面应用到目标对象的代理对象的过程 |
4、AOP案例实现增强
(1)导入依赖
(2)实体类UserInfo 实现Serializable接口
(3)mapper中IUserInfoMapper接口
(4)mapper接口的实现类IUserInfoMapperImpl
(5)service中IUserInfoService接口
(6)service中接口实现类IUserInfoServiceImpl
(7)编码方式实现AOP
(8)增强类
(9)配置文件applicationContext.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:p="http://www.springframework.org/schema/p"
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"> <!--声明Daobean bean的注入注入的都是实现类-->
<bean id="iUserInfoMapper" class="cn.spring.mapper.impl.IUserInfoMapperImpl"></bean>
<!--声明Service-->
<bean id="iUserInfoService" class="cn.spring.service.impl.IUserInfoServiceImpl">
<!--setter方法怎么注入:找到Name属性值,将属性值的开头改为大写,然后前缀加上setIUserInfoMapper-->
<property name="iUserInfoMapper" ref="iUserInfoMapper"></property>
</bean> <!--切面:增强类-->
<bean id="myAdvice" class="cn.spring.advice.MyAdvice"></bean>
<!--增加处理
切点:你要对哪一个方法进行增强 expression:切点表达式匹配的
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?)
modifiers-pattern:方法的可见性,如public,protected;
ret-type-pattern:方法的返回值类型,如int,void等;
declaring-type-pattern:方法所在类的全路径名,如com.spring.Aspect;
name-pattern:方法名类型,如buisinessService();
param-pattern:方法的参数类型,如java.lang.String;
throws-pattern:方法抛出的异常类型,如java.lang.Exception;
通配符:
*通配符,该通配符主要用于匹配单个单词,或者是以某个词为前缀或后缀的单词。
..通配符,该通配符表示0个或多个项
-->
<aop:config>
<!--切点-->
<aop:pointcut id="pointcut" expression="execution(* *..service.*.*(..))"/>
<!--织入 将增强处理和切点表达式符合的方法关联到一起-->
<aop:advisor advice-ref="myAdvice" pointcut-ref="pointcut"></aop:advisor>
</aop:config>
</beans>
(10)测试类
(11)控制台 实现增强