登录/注册
唐某
7148
占位
5
占位
24
浏览量
占位
粉丝
占位
关注
spring之AOP笔记(IDEA)
唐某
2020-11-14 22:55:19 2020-11-14
117
0

spring之AOP笔记(IDEA)

什么是AOP(面向切面)

传统代码遇见的问题

代码臃肿冗余,复用性不高,模块之间耦合度高

初步解决方法

将大量重复使用的代码块抽取成一个个的方法,降低代码冗余,但是这解决不了根本性的问题,即代码的耦合度没有降低,

如果需求变了,那么我们肯定是要修改源代码,如果代码庞大,这种重复性的修改无疑做着无用功,所以AOP思想诞生了

AOP思想

首先AOP是基于动态代理的思想,在不改变原有类(被代理类)**的前提下,创建新生的类(代理类)**来增强原有的类

起名叫AOP呢,形象的说,AOP思想是将需求代码块插入原有类

基于Annotation和bean.xml

bean.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">

    <context:component-scan base-package="mySpring"></context:component-scan>
    <!--开启注解aop控制-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

</beans>
创建目标类接口
package mySpring.service;

/**
 * 模拟业务层
 */
public interface IAccountService {
    void saveAccount();
    void updateAccount(int id);
    int deleteAccount();
}
创建目标类
package mySpring.service.impl;

import mySpring.service.IAccountService;
import org.springframework.stereotype.Service;

@Service("accountService")
public class AccountService implements IAccountService {
    @Override
    public void saveAccount() {
        System.out.println("saveAccount......");
    }

    @Override
    public void updateAccount(int id) {
        System.out.println("updateAccount......" + id);

    }
    @Override
    public int deleteAccount() {
        System.out.println("deleteAccount......");
        return 0;
    }
}

先在有新的需求,想在每个方法执行前输入一些东西(这里以日志输出为例)

需要为这个目标类(被代理对象)找到一个代理类

创建代理类Logger

```java package mySpring.utils;

import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component;

@Component("logger") @Aspect//申明为切面类(代理类) public class Logger { // 代理谁?表达式指定 @Pointcut("execution(* mySpring.service.IAccountService.*(..))") private void pt() { }

/**
  *    执行相关方法前的操作
  *    前置
  */
@Before("pt()")    //指定切点pointcut
public void beforeMethod() {
    System.out.println("前置");
}

/**
  *    执行相关方法后的操作
  *    后置
  */
@AfterReturning("pt()")
public void returnMethod(JoinPoint joinPoint) throws Throwable {
    System.out.println("后置");
}

/**
  *    执行相关方法异常时会加的操作
  *    异常
  */
@AfterThrowing("pt()")
public void throwMethod(JoinPoint joinPoint) throws Throwable {
    System.out.println("异常");

}
暂无评论