Spring AOP 中篇(二): AOP切面原理

Spring AOP 中篇: AOP切面原理

该文章参考多篇文章的基础上进行了简化并做少许修改,方便理解。原文章地址如下:

  1. Spring框架IOC容器和AOP解析

一、Spring:

1. 概念

  • Spring是一个开源框架,于2003那年兴起的一个轻量级的Java开发框架。
  • Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
  1. Spring DAO:Spring提供了对JDBC的操作支持:JdbcTemplate模板工具类 。
  2. Spring ORM:Spring可以与ORM框架整合。例如Spring整合Hibernate框架,其中
  3. Spring还提供HibernateDaoSupport工具类,简化了Hibernate的操作 。
  4. Spring WEB:Spring提供了对Struts、Springmvc的支持,支持WEB开发。与此同时Spring自身也提供了基于MVC的解决方案 。
  5. Spring AOP:Spring提供面向切面的编程,可以给某一层提供事务管理,例如在Service层添加事物控制 。
  6. Spring JEE:J2EE开发规范的支持,例如EJB 。
  7. Spring Core:提供IOC容器对象的创建和处理依赖对象关系 。

2. Spring下IOC容器和DI(依赖注入Dependency injection)

IOC容器:就是具有依赖注入功能的容器,是可以创建对象的容器,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。通常new一个实例,控制权由程序员控制,而”控制反转”是指new实例工作不由程序员来做而是交给Spring容器来做。。在Spring中BeanFactory是IOC容器的实际代表者。

DI(依赖注入Dependency injection) :在容器创建对象后,处理对象的依赖关系。

依赖注入spring的注入方式:

  • set注入方式
  • 静态工厂注入方式
  • 构造方法注入方式
  • 基于注解的方式

要点:

  1. 持久层Dao层注入Repository中规定了名称,在Service层中声明名称必须一致;
  2. 服务层Service层注解Service中规定了名称,在控制层中声明的名称必须一致;
  3. 注解方式注入依赖注解:
    1. @Component 把对象加入ioc容器,对象引用名称是类名,第一个字母小写 ;
    2. @Component(“name”) 把指定名称的对象加入ioc容器 ;
    3. @Repository 主要用于标识加入容器的对象是一个业务持久层的组件(类);
    4. @Service 主要用于标识加入容器的对象是一个业务逻辑层的组件 ;
    5. @Controller 主要用于标识加入容器的对象是一个控制层的组件
    6. @Resource 注入属性(DI),会从容器中找到对象注入到@Resource修饰的对象上;
    7. @Autowired 注入属性(DI),会从容器中找到对象注入到@Autowired修饰的对象上;
  4. 注解可以简化配置,提升开发效率,但是也不利于后期的维护。

二、AOP

​ Spring AOP : Spring提供面向切面的编程,可以给某一层提供事务管理,例如在Service层添加事务控制。

​ AOP技术恰恰相反,它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为“Aspect”,即切面。所谓“切面”,简单就是说那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

​ 使用“横切”技术,AOP把软件系统分为两个部分:核心关注点横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事务。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。

三、AOP核心概念

  1. 切面(aspect)

    AOP中的一个术语,表示从业务逻辑中分离出来的横切逻辑,比如性能监控、日志记录、权限控制等 ;

  2. 连接点(joinpoint)

    被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器;

  3. 切入点(pointcut)

    对连接点进行拦截的定义;通过一个条件来匹配要拦截的类,这个条件称为切点。如拦截所有带Controller注解的类。增强的条件。

  4. 通知(advice)

    所谓通知指的就是拦截到连接点之后要执行的代码,通知分为**前置通知(Before)、后置通知(AfterReturning)、异常通知(AfterThrowing)、最终通知(After)、环绕通知(Around)**五类 ;

  5. 目标对象(Target Object)

    代理的目标对象—JDK动态代理或CGLIB动态代理 ;

  6. 织入(weave)

    将切面应用到目标对象并导致代理对象创建的过程 ;

  7. 引入(introduction)

    在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段 ;

  • 增强
    • Weaving(织入):对方法进行增强
      1. 前置增强(BeforeAdvice):在目标方法前调用
      2. 后置增强(AfterAdvice):在目标方法后调用
      3. 环绕增强(AroundAdvice):将Before和After,甚至抛出增强和返回增强合到一起
      4. 返回增强(AfterReturning):在方法返回结果后执行,该增强可以接受到目标方法返回结果
      5. 抛出增强(AfterThrowingAdvice):在目标方法抛出对应的类型后执行,可以接收到对应的异常信息。
    • Introduction(引入):对类进行增强
      1. 引入增强(DeclareParentsAdvice):想让程序在运行的时候动态去实现某个接口,需要引入增强。
    原文作者:AOP
    原文地址: https://blog.csdn.net/StarryaSky/article/details/84038506
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