pom.xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>spring_AOP</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.9</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.9</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.8.M1</version>
</dependency>
</dependencies>
</project>
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: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
">
<!-- 目标对象-->
<bean id="target" class="aoptest.Target"/>
<!-- 切面对象-->
<bean id="myaspect" class="aoptest.Myaspect" />
<aop:config>
<aop:aspect ref="myaspect">
<aop:before method="before" pointcut="execution(public void aoptest.Target.save())" />
</aop:aspect>
</aop:config>
</beans>
自定义切面对象:
package aoptest;
public class Myaspect {
public void before(){
System.out.println("前置增强.....");
}
}
定义接口方法:
package aoptest;
public interface TargetInterface {
void save();
}
目标对象:
package aoptest;
public class Target implements TargetInterface {
@Override
public void save() {
System.out.println("save running ....");
}
}
测试类:
package aoptest;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class AopTest {
@Autowired
private TargetInterface target;
@Test
public void test1(){
target.save();
}
}
优化后的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: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
">
<!-- 目标对象-->
<bean id="target" class="aoptest.Target"/>
<!-- 切面对象-->
<bean id="myaspect" class="aoptest.Myaspect" />
<aop:config>
<aop:aspect ref="myaspect">
<aop:before method="before" pointcut="execution( * aoptest.*.*(..))" />
</aop:aspect>
</aop:config>
</beans>
自定义切面类补充:
package aoptest;
import org.aspectj.lang.ProceedingJoinPoint;
public class Myaspect {
public void before(){
System.out.println("前置增强.....");
}
public void afterReturning(){
System.out.println("后置增强....");
}
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("环绕前增强......");
Object proceed = pjp.proceed();//切点方法 ,proceed:继续运行
System.out.println("环绕后增强......");
return proceed;
}
public void afterthrowing(){
System.out.println("抛出异常增强...");
}
}
优化后的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: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
">
<!-- 目标对象-->
<bean id="target" class="aoptest.Target"/>
<!-- 切面对象-->
<bean id="myaspect" class="aoptest.Myaspect" />
<aop:config>
<aop:aspect ref="myaspect">
<!-- <aop:before method="before" pointcut="execution( * aoptest.*.*(..))" />-->
<aop:after-throwing method="afterthrowing" pointcut="execution( * aoptest.*.*(..))" />
<aop:around method="around" pointcut="execution( * aoptest.*.*(..))" />
</aop:aspect>
</aop:config>
</beans>
优化后的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: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
">
<!-- 目标对象-->
<bean id="target" class="aoptest.Target"/>
<!-- 切面对象-->
<bean id="myaspect" class="aoptest.Myaspect" />
<aop:config>
<aop:aspect ref="myaspect">
<aop:pointcut id="myPointcut" expression="execution( * aoptest.*.*(..))"/>
<!-- <aop:before method="before" pointcut="execution( * aoptest.*.*(..))" />-->
<!-- <aop:after-throwing method="afterthrowing" pointcut="execution( * aoptest.*.*(..))" />-->
<!-- <aop:around method="around" pointcut="execution( * aoptest.*.*(..))" />-->
<aop:around method="around" pointcut-ref="myPointcut" />
<aop:before method="before" pointcut-ref="myPointcut" />
</aop:aspect>
</aop:config>
</beans>