Spring —— IOC控制反转
2017-08-04 23:07
204 查看
Spring —— IOC控制反转
什么是IoC
一般的编程中,对于一个对象A,如果要使用A中的方法或属性,那么是需要手动进行初始化这个对象的,比如Interface A = new InterfaceImpl();来进行初始化,也可以通过JNDI的命名接口来得到,使用结束后对象A跟随被销毁或随着生命周期的结束而结束,但是这个对象始终会和其他的接口或者类耦合起来。类似于做饭,我需要自己去市场买菜,洗菜、烧水、做饭,炒菜,端到桌子上来,吃完,丢掉,完成一顿晚饭。而IoC做了什么呢?类似一个保姆,我们在出门之前告诉他,今天我11点半回家,然后我想吃芹菜炒肉,然后我们就可以走了,11点半的时候回家,保姆就把菜已经做好放在桌子上,我们吃完,睡午觉,继续去写代码,如果菜不好吃,那么我们也不必自己去扔,只需要跑出一个异常,保姆就会处理。
程序员要做的,就只是在代码中告诉IoC这里需要什么,在什么时候要拿他做什么,不需要去关系这个对象的生命周期或者说要如何实例化它
Spring-IoC
SpringIoC主要利用依赖注入来实现的,用户针对接口编程,而等运行期,框架再根据定义的注入方式,将对象在合理的时间生成后‘注入’到调用的地方,将用户对于对象的控制权交由spring,就是控制反转IoC,而spring控制的方式就是将适合的对象注入到调用的位置,实现功能。类似于上面的例子,spring做的只是按时把饭做好,放到桌子上,这就是注入,而我在早上就已经定义好了11点半要去吃饭,至于什么饭,是我提前交代给保姆的,然后保姆就利用这段时间把饭做好,放到桌子上。我把做饭、丢垃圾的这些工作交给保姆,就是所谓的控制反转,保姆做饭放到桌子上,就是依赖注入。Spring依赖注入的形式
1、 构造器注入:这是最简单也最好懂的一种模式。
首先我们定义个接口
public interface Lunch{ public void eat(); }
是一顿午餐
public class GoodMeal implements lunch{ @Override public void eat(){ emm...good! } }
这是我们的一顿美味
public class BadFood implements Lunch{ @Override public void eat() throws WTFException{ throws new WTFException(); } }
这个就是一顿糟糕的饭
传统的:
public class Man{ private Lunch lunch; public Man(int type) throws WTFException{ if(type==1){ lunch = new GoodMeal(); }else{ lunch = new BadFood(); } } }
我们会因为一些因素而按部就班去做饭,去炒菜,可能好吃,也可能不好吃(对于我这是不存在的),但是你始终需要去做很多事情,比如初始化,比如销毁等等等等。
Ioc构造器注入:
public class HouseKeeper{ private Man boss = new Man(); ir(今天老板骂我了){ new Man(new BadFood()); } if(今天老板给我加工资了){ new Man(new GoodMeal); } }
首先我们需要一个保姆(当然)。
然后由保姆做饭来决定今天吃什么
那么我们的吃就可以这么改
public class Man{ private Lunch lunch; public Man(Lunch lunch) throws WTFException{ this.lunch = lunch; lunch.eat; } }
我们只需要告诉spring,我们需要一顿饭,并且要调用eat这个方法,那么具体注入进来的是什么,不由这个类决定,就是所谓的控制反转。那么何时注入,由保姆决定,保姆根据某些条件(预先定义,比如周一吃鱼,周二吃鸟)来决定注入什么,这就是依赖注入。上面这个例子就是简单的构造器注入。
——如果你还不明白,我选择放弃
2、 Setter注入
这个我觉得蛮简单的,估计不用说你们也会了,举一反三和上面构造器是一样的,setter本身就是干这个的
3、 自动装配
这个就厉害了,上面的两种虽然方便,但是使用起来还是有些不爽,自动装配则是通过我们自己定义在配置文件中的bean标签来实现,可以通过名称、数据类型、等配置方法来进行自动装配。
这样spring就能自动找到所有名称为lunch的变量,然后装配为GoodMeat的对象,实现依赖注入,而autowired则是指明通过名称或者通过类型来进行注入。
当然也可以通过@Autowired来进行注解,注解了这个的变量,无需写setter和getter,就可以自动装配生成对象,或者使用@Resource来标注,@Autowired注解按照类型装配对象,结合注解@Qualifier可以一起使用,而@Resource则是通过byName来装配,但是都能够达到我们的要求。
<bean id=”lunch” class=”com.lunch.GoodMeat” autowired=”byName”> </bean>
自动装配bean中的autowired属性:
byName:根据名称注入,也就是说会去寻找所有名称为指明id的所有对象然后注入对应的class实例
byType:根据类型注入,根据配置的class属性去寻找,也就是@Autowired的作用
no:不支持自动装配,采用手动装配
default:表示默认采用上一级标签的自动装配的取值。如果存在多个配置文件的话,那么每一个配置文件的自动装配方式都是独立的。
Constructor:使用构造器注入方式注入
Autodetect:自动选择:如果对象没有无参数的构造方法,那么自动选择constructor的自动装配方式进行构造注入。如果对象含有无参数的构造方法,那么自动选择byType的自动装配方式进行setter注入。
相关文章推荐
- Spring之ioc控制反转(依赖注入)
- spring核心之IOC控制反转详解
- Spring中的IoC(控制反转)容器初探
- spring IOC控制反转,实现action的配置
- (转)关于spring的两个概念:IoC(控制反转) ,DI(依赖注入)
- Spring入门--控制反转(IOC)与依赖注入(DI)
- Spring 使用注解的方式实现IOC和DI(控制反转和依赖注入)
- 【spring进阶】--控制反转(IoC)和依赖注入(DI)
- Spring之IOC控制反转的理解
- Spring入门--控制反转(IOC)与依赖注入(DI)
- Spring学习--IOC基础 知道什么叫做控制反转和依赖注入
- Spring_mvc ioc/DI 控制反转与依赖注入
- Spring控制反转(IOC)和依赖注入(DI),再记不住就去出家!
- spring的依赖注入(DI)、控制反转(IOC)和面向切面(AOP)
- Spring 学习 2- IOC原理 控制反转/依赖注入1
- Spring-----> IOC(控制反转)
- Spring之控制反转(IoC)
- 理解Java Spring核心功能之一:控制反转容器(IOC Container)
- Spring学习一:IOC(控制反转)和AOP(面向切面)的xml配置和注解方式
- 谈谈对Spring IOC(控制反转)的理解--转