1. 什么是Aop
面向切面编程,不懂没关系,看图一下就明白了。
往小了看是这样子的:
方法上
往大了看是这样的:
业务上
2. Aop编程涉及到的名词概念
通知(advice):切入的功能:日志,事物之类
连接点(joinpoint):能够切入通知的地方,方法的前前后后咯
切点(cutpoint):增加了通知,或者要切入通知的连接点,相当于连接点的筛选
切面:切点和通知的结合叫切面
引入:引入允许我们向现有的类中添加方法或属性
3. 实现原理
代理模式
接口:
public interface IAnimal {
void say();
}
目标对象类:
public class dog implements IAnimal {
@Override
public void say() {
System.out.println("旺旺");
}
}
代理对象类:
public class dogproxy implements IAnimal {
private dog dg;
public dogproxy(dog dog) {
dg = dog;
}
@Override
public void say() {
// before say
System.out.println("before");
dg.say();
System.out.println("after");
}
}
PS:最后我们在调用的时候,调用的是代理对象的say()方法。
动态代理:
实现原理差不多,就是利用sun提供的一个API而已,这里就不细说
4. Spring Boot 中使用切面(Aop)编程实例
4.1 引入依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>1.4.1.RELEASE</version>
</dependency>
4.2 创建切面类(切入的地点,切入的方法)
@Aspect
public class MyAspect {
@Before("execution(* com.seven.service.*.get*(..))")
public void adviceBefore() {
System.out.println("aop方法前");
}
@After("execution(* com.seven.service.*.get*(..))")
public void adviceAfter() {
System.out.println("aop方法后");
}
}
特别说明:
通知:adviceBefore()和 adviceAfter()
切点:execution(* com.seven.service..get(..))表示servcie包下面的get*方法,意为着将会在这些方法上添加新功能。(也就意味着容器会创建该对象的代理类,调用的时候会调用代理类的get*方法)
4.3 配置
@Configuration
@EnableAspectJAutoProxy
public class AopConfig {
@Bean
public MyAspect myAspect() {
return new MyAspect();
}
}
4.4 配置导入main函数(让容器知道你自定义了一个aop配置)
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import;
@SpringBootApplication
@ComponentScan("com.seven")
@Import({ MybatisConfig.class, AopConfig.class })
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
4.5 运行即可