切面案例

112 阅读1分钟

1.基本概念

切面:

在原有的方法里添加一些新代码,对原有的方法代码进行一次增强处理,而那些增强部分的代码就被称为切面。

切入点:

要对哪些类中的哪些方法进行增强,进行切割,指的是被增强的方法。

连接点:

知道要切哪些方法后,剩下的就算什么时候切,在原方法的哪一个阶段加入增加代码,这个就算连接点。如方法调用前,方法调用后。

通知:

通知被增强的方法该如何被增强,定义切面的具体实现。

目标对象:

被一个或多个切面所通知的对象就算目标对象。

AOP代理对象:

该对象是目标对象的代理对象,代理对象在目标对象的基础上,在相应的连接点调用通知。

织入:

将切面切入到目标方法中,使得目标方法得到增强的过程称为织入。

2.依赖

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

<dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.24</version>
        <scope>provided</scope>
</dependency>

<dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.4</version>
</dependency>

3.定义注解类

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {
    String value() default "";
}

4.定义切面类

@Aspect
@Component
public class SysLogAspect {
    @Autowired
    private SysLogService sysLogService;

	//定义切入点
    @Pointcut("@annotation(com.example.myaspect.SysLog)")
    public void logPointCut(){

    }

    //定义通知
    @Around("logPointCut()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        Object result = point.proceed();
        System.out.println("增加方法");
        return result;
    }
}

5.测试

@Service
public class DemoService {

    @SysLog(value = "test")
    public void test(){
        System.out.println("执行了test方法");
    }
}

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyaspectApplicationTests {

	@Autowired
	private DemoService demoService;

	@Test
	public void contextLoads() {
		demoService.test();
	}

}