第一步 增加maven一依赖
pom.xml
<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.spring05</groupId>
<artifactId>spring05_custom_aop</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!--版本管理 -->
<properties>
<spring.version>4.1.3.RELEASE</spring.version>
<aspectj.version>1.6.11</aspectj.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!--测试包,自动生成 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!--spring aop依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring上下文包,在加载spring配置文件时用到 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!--使用AspectJ方式注解需要相应的包 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<!--使用AspectJ方式注解需要相应的包 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</project>
第二步 编写 UserDao
UserDao.java
package org.spring05;
public interface UserDao {
void add();
void delete();
}
第三步 编写 UserDaoImpl
UserDaoImpl.java
package org.spring05;
/**
* 用户类(领域业务对象类)
* @author yxl
*
*/
public class UserDaoImpl implements UserDao {
public void add() {
//int i=3/0;
System.out.println("增加了一个用户!");
}
public void delete() {
System.out.println("删除了一个用户!");
}
}
第四步 编写切面类Log
Log.java
package org.spring05;
import java.lang.reflect.Method;
import org.aopalliance.intercept.MethodInvocation;
import org.aspectj.lang.JoinPoint;
/**
切面类 (公共业务类) 自定义方式实现不用继承任何类
*/
public class Log {
/**
* 前置通知
* @param method 被调用对象的方法
* @param args 被调用的方法参数
* @param target 被调用的方法的目标对象
*/
public void myBefore(JoinPoint joinPoint) throws Throwable {
System.out.println("前置通知:");
}
/**
* 后置通知
*/
public void myAfter(JoinPoint joinPoint) throws Throwable {
System.out.println("后置通知");
}
/**
* 环绕通知
*/
public Object invoke(MethodInvocation arg0) throws Throwable {
System.out.println("环绕通知开始");
Object result=arg0.proceed();
System.out.println("环绕通知结束");
return result;
}
/**
* 增强处理 返回后通知
* 增强处理将在目标方法正常完成后被织入
* @param joinPoint
*/
public void myAfterReturning(JoinPoint joinPoint){
System.out.println("增强处理 返回后通知");
}
/**
* 异常通知
*/
public void myThrowing(JoinPoint joinPoint,Exception e) throws Throwable {
System.out.println("后置通知");
}
}
第五步 编写spring配置文件
beans.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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
">
<bean id="userDaoImpl" class="org.spring05.UserDaoImpl"/>
<bean id="log" class="org.spring05.Log"></bean>
<aop:config>
<aop:aspect ref="log">
<!-- 配置(连接点)关注点。指哪些业务方法需要增加公共的功能方法。 expression:匹配规则,第一个*代表返回值。参数括号里面的两个.. 表示所有参数。 -->
<aop:pointcut id="pointcut" expression="execution(public * org.spring05.*.*(..))"/>
<!-- 前置通知 -->
<aop:before method="myBefore" pointcut-ref="pointcut"/>
<!-- 后置通知 -->
<aop:after method="myAfter" pointcut-ref="pointcut"/>
<!-- AfterReturning 增强处理将在目标方法正常完成后被织入。 -->
<aop:after-returning method="myAfterReturning" pointcut-ref="pointcut"/>
<!-- 异常通知:在方法抛出异常后调用通知 -->
<aop:after-throwing method="myThrowing" pointcut-ref="pointcut" throwing="e"/>
</aop:aspect>
</aop:config>
</beans>
第六步 编写测试类
Test.java
package org.spring05;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("beans.xml");
UserDao userDao = (UserDao) app.getBean("userDaoImpl");
userDao.add();
}
}
控制台结果
前置通知:
增加了一个用户!
后置通知
增强处理 返回后通知