Spring AOP 中篇: AOP切面原理
该文章参考多篇文章的基础上进行了简化并做少许修改,方便理解。原文章地址如下:
一、Spring:
1. 概念
- Spring是一个开源框架,于2003那年兴起的一个轻量级的Java开发框架。
- Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
- Spring DAO:Spring提供了对JDBC的操作支持:JdbcTemplate模板工具类 。
- Spring ORM:Spring可以与ORM框架整合。例如Spring整合Hibernate框架,其中
- Spring还提供HibernateDaoSupport工具类,简化了Hibernate的操作 。
- Spring WEB:Spring提供了对Struts、Springmvc的支持,支持WEB开发。与此同时Spring自身也提供了基于MVC的解决方案 。
- Spring AOP:Spring提供面向切面的编程,可以给某一层提供事务管理,例如在Service层添加事物控制 。
- Spring JEE:J2EE开发规范的支持,例如EJB 。
- Spring Core:提供IOC容器对象的创建和处理依赖对象关系 。
2. Spring下IOC容器和DI(依赖注入Dependency injection)
IOC容器:就是具有依赖注入功能的容器,是可以创建对象的容器,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。通常new一个实例,控制权由程序员控制,而”控制反转”是指new实例工作不由程序员来做而是交给Spring容器来做。。在Spring中BeanFactory是IOC容器的实际代表者。
DI(依赖注入Dependency injection) :在容器创建对象后,处理对象的依赖关系。
依赖注入spring的注入方式:
- set注入方式
- 静态工厂注入方式
- 构造方法注入方式
- 基于注解的方式
要点:
- 持久层Dao层注入Repository中规定了名称,在Service层中声明名称必须一致;
- 服务层Service层注解Service中规定了名称,在控制层中声明的名称必须一致;
- 注解方式注入依赖注解:
- @Component 把对象加入ioc容器,对象引用名称是类名,第一个字母小写 ;
- @Component(“name”) 把指定名称的对象加入ioc容器 ;
- @Repository 主要用于标识加入容器的对象是一个业务持久层的组件(类);
- @Service 主要用于标识加入容器的对象是一个业务逻辑层的组件 ;
- @Controller 主要用于标识加入容器的对象是一个控制层的组件
- @Resource 注入属性(DI),会从容器中找到对象注入到@Resource修饰的对象上;
- @Autowired 注入属性(DI),会从容器中找到对象注入到@Autowired修饰的对象上;
- 注解可以简化配置,提升开发效率,但是也不利于后期的维护。
二、AOP
Spring AOP : Spring提供面向切面的编程,可以给某一层提供事务管理,例如在Service层添加事务控制。
AOP技术恰恰相反,它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为“Aspect”,即切面。所谓“切面”,简单就是说那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
使用“横切”技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事务。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。
三、AOP核心概念
切面(aspect)
AOP中的一个术语,表示从业务逻辑中分离出来的横切逻辑,比如性能监控、日志记录、权限控制等 ;
连接点(joinpoint)
被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器;
切入点(pointcut)
对连接点进行拦截的定义;通过一个条件来匹配要拦截的类,这个条件称为切点。如拦截所有带Controller注解的类。增强的条件。
通知(advice)
所谓通知指的就是拦截到连接点之后要执行的代码,通知分为**前置通知(Before)、后置通知(AfterReturning)、异常通知(AfterThrowing)、最终通知(After)、环绕通知(Around)**五类 ;
目标对象(Target Object)
代理的目标对象—JDK动态代理或CGLIB动态代理 ;
织入(weave)
将切面应用到目标对象并导致代理对象创建的过程 ;
引入(introduction)
在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段 ;
- 增强
- Weaving(织入):对方法进行增强
- 前置增强(BeforeAdvice):在目标方法前调用
- 后置增强(AfterAdvice):在目标方法后调用
- 环绕增强(AroundAdvice):将Before和After,甚至抛出增强和返回增强合到一起
- 返回增强(AfterReturning):在方法返回结果后执行,该增强可以接受到目标方法返回结果
- 抛出增强(AfterThrowingAdvice):在目标方法抛出对应的类型后执行,可以接收到对应的异常信息。
- Introduction(引入):对类进行增强
- 引入增强(DeclareParentsAdvice):想让程序在运行的时候动态去实现某个接口,需要引入增强。
- Weaving(织入):对方法进行增强