本文工具:IDEA2020.1、maven3.6.3
本文源代码下载(密码7380):https://url47.ctfile.com/f/64055047-1499220694-7b91cb?p=7380
一、注解说明
注解名称 | 描述 |
@Aspect | 配置切面 |
@Pointcut | 配置切入点 |
@Before | 配置前置通知 |
@After | 配置后置通知 |
@Around | 配置环绕通知 |
@AfterReturning | 配置返回通知 |
@AfterThrowing | 配置异常通知 |
二、创建maven项目
打开IDEA,点击“File—>New—>Project”

我们 选择“Maven”项目,然后点击“Next”

改一下项目名称,然后点击“Finish”看,这里就命名为chapter08

二、引入依赖
打开项目的pom.xml文件

引入依赖后,整个pom文件参考如下:
<?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>chapter08</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <!-- spring-core的依赖包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.2.8.RELEASE</version> </dependency> <!-- spring-beans的依赖包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.2.8.RELEASE</version> </dependency> <!-- spring-context的依赖包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.8.RELEASE</version> </dependency> <!-- spring-expression的依赖包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>5.2.8.RELEASE</version> </dependency> <!-- commons-logging的依赖包 --> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.2.8.RELEASE</version> </dependency> <!-- aspectjrt包的依赖 --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.9.1</version> </dependency> <!-- aspectjweaver包的依赖 --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.6</version> </dependency> </dependencies> </project>
注:如果依赖爆红,请仔细检查maven配置。
二、创建Dao层和Impl层
我们右击 java文件夹,选择New—>package,文件夹的名字就叫demo4

右击刚刚创建的demo4文件夹,选择New—>Java Class

这个接口名称为 UserDao,类型选择Interface

那么,UserDao的代码参考如下:
package demo3; public interface UserDao { public void insert(); public void delete(); public void update(); public void select(); }
继续创建UserDao的实现层,右击demo3,选择New——>Java Class

名称叫UserDaoImpl,

代码参考如下:
package demo3; public class UserDaoImpl implements UserDao{ public void insert() { System.out.println("添加用户信息"); } public void delete() { System.out.println("删除用户信息"); } public void update() { System.out.println("更新用户信息"); } public void select() { System.out.println("查询用户信息"); } }
三、创建切面类
在demo4文件夹下继续创建一个切面类,名称为AnnoAdvice

代码参考如下:
package demo4;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
@Aspect
public class AnnoAdvice {
//切点
@Pointcut("execution( * demo4.UserDaoImpl.*(..))")
public void poincut(){
}
//前置通知
@Before("poincut()")
public void before(JoinPoint joinPoint){
System.out.print("这是前置通知!");
System.out.print("目标类是:"+joinPoint.getTarget());
System.out.println(",被织入增强处理的目标方法为:"+
joinPoint.getSignature().getName());
}
//返回通知
@AfterReturning("poincut()")
public void afterReturning(JoinPoint joinPoint){
System.out.print("这是返回通知!");
System.out.println("被织入增强处理的目标方法为:"+
joinPoint.getSignature().getName());
}
//环绕通知
@Around("poincut()")
public Object around(ProceedingJoinPoint point) throws Throwable{
System.out.println("这是环绕通知之前的部分!");
//调用目标方法
Object object = point.proceed();
System.out.println("这是环绕通知之后的部分!");
return object;
}
//异常通知
@AfterThrowing("poincut()")
public void afterException(){
System.out.println("异常通知");
}
//后置通知
@After("poincut()")
public void after(){
System.out.println("这是后置通知!");
}
}
四、编写配置文件
右击 resources文件夹,选择New—>File

文件名称为applicationContext-Anno.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 -->
<bean name="userDao" class="demo4.UserDaoImpl"/>
<bean name="AnnoAdvice" class="demo4.AnnoAdvice"/>
<!-- 开启@aspectj的自动代理支持 -->
<aop:aspectj-autoproxy/>
</beans>
五、编写测试类
继续右击demo4,选择New—>Java Class,类名为TestAnnotation

代码参考如下:
package demo4;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestAnnotation {
public static void main(String[] args){
ApplicationContext context = new
ClassPathXmlApplicationContext("applicationContext-Anno.xml");
UserDao userDao = context.getBean("userDao",UserDao.class);
userDao.delete();
System.out.println();
userDao.insert();
System.out.println();
userDao.select();
System.out.println();
userDao.update();
}
}
七、测试效果
运行测试类执行效果如下:
