浅谈spring框架的控制反转和依赖注入

spring是什么?

spring是一个轻量级的控制反转和面向切面编程的开源容器框架。

轻量级是说spring框架本身的体积小。

控制反转(Ioc):它不是技术,而是一种思想,将创建对象的控制权力交给spring框架。

依赖注入(DI):将对象中的属性通过配置文件的方式进行赋值。

面向切面编程(AOP):零散存在于业务层中的功能代码(例如:日志,事务),称为横切面关注点。把一个个横切面关注点放到某个模块中,称为切面。

AOP就是把多个方法前后的共同代码抽离出来,使用动态代理机制来控制。好处是降低耦合度,减少重复代码,提高代码的可扩展性和可维护性。

Ioc容器

spring的容器对象有BeanFactory和ApplicationContext。

BeanFactory和ApplicationContext的区别:

BeanFactory是spring的最顶层的接口,而ApplicationContext继承了BeanFactory,常用的实现类是ClassPathXmlApplicationContext。

BeanFactory创建对象是在需要对象bean的时候才会创建,而ApplicationContext创建对象的时机是在加载容器时就会创建出所有的bean。

使用xml方式创建对象:

在spring配置文件中创建<bean></bean>标签,设置相应id和class属性。

使用注解方式创建对象:

Ioc创建对象的注解有四个:@component,@controller,@service,@repository

它们的作用都是把被贴上注解的类交给spring管理,由spring自动的创建对象。

区别是:@controller用于标注控制层组件,@service用于标注业务层组件,@repository用于标注数据访问组件,也就是DAO组件,当组件不好归类时使用@component。

使用Ioc注解的前提:配置文件中要有Ioc注解解析器,在配置文件中加一行配置<context:component-scan base-package="com.spring.mybackage">,base-package告诉spring去哪些包里面扫描bean,如果有多个包需要被扫描,用逗号分开即可。如果是一些没有源码的类,比如框架内部定义好的类,就只能通过xml方式,不能用注解方式,因为我们改变不了那些源代码。

依赖注入DI

在spring创建对象的过程中,需要将对象依赖的属性也自动的进行赋值,并且如果使用DI为A对象注入B对象,那么需要A和B都在spring容器中。

setter注入方式(前提属性必须有set方法)

在xml配置文件的<bean></bean>标签中手动配置一个<property></property>标签,<property>有两个属性。name属性的值就是对象中属性的名字。注入值需要先判断该属性的数据类型。

如果是简单数据类型,使用value属性进行注入(setter注入方式本质是在执行set方法,如果对象的属性名字是abc,那么spring会自动找setAbc方法,跟对象中是否有这个字段无关。并且spring在注入值时隐含着类型转换,可以自动把string类型转换成Integer)。

如果是引用数据类型,使用ref=""引用一个对象,引用数据类型ref的值是spring容器中已经存在的对象的id值。

如果是集合数据类型,就要使用集合各自对应的标签进行注入。(注意:注入集合类型的数据时,集合的泛型会影响输出的结果)。

构造器注入方式

对象中必须存在有参构造,哪些属性需要注入值,构造函数就要有对象的参数,和setter方式类似,只需要将<property>标签替换为<constructor-arg>标签。<constructor-arg>标签中的name属性的值要和有参构造中的形参一致。

使用注解的注入方式

在spring中使用注解方式完成DI操作,一是使用spring自带的@Autowired,二是使用JavaEE规范提供的注解@Resource。二者功能相同。

@Autowired可以让spring自动的把对象需要的属性从spring容器中找出来,并注入给该属性。@Autowired可以贴在字段或者set方法上,但一般贴在字段上,因为使用@Autowired没有set方法也可以注入,但是@Autowired的底层还是使用了setter方式注入。

@Autowired和@Resource的区别

@Autowired会先按照依赖对象的类型找,没有找到默认会报错,如果找到一个,直接注入;如果在spring容器中找到多个匹配的类型,再按照名字找,没有找到会报错。

@Resource会先按照名字找,没有找到才会按照类型去找。

为什么DI注解不需要注解解析器?

spring容器在启动时会自动加入解析器,所以注解会生效。DI注解解析器是<context:annotation-config/>,在spring3.0之前,需要手动配置。

原文地址:https://www.cnblogs.com/w998/p/11624330.html

时间: 2024-10-12 10:02:32

浅谈spring框架的控制反转和依赖注入的相关文章

Spring框架之控制反转和依赖注入

学Spring框架必须理解控制反转和依赖注入.下面各自举一个例子,来说明. IOC(控制反转):应用本身创建和维护的依赖对象:现在交由外部容器(Spring)来创建和维护:这个控制权的转移: 就叫做控制反转. 第一步:配置applicationContextcreateproject.xml和applicationcontext.xml(总体) <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=

