首先新建一个Spring框架环境,忘记搭建步骤可以去看主页之前的怎样搭建Spring框架环境
AOP环境搭建建立在Spring环境上,然后再进行以下步骤
可以去Maven官网进行下载,也可以复制下面的依赖版本
<!--Spring AOP-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
需要添加命名空间
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
添加过后的xml文件如下,要开启自动化扫描
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--开启自动化扫描-->
<context:component-scan base-package="com.svt"/>
</beans>
完善dao层、service层以及controller层,在各自层内新建各自的类并加以注释实例化
@Repository
public class UserDao {
}
@Service
public class UserService {
}
@Controller
public class UserController {
}
这样基本的AOP环境就搭建好了
execution(public *(..))
execution(* set*(..))
execution(* com.svt.service.*.*(..))
execution(* com.svt.service..*,*(..))
代表的是方法的修饰范围 (pubLic、private、protected)
如果取值是*,则表示所有范围
@Pointcut("execution(* com.svt.service.*.*(..))")
public void cut(){
}
声明前置通知,并将通知应用到指定的切入点上
目标类的方法执行前,执行该通知
value=""内写切入点方法
@Before(value = "cut()")
public void before(){
System.out.println("前置通知...");
}
声明返回通知,并将通知应用到指定的切入点上
目标类的方法在无异常执行后,执行该通知
@AfterReturning(value = "cut()")
public void afterReturn(){
System.out.println("返回通知...");
}
声明最终通知,并将通知应用到指定的切入点上
目标类的方法在执行后,执行该通知(有异常和无异常最终都会执行)
和finally有点像
@After(value = "cut()")
public void after(){
System.out.println("最终通知...");
}
声明异常通知,并将通知应用到指定的切入点上
目标类的方法在执行异常时,执行该通知
@AfterThrowing(value = "cut()",throwing = "e")
public void afterThrow(Exception e){
System.out.println("异常通知...======异常原因:"+e.getMessage());
}
声明环绕通知,并将通知应用到指定的切入点上
目标类的方法执行前后,都可通过环绕通知定义响应的处理
需要通过显示调用的方法,否则无法访问指定方法 pjp.proceed();
@Around(value = "cut()")
public Object around(ProceedingJoinPoint pjp){
System.out.println("环绕通知-前置通知...");
Object object=null;
//object=pjp.proceed();
try {
//显示调用的方法
object=pjp.proceed();
System.out.println(pjp.getTarget());
System.out.println("环绕通知-返回通知...");
} catch (Throwable throwable) {
throwable.printStackTrace();
System.out.println("环绕通知-异常通知...");
}
System.out.println("环绕通知-最终通知...");
return object;
}