IOC/DI

 

什么是IOC(Invert Of Control)

常规在应用程序创建一个对象时,我们通过new的方式去创建,不需要依赖于外部的容器等。但是在spring IOC中,IOC/DI容器过来控制应用程序所需要的外部资源。即我们不再主动创建对象,而将如何创建对象告知spring容器,让其来完成创建过程。即控制反转

在生产实践中,通常通过配置文件去配置我们所需要的bean并设置对应的属性;在spring启动时,会自动加载并读取配置文件中关于bean以及对应其属性的配置,通过反射的方式,在运行时动态的创建对应的bean;并将其实例化的bean对象,放入到IOC容器中。应用程序中可以使用如spring提供的方法getBean()等方法,直接从IOC容器中获取对应的bean。

什么是DI机制(Dependency Injection)

依赖注入,即应用程序所需要的外部资源,依赖于IOC、DI容器中资源的注入

如@Service/@Reposity/ @Component完成了spring的控制反转过程,即通过Spring会自动完成实例化具有该注解的类;根据@Resource和@Autowired注解,spring则将实例化的对象,注入到对应的位置上。

区别与联系

描述的是同一件事,但是出发角度不同

IOC是从IOC/DI容器的角度出发:IOC、DI容器反过来控制应用程序所需要的外部资源。

DI是从应用程序的角度出发:应用程序所需要的外部资源,依赖于IOC、DI容器中资源的注入。

什么是外部资源

如A类里面要调用B类,那么对于A类来讲B类就是外部资源。

IOC容器

可以理解为一个生产和管理bean对象的容器,其生命周期和spring一致。

设计思想

应用程序不主动创建对象,但是要描述创建它们的方式

所有的组件都是被动的,组件初始化和专供都是由容器负责,应用程序只是在获取相应的组件后,实现应用的功能即可。

IOC的优点是什么?

IOC把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC容器支持加载服务时的饿汉式初始化和懒加载。

Spring的IOC的注入方式 :

构造器依赖注入

可以实现强制依赖。通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖,constructor-arg来配置对应的参数。 有三种方式:index,type,name

https://blog.csdn.net/oppo5630/article/details/80254428

Setter方法注入

是容器通过调用无参构造器方法实例化bean之后,调用该bean的setter方法来完成注入的。 property来配置对应的参数,name和value分别对应参数名以及值,当value为另一个bean时使用ref代替value。

 

基于注解的注入

三种装配方式constructor,byName,byType

constructor:通过构造方法进行自动注入,spring会匹配与构造方法参数类型一致的bean进行注入,如果有一个多参数的构造方法,一个只有一个参数的构造方法,在容器中查找到多个匹配多参数构造方法的bean,那么spring会优先将bean注入到多参数的构造方法中。

byName:被注入bean的id名必须与set方法后半截匹配,并且id名称的第一个单词首字母必须小写,这一点与手动set注入有点不同。

byType:查找所有的set方法,将符合符合参数类型的bean注入。

两个bean注入注解:@Autowired,@Resource

@Autowired

spring注解,默认是以byType的方式去匹配类型相同的bean。多个时由DefaultListableBeanFactory 决定具体注入哪个bean。可以简单的理解为先以 ByType 的方式去匹配,如果匹配到了多个再以 ByName 的方式去匹配,找到了对应的 bean 就去注入,没找到就抛出异常。

@Resource

java的注解,默认以byName的方式去匹配与属性名相同的bean的id,如果没有找到就会以byType的方式查找,如果byType查找到多个的话,使用@Qualifier注解(spring注解)指定某个具体名称的bean。由J2EE提供,需要导入包javax.annotation.Resource。

四个bean对象生成注解

@Component:可以用于注册所有bean

@Repository:主要用于注册dao层的bean

@Controller:主要用于注册控制层的bean

@Service:主要用于注册服务层的bean

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值