文章目录
- 前言
- 一、准备工作
- 1、添加相应的依赖
- 2、添加相应的命名空间
- 3、创建目标类
- 4、创建切面
- 二、使用AOP
- 1.在切面类中编写增强代码以及切点表达式
- 2、开启aspectj的自动代理
- 3、测试类
- 4、测试结果
前言
Spring对AOP的实现包括以下三种方式
1、Spring框架结合AspectJ框架实现的AOP,基于注解方式。
2、Spring框架结合AspectJ框架实现的AOP,基于XML方式。
3、Spring框架自己实现的AOP,基于XML配置方式
实际开发中,都是Spring+AspectJ来实现AOP
一、准备工作
1、添加相应的依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
</dependencies>
2、添加相应的命名空间
spring.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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
</beans>
3、创建目标类
UserService:
package com.powernode.spring.service;
import org.springframework.stereotype.Service;
@Service("userservice") //将这个类纳入spring容器管理
public class UserService { //目标类
public void login(){ //目标方法
System.out.println("系统正在进行身份认证....");
}
}
4、创建切面
LogAspect:
package com.powernode.spring.service;
import org.springframework.stereotype.Service;
@Aspect //切面类是需要@Aspect注解进行标注的
@Service("logAspect") //将这个类纳入spring容器管理
public class LogAspect { //切面
//切面=通知(增强代码)+切点(方法)
}
将切面和目标类纳入spring容器管理,在spring.xml中需要进行组件扫描
<context:component-scan base-package="com.powernode.spring.service"></context:component-scan>
二、使用AOP
1.在切面类中编写增强代码以及切点表达式
@Service("logAspect") //将这个类纳入spring容器管理
@Aspect //切面类是需要@Aspect注解进行标注的
public class LogAspect { //切面
//切面=通知(增强代码)+切点(方法)
//通知就是增强就是具体的要编写的代码
//这里通知Advice 以方法的形式出现
//@Before(切点表达式 确定在哪里进行切入)标注的方法就是一个前置通知,在目标类的目标方法执行之前执行
@Before("execution(* com.powernode.spring.service.UserService.* (..))")
public void beforeAdvice(){
System.out.println("我是一个通知,我是一段增强代码……");
}
}
2、开启aspectj的自动代理
<!--开启aspectj的自动代理-->
<!--spring容器在扫描类的时候查看该类上是否有@Aspect注解,如果有,给切入点表达式涉及的类的对象创建代理对象-->
<!--proxy-target-class = true 表示强制使用CGLib动态代理
proxy-target-class = false 这是默认值 表示接口使用JDK动态代理
-->
<aop:aspectj-autoproxy proxy-target-class="true" />
3、测试类
@Test
public void testBefore(){
ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
UserService userservice = (UserService) ac.getBean("userservice");
userservice.login();
}