Spring AOP
面向切面编程
面向切面编程 AOP是软件编程思想发展到一定阶段的产物,是对象面向对象编程的有益补充,简单来说,就是在不改源代码的基础上,增强代码的某些功能(如:日志、异常处理、事务控制等)。
基本概念
切面:一个模块化的横切逻辑,可能会横切多个对象。
连接点:程序执行中的某个具体的执行点。
增强处理:切面在某个特定连接点上执行的代码逻辑。
切入点:对连接点的特征进行描述,可以用正则表达式。增强处理和一个切入点表达式相关联,并在与这个切入点匹配的某个连接点上运行。
目标对象:被一个或多个切面增强的对象。
AOP代理:由AOP框架所创建的对象,实现执行增强处理的方法。
织入:将增强处理连接到应用程序中的类型或对象上的过程。
增强处理类型:前置增强,后置增强,环绕增强,异常抛出增强,最终增强等类型。
所需jar包
aopalliance-1.0.jar
aspectjweaver-1.6.9.jar
spring-aop-3.2.13.RELEASE.jar
import org.aspectj.lang.JoinPoint;
public class UserServiceLogger {
private static final Logger logger = Logger.getLogger(UserServiceLogger.class);
//前置增强
public void before(JoinPoint jp) {
logger.info("调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法.方法入 参:"+Arrays.toString(jp.getArgs()));
}
}
//配置文件
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
<bean id="dao" class="dao.impl.UserDaoImpl"></bean>
<bean id="service" class="service.impl.UserServiceImpl">
<property name ="dao" ref="dao"></property>
</bean>
<bean id="theLogger" class="aop.UserServiceLogger"></bean>
<aop:config>
<!-- 定义一个切入点表达式-->
<aop:pointcut expression="execution(*cn.smbms.service..*.*(..))" id="serviceMethod"/>
<!-- 引用包含增强方法的Bean-->
<aop:aspect ref="theLogger">
<!--设置前置增强-->
<aop:before method="before" pointcut-ref="pointcut">
</aop:before>
</aop:config>
以上代码是更写配置文件 实现切面增强功能,但是会发现配置很负责,所以我们有简单的注解写法。
导入所需要的包
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class UserServiceLogger {
private static final Logger logger = Logger.getLogger(UserServiceLogger.class);
@Pointcut("execution(* service.UserService.*(..))")
public void pointcut() {
}
@Before("execution(* service.UserService.*(..))")
public void before(JoinPoint jp) {
logger.info("调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法.方法入参:"+Arrays.toString(jp.getArgs()));
}
@AfterReturning(pointcut="execution(* service.UserService.*(..))",
returning="returnValue")
public void afterReturning(JoinPoint jp,Object returnValue) {
logger.info("调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法的返回值:"+returnValue);
}
}
//配置xml文件
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
<context:component-scan base-package="service,dao"/>
<bean class="aop.UserserviceLogger"></bean>
<aop:aspectj-autoproxy>