天天看点

Spring学习笔记二:Spring的两大核心IOC和AOPSpring的两大核心IOC和AOP

Spring的两大核心IOC和AOP

什么是IOC?

Ioc—Inversion of Control即“控制反转”,不是什么技术,而是一种设计思想。

​ 理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了。

​ 谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源的获取(外部资源包括对象或者文件)。补充说明:在传统编程方式中,要实现某种功能一般的需要几个对象相互作用。在主对象中要保存其他类型对象的引用,以便在主对象中实例化对象,然后通过调用这些引用的方法来完成任务。而IOC容器是在主对象中设置Setter方法,通过调用Setter方法或者构造方法传入所需的引用。

​ 为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?获取依赖对象的方式被反转了。

​ IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。

DI—Dependency Injection

即“依赖注入”:由容器动态的将某个依赖关系注入到组件之中。

DI≠IOC,DI是IOC的一种实现方式。IOC的另外一种实现方式是依赖查找

什么是AOP?

AOP(Aspect-Oriented Programming,面向切面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。AOP把业务功能分为核心和非核心两部分

  • 核心业务功能:用户登录,添加数据,删除数据
  • 非核心业务功能:性能统计,日志,事务管理

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

AOP中的概念

  • 切入点(pointcut):在那些类,那些方法上切入
  • 通知(advice):在方法前,方法后,方法前后做什么

    Spring AOP 提供了5种类型的通知:

    • 前置通知(Before):在目标方法被调用之前调用通知功能。
    • 后置通知(After):在目标方法完成之后调用通知,无论该方法是否发生异常。
    • 后置返回通知(After-returning):在目标方法成功执行之后调用通知。
    • 后置异常通知(After-throwing):在目标方法抛出异常后调用通知。
    • 环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。
  • 切面(aspect):切面=切入点+通知。即在什么时机,什么地方,做什么
  • 织入(weaving):织入描述的是把切面应用到目标对象来创建新的代理对象的过程。 Spring AOP 的切面是在运行时被织入,原理是使用了动态代理技术。Spring支持两种方式生成代理对象:JDK动态代理和CGLib,默认的策略是如果目标类是接口,则使用JDK动态代理技术,否则使用Cglib来生成代理。
  • 连接点(Join point):连接点是在应用执行过程中能够插入切面的一个点。这个点可以是类的某个方法调用前、调用后、方法抛出异常后等。切面代码可以利用这些点插入到应用的正常流程之中,并添加行为。
  • 环绕通知:AOP中最强大最灵活的通知,它集成了前置和后置通知,保留了连接点原有的方法。