首先在pom.xml文件中添加坐标
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.2</version>
</dependency>
</dependencies>
一、基于xml文件方式实现aop切面
1、创建目标类
package com.qgq.test;
/**
* 需要增强的类
*/
public class StrongMain {
public void testMain(){
System.out.println("执行某种操作。。。。。");
}
}
2、创建切面类并编写对应增强方法
package com.qgq.test;
import org.aspectj.lang.ProceedingJoinPoint;
/**
* 切面类
*/
public class MyAspect {
/**
* 前置增强
*/
public void before(){
System.out.println("执行前置增强。。。。");
}
/**
* 后置增强
*/
public void afterReturning(){
System.out.println("执行后置增强。。。。");
}
/**
* 异常增强
*/
public void afterThrow(){
System.out.println("执行异常增强。。。。");
}
/**
* 环绕增强
* @param pjp 切点对象
* @return
*/
public Object around(ProceedingJoinPoint pjp){
try {
System.out.println("上环绕增强。。。。");
pjp.proceed();
System.out.println("下环绕增强。。。。");
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return pjp;
}
/**
* 最终增强 相当于try..catch..finally中的finally,无论是否异常都会执行
*/
public void after(){
System.out.println("执行最终增强。。。。");
}
}
3、创建xml配置文件,resource右键 new->XML Configuration File,选择Spring Config,并创建aop命名空间(beans标签中第三行、第五行)
<?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"
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">
</beans>
4、配置容器管理及aop切点
最终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: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">
<!--将需要增强的类交给ico容器管理-->
<bean id="strongMain" class="com.qgq.test.StrongMain"></bean>
<!--将需要切面类交给ico容器管理-->
<bean id="myAspect" class="com.qgq.test.MyAspect"></bean>
<!--aop配置织入-->
<aop:config>
<!--将切点提取出来,下方增强直接pointcut-ref调用-->
<!--此处第一个*代表任意修饰符及返回值,第二个*代表test包下所有类,第三个*代表所有方法-->
<!--(..)代表任意参数-->
<aop:pointcut id="pointcut" expression="execution(* com.qgq.test.*.*(..))"></aop:pointcut>
<aop:aspect ref="myAspect">
<!--前置增强-->
<aop:before method="before" pointcut-ref="pointcut"></aop:before>
<!--后置增强-->
<aop:after-returning method="afterReturning" pointcut-ref="pointcut"></aop:after-returning>
<!--环绕增强-->
<aop:around method="around" pointcut-ref="pointcut"></aop:around>
<!--异常增强-->
<aop:after-throwing method="afterThrow" pointcut-ref="pointcut"></aop:after-throwing>
<!--最终增强-->
<aop:after method="after" pointcut-ref="pointcut"></aop:after>
</aop:aspect>
</aop:config>
</beans>
5、创建一个类用于执行测试
package com.qgq.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args){
//加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplicationContext.xml");
//从ioc容器中获取bean
StrongMain strongMain = (StrongMain)applicationContext.getBean("strongMain");
//调用增强后的方法
strongMain.testMain();
}
}
注意:异常增强正常情况下不会执行,可以在目标方法中手动创造个异常,如经典的int i=1/0
public void testMain(){
int i = 1 / 0;
System.out.println("执行某种操作。。。。。");
}
执行一下,触发异常增强,(其他增强可以自己测一下,这里不做过多阐述)
二、基于注解方式实现aop切面
1、创建目标类
package com.qgq.test02;
import org.springframework.stereotype.Component;
//将目标类交给ico容器管理
@Component("strongMain02")
public class StrongMain02 {
public void testMain(){
System.out.println("执行某种操作。。。。。");
}
}
2、创建切面类并编写对应增强方法
package com.qgq.test02;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
//将需要切面类交给ico容器管理
@Component("myAspect02")
//告诉spring,当前类为切面类
@Aspect
public class MyAspect02 {
/**
* 提取切点,下方增强方法直接使用
*/
@Pointcut("execution(* com.qgq.test02.*.*(..))")
public void pointcut(){
}
/**
* 前置增强,注解中参数为调用的切点方法,也可以写MyAspect02.pointcut()
*/
@Before("pointcut()")
public void before(){
System.out.println("执行前置增强。。。。");
}
/**
* 后置增强
*/
@AfterReturning("pointcut()")
public void afterReturning(){
System.out.println("执行后置增强。。。。");
}
/**
* 异常增强
*/
@AfterThrowing("pointcut()")
public void afterThrow(){
System.out.println("执行异常增强。。。。");
}
/**
* 环绕增强
* @param pjp 切点对象
* @return
*/
@Around("pointcut()")
public Object around(ProceedingJoinPoint pjp){
try {
System.out.println("上环绕增强。。。。");
pjp.proceed();
System.out.println("下环绕增强。。。。");
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return pjp;
}
/**
* 最终增强
*/
@After("pointcut()")
public void after(){
System.out.println("执行最终增强。。。。");
}
}
3、创建xml配置文件,resource右键 new->XML Configuration File,选择Spring Config,并创建aop命名空间(beans标签中第三行、第五行),xml文件中仅需扫描包、开启aop自动代理
<?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:context="http://www.springframework.org/schema/context"
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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--扫描包-->
<context:component-scan base-package="com.qgq.test02" />
<!--开启aop自动代理,若不开启无法执行增强方法-->
<aop:aspectj-autoproxy />
</beans>
5、创建一个类用于执行测试
package com.qgq.test02;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test02 {
public static void main(String[] args){
//加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplicationContext.xml");
//从ioc容器中获取bean
StrongMain02 strongMain02 = (StrongMain02)applicationContext.getBean("strongMain02");
//调用增强后的方法
strongMain02.testMain();
}
}
本文仅测试使用aop,具体实现可以根据项目所需。