IOC和AOP

发布于:2022-07-25 ⋅ 阅读:(439) ⋅ 点赞:(0)

IOC

IOCInversion of Control的缩写

控制反转也叫作依赖注入,简单点说,就是创建对象的控制权,被反转到了Spring框架上。

(把对象的创建和对象之间的调用过程,交给Spring管理。) 

通常,我们实例化一个对象时,都是使用类的构造方法来new一个对象,这个过程是由我们自己来控制的,而控制反转就把new对象的工作交给了Spring容器。

 IOC的主要实现方式有两种: 依赖查找、依赖注入

 Spring依赖注入的方式主要有四个,基于注解注入方式、set注入方式、构造器注入方式、静态工厂注入方式。推荐使用基于注解注入方式,配置较少,比较方便

 IOC 使用场景

ioc是把需要使用的对象提前创建好,放到spring的容器里面。需要使用的时候直接使用就行,而且可以设置单例或多例,非常灵活

我们在service层想调用另外一个service的方法,不需要去new了,直接把它交给spring管理,然后用注解的方式引入就能使用

IOC三种注入方式 

(1)XML:Bean实现类来自第三方类库,例如DataSource等。需要命名空间等配置,例如:context,aop,mvc。

(2)注解:在开发的类使用@Controller,@Service等注解

(3)Java配置类:通过代码控制对象创建逻辑的场景。例如:自定义修改依赖类库。

 那么依赖查找和依赖注入有什么区别呢?

依赖查找,主要是容器为组件提供一个回调接口和上下文环境。这样一来,组件就必须自己使用容器提供的API来查找资源和协作对象,控制反转仅体现在那些回调方法上,容器调用这些回调方法,从而应用代码获取到资源。

依赖注入,组件不做定位查询,只提供标准的Java方法让容器去决定依赖关系。容器全权负责组件的装配,把符合依赖关系的对象通过Java Bean属性或构造方法传递给需要的对象。

依赖注入:由IOC容器动态地将某个对象所需要的外部资源(包括对象、资源、常量数据)注入到组件(Controller, Service等)之中。简单点说,就是IoC容器会把当前对象所需要的外部资源动态的注入给我们。

使用IOC的目的:

为了降低耦合度。所谓耦合度就是某模块(类)与其它模块(类)之间的关联、感知和依赖的程度,是衡量代码独立性的一个指标,也是软件工程设计及编码质量评价的一个标准。 

 

3.IOC的优点

灵活性

为广泛使用的接口更改实现类更简单

更改给定类的检索策略更简单

添加拦截器很简单,只需在一个地方完成

可读性

该项目有一个统一一致的组件模型,没有工厂(如DAO工厂)

如果没有依赖项查找代码(例如对JNDI InitialContext的调用),代码更简洁,也不会杂乱无章

可测试性

当依赖项通过构造函数或setter公开时,它们很容易替换mock

更易的测试导致更多的测试

更多的测试会带来更好的代码质量、更低的耦合性和更高的内聚性

 IOC的缺点

   第一、软件系统中由于引入了第三方IOC容器,生成对象的步骤变得有些复杂 

 第二、由于IOC容器生成对象是通过反射方式,在运行效率上有一定的损耗。 

  第三、具体到IOC框架产品(Spring)来讲,需要进行大量的配制工作,比较繁琐,对于一些小的项目而言,客观上也可能加大一些工作成本。 

   第四、IOC框架产品本身的成熟度需要进行风险评估。

IOC的底层是什么?

对象工厂

IOC的原理是什么? 

 xml解析、工厂模式、反射

Spring提供Ioc容器实现的两种方式

(两个接口),这两个接口相似,功能都一样。

     但是有区别

(1) BeanFactory
Ioc容器基本的实现,是Spring内部使用的接口,不提供给开发人员使用,但是你想用也可以用

加载配置文件的时候不会创建对象,而是在获取或者只用的时候才会创建对象。

只取配置文件

(2)ApplicationContext

         是BeanFactory的子接口,提供了跟多更强大的功能,一般面向开发人员使用的,记住啊用这个。

加载配置文件的时候,就创建了对象。

这种方式在服务器启动的时候,就创建了对象,省时省力。

           介绍一下ApplicationContext中的实现类:

FileSystemXmlApplicationContext
(系统)可以加载磁盘路径下的配置文件(不常用)

ClassPathXmlApplicationContext
可以加载类路径下的配置文件要求配置文件必须在类路径下面

IOC思想基于容器完成,IOC容器底层就是对象工厂。
IOC底层核心原理-bean初始化过程解析

bean初始化过程解析
BeanFactoryPostProcessor

作用:定义了在bean工厂对象创建后,bean对象创建前执行的动作,用于对工厂进行创建后业务处理

运行时机:当前操作用于对工厂进行处理,仅运行一次

BeanPostProcessor

作用:定义了所有bean初始化前后进行的统一动作,用于对bean进行创建前业务处理与创建后业务处理

运行时机:当前操作伴随着每个bean的创建过程,每次创建bean均运行该操作

InitializingBean

作用:定义了每个bean的初始化前进行的动作,属于非统一性动作,用于对bean进行创建前业务处理

运行时机:当前操作伴随着任意一个bean的创建过程,保障其个性化业务处理

注意:上述操作均需要被spring容器加载放可运行  

bean初始化过程解析
繁琐的bean初始化过程处理
FactoryBean
对单一的bean的初始化过程进行封装,达到简化配置的目的
FactoryBean与BeanFactory区别

FactoryBean:封装单个bean的创建过程

BeanFactory:Spring容器顶层接口,定义了bean相关的获取操作

 


网站公告

今日签到

点亮在社区的每一天
去签到