开始使用
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
系统要求:
本文采用Java 1.8.0_102、Spring Boot 1.5.9调试通过。
使用Maven构建项目
- 通过SPRING INITIALIZR工具产生基础项目
- 访问:http://start.spring.io/
- 选择构建工具Maven Project、Spring Boot版本1.5.9以及一些工程基本信息
点击Generate Project下载项目压缩包
- 解压项目包,并用IDE以Maven项目导入,以IntelliJ IDEA 14为例:
- 菜单中选择File–>New–>Project from Existing Sources...
- 选择解压后的项目文件夹,点击OK
- 点击Import project from external model并选择Maven,点击Next到底为止。
- 若你的环境有多个版本的JDK,注意到选择Java SDK的时候请选择Java 7以上的版本
项目结构解析
通过上面步骤完成了基础项目的创建,Spring Boot的基础结构共三个文件(具体路径根据用户生成项目时填写的Group所有差异):
- src/main/java下的程序入口:Application
- src/main/resources下的配置文件:application.properties
- src/test/下的测试入口:ApplicationTests
引入AOP模块
引入aop模块,需添加spring-boot-starter-aop模块:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
</dependencies>
编写Hello服务
- 创建package命名为com.learn.service(根据实际情况修改)
- 创建接口HelloService,内容如下
public interface HelloService {
void sayHello();
}
- 创建package命名为com.learn.service.impl(根据实际情况修改)
- 创建实现类HelloServiceImpl,内容如下
@Service
public class HelloServiceImpl implements HelloService {
@Override
public void sayHello() {
System.out.println("hello aop");
}
}
编写单元测试用例
打开的src/test/下的测试入口ApplicationTests类。下面编写一个简单的单元测试,具体如下:
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
@Resource
private HelloService helloService;
@Test
public void test() {
helloService.sayHello();
}
}
运行可以看到结果:
hello aop
使用aop
- 创建package命名为com.learn.aop(根据实际情况修改)
- 创建类HelloServiceAop,内容如下
@Aspect
@Component
public class HelloServiceAop {
//匹配com.learn.service.impl包及其子包下的所有类的所有方法
@Pointcut("execution(* com.learn.service.impl..*.*(..))")
public void executeService(){
}
@Before("executeService()")
public void doBeforeAdvice(JoinPoint joinPoint){
System.out.println("我是前置通知!!!");
//获取目标方法的参数信息
Object[] obj = joinPoint.getArgs();
System.out.println(obj);
//AOP代理类的信息
joinPoint.getThis();
//代理的目标对象
joinPoint.getTarget();
//用的最多 通知的签名
Signature signature = joinPoint.getSignature();
//代理的是哪一个方法
System.out.println(signature.getName());
//AOP代理类的名字
System.out.println(signature.getDeclaringTypeName());
//AOP代理类的类(class)信息
System.out.println(signature.getDeclaringType());
}
}
运行之前的测试用例,可以看到输出已经变成了:
我是前置通知!!!
[Ljava.lang.Object;@997d532
sayHello
com.learn.service.HelloService
interface com.learn.service.HelloService
hello aop
可以看到在方法前面加上了一系列附加信息
当然,通过AOP不仅仅只能在方法前面加上一些额外处理,你还可以在方法后面,异常时等等进行一些额外的处理。
在后面的教程中将会详细说到这些。