只是为了自己更容易记住,理解相关内容,所以写了一篇简单的文章,主要还是参考前辈的大作完成。高手勿喷。
1. 创建maven工程文件,其中pom.xml 文件的内容如下:
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
</dependencies>
这个文件与之前的文件其实是相同的,配置完成后,使用maven update下载jar文件
2. 创建一个实现类ShowService,只有一个方法:
package com.tanj.test;
public class ShowService {
public void show() {
System.out.println(getClass().toString() + " show Hello Spring Aop!");
}
}
3. 创建一个切面类ShowAspect
package com.tanj.test;
import org.aspectj.lang.ProceedingJoinPoint;
public class ShowAspect {
// before通知方法
public void beforeShow() {
System.out.println(getClass().toString() + " before show");
}
// after通知方法
public void afterShow() {
System.out.println(getClass().toString() + " after show");
}
// afterReturn通知方法
public void afterReturnShow() {
System.out.println(getClass().toString() + " afterReturn show");
}
// afterThrowing通知方法
public void afterThrowingShow() {
System.out.println(getClass().toString() + " afterThrowing show");
}
// around通知方法
public void aroundShow(ProceedingJoinPoint jpoint) {
try {
System.out.println(getClass().toString() + " around before show");
// 执行目标对象的连接点处的方法
jpoint.proceed();
System.out.println(getClass().toString() + " around after show");
} catch (Throwable e) {
System.out.println(getClass().toString() + " around afterThrowing show");
}
}
}
3. 相应的Spring 配置文件 applicationContext.xml 如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<aop:config>
<!-- 定义切面 引用通知的bean -->
<aop:aspect id="show-aspect1" ref="showAspect">
<!-- 设置切入点 -->
<aop:pointcut id="pointcut1" expression="execution(* com.tanj.test.ShowService.*(..))" />
<!--指定before通知方法为,ShowAspect.beforeShow(),引用切入点pointcut1 -->
<aop:before method="beforeShow" pointcut-ref="pointcut1" />
<!--指定after通知方法为,ShowAspect.afterShow(),引用切入点pointcut1 -->
<aop:after method="afterShow" pointcut-ref="pointcut1" />
<!--指定afterReturn通知方法为,ShowAspect.afterReturnShow(),引用切入点pointcut1 -->
<aop:after-returning method="afterReturnShow" pointcut-ref="pointcut1" />
<!--指定afterThrowing通知方法为,ShowAspect.afterThrowingShow(),引用切入点pointcut1 -->
<aop:after-throwing method="afterThrowingShow" pointcut-ref="pointcut1" />
<!--指定around通知方法为,ShowAspect.aroundShow(),引用切入点pointcut1 -->
<aop:around method="aroundShow" pointcut-ref="pointcut1" />
</aop:aspect>
</aop:config>
<!-- 生成切面通知的bean -->
<bean id="showAspect" class="com.tanj.test.ShowAspect" />
<!-- 生成com.tanj.test.ShowService -->
<bean id="showService" class="com.tanj.test.ShowService"></bean>
</beans>
4. 创建测试类MainTest:
package com.tanj.test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.tanj.test.ShowService;;
public class MainTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
ShowService showService = (ShowService)context.getBean("showService");
showService.show();
}
}
5. 运行测试类,可以看到结果。
注意: 本篇文章完全采用注解的方式,实现Spring的Aop 相关内容,但是很在实际应用中,可以根据需要,选择是用代码还是配置的方式实现。
参考的博客如下:
http://blog.csdn.net/sigangjun/article/details/12840853 个人在练习的时候,稍微做了一些改动,以方便个人理解。