首先是在application.xml中加入以下配置
声明激活自动扫描组件功能
xmlns:aop="http://www.springframework.org/schema/aop"
在xsi:schemaLocation
属性中加入这2个模式文档
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
最后是激活自动代理功能
<aop:aspectj-autoproxy/>
具体如下:
<?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"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<!-- 启用AspectJ对Annotation的支持 -->
<aop:aspectj-autoproxy/>
</beans>
然后就可以直接开始写Aspect切面类了
这里demo中只演示了一个方法,作用是对项目中所有controller的方法进行日志输出
@Aspect
@Component
public class DemoAspect {
/** 切点表达式 */
private static final String ASPECT_CONTROLLER_EXECUTION="execution(* com.*.controller.*.*(..))";
/**
* 对项目中所有controller进行日志输出
*
* 这里的demo我用的是@before注解:before在核心业务执行前执行,不能阻止核心业务的调用。
* 此外,还有其他如
* after,Around,AfterReturning,AfterThrowing,...
* 等注解,这里不做示范
* @param joinPoint
*/
@Before(value=ASPECT_CONTROLLER_EXECUTION)
public void controllerLog(JoinPoint joinPoint){
//获取类名
String className = joinPoint.getTarget().getClass().getSimpleName();
//获取方法名
String methodName = joinPoint.getSignature().getName();
//进行log的处理
System.out.println(className+" : "+methodName);
}
}
@Aspect
作用是将类声明成一个切面类
@Component
作用是将切面类声明为一个bean
注意: 切点指定的方法所在的类也同样需由spring注入才能生效