轻松了解Spring中的控制反转和依赖注入(二)

紧接上一篇文章<轻松了解Spring中的控制反转和依赖注入>讲解了SpringIOC和DI的基本概念,这篇文章我们模拟一下SpringIOC的工作机制,使我们更加深刻的理解其中的工作. 类之间的结构图如下 以下是代码 BeanFactor接口:在Spring源码中的定义是:持有对一定数量的Bean的定义,同时每个Bean都被唯一标识的对象(类),需要实现这个接口.根据对Bean的定义,该工厂将会返回一个包含Bean定义的对象的独立实例(原型设计模式),或者单例共享(一个不错的单例设计模式,)范

轻松了解Spring中的控制反转和依赖注入

我们回顾一下计算机的发展史,从最初第一台计算机的占地面积达170平方米,重达30吨,到现如今的个人笔记本,事物更加轻量功能却更加丰富,这是事物发展过程中的一个趋势,在技术领域中同样也是如此,企业级JavaBean(Enterprise JavaBean ,EJB)在创建之初是非常成功,但是时间一久人们便开始追逐更加方便更加简易和轻量级的技术框架实现,于是Spring就应运而生,并且Sring一直开始不断地涉及到其他领域(这里就不再多详谈了),而Spring的精髓当中就包括控制反转和依赖注入. 浅

Spring之ioc控制反转(依赖注入)

个人感觉依赖注入比控制反转更好理解,所以下面就只说依赖注入: spring的整体结构示意图: 一.spring 中的概念 beanFactory容器 1.容器是spring框架的核心,容器使用ioc依赖注入来管理所有组成应用系统的组件. 2.spring中的两种容器: beanFactory  这个容器提供了基础的依赖注入支持,而且是延迟加载的,而 applicationcontext是对beanFactory 这个容器的扩展, 3.beanFactory :beanFactory就是一个Bea

Spring 基础 控制反转和依赖注入

Spring框架两个最重要的知识点 1.IOC(控制反转)/DI(依赖注入):把整个项目中的所有对象交给Spring容器管理 IOC:取到对象 DI:对象的装配 依赖注入有两种方式: 1.      属性值注入方式 a.     普通类型 注入方式 b.bean注入方式 测试结果 在使用普通类型方式注入的时候,我们会有一些特殊字符,处理这种特殊字符时 我们会想使特殊字符保持原有的样子,这时候就要使用CDATA,就如上一张图片所示 2.构造参数注值方式 在一般情况,一个类会有一个默认的无参构造函数

spring学习总结一----控制反转与依赖注入

spring作为java EE中使用最为广泛的框架,它的设计体现了很多设计模式中经典的原则和思想,所以,该框架的各种实现方法非常值得我们去研究,下面先对spring中最为重要的思想之一----控制反转(依赖注入)进行简单的总结. 一.控制反转与依赖注入的概念 在学习spring框架的时候,我们习惯性地将控制反转和依赖注入放在一起,其实,两者体现的思想原则都是差不多的,只不过控制反转是一种更广泛的程序操作理念,而依赖注入是一种更为具体的实现方法,总的来说,控制反转可以依靠依赖注入来实现. 1.控制

Spring理论基础-控制反转和依赖注入

序第一次了解到控制反转(Inversion of Control)这个概念,是在学习Spring框架的时候.IOC和AOP作为Spring的两大特征,自然是要去好好学学的.而依赖注入(Dependency Injection,简称DI)却使得我困惑了挺久,一直想不明白他们之间的联系.控制反转控制反转顾名思义,就是要去反转控制权,那么到底是哪些控制被反转了?在2004年 Martin fowler 大神就提出了 "哪些方面的控制被反转了?" 这个问题,他总结出是依赖对象的获得被反转了.在

spring(3)------控制反转(IOC)/依赖注入(DI)

一,spring核心概念理解 控制反转: 控制反转即IoC (Inversion of Control),它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理. 所谓的"控制反转"概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器. 没有控制反转这种模式前,你创建一个对象,在什么地方用,你得单独通过关键字new出来用, 但现在可以不用这样,你把new对象的权利交给spring配置文件,通过配置文件来'new', 就是权利的反转,你以前干的事

Spring控制反转和依赖注入

(1)为什么使用控制反转和依赖注入 调用者不用去关心被调用者的实现,不需要调用者亲自创建被调用者的实例,这些操作都交给框架去完成. 这种设计思想就是控制反转(Inversion of Control, IoC),同时,它还有另外一个名字就是依赖注入(Dependency Injection, DI). (2)什么是控制反转和依赖注入 控制反转(IoC)是将由程序控制的"对象间的依赖关系"转交给IoC容器来进行控制,被调用者的实例创建工作不再由调用者来完 成.通过控制反转,可以实现由外部