Spring的IOC简单介绍

本文参考自: 原文地址

Spring的IOC简单介绍

1.背景介绍

什么是spring? IOC是什么?相关的DI又是什么?
Spring是一个开源框架,是2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作
Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。
框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。
Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。
然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
Spring的核心是控制反转(IoC)和面向切面(AOP)。
今天我给大家分享的就是spring的一大核心--spring的IOC。

2.知识剖析

spring的IOC及DI知识点构成

IOC理解
spring中bean实例化的方式
注入bean的方式
Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想
传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;
而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建。
谁控制谁--当然是IoC 容器控制了对象
控制什么--控制了外部资源获取(不只是对象包括比如文件等),想要的所有东西
传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;
为何是反转--由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转
哪些方面反转了--依赖对象的获取被反转了


DI的理解

DI—Dependency Injection,即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。
依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。
通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,
完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。
谁依赖于谁--应用程序依赖于IoC容器;
为什么需要依赖--应用程序需要IoC容器来提供对象需要的外部资源;
谁注入谁--IoC容器注入应用程序某个对象,应用程序依赖的对象;
注入了什么--注入某个对象所需要的外部资源(包括对象、资源、常量数据)


3.spring中bean实例化的方法以及注入的方式

当一个bean实例引用到了另外一个bean实例时,spring容器帮助我们先创建依赖的bean实例,并注入到另一个bean中
实例化bean的方法
1.类的构造方法--
在日常开发中创建对象的最常用的就是通过类的构造方法,事实上Spring容器也是正常情况下也是通过构造方法创建bean的
2.工厂获取--
除了构造创建外还存在另外两种比较冷门的创建的方式即静态方法构造和实例工厂方法构造
spring中bean实例化的方法以及注入的方式
在spring容器帮助我们创建好了依赖的bean实例时,这是需要注入到另一个bean中来使用,这就是注入bean的方式


注入实例化bean的方法

1.setter注入--
Setter注入顾名思义,被注入的属性需要有set方法, Setter注入支持简单类型和引用类型,Setter注入时在bean实例创建完成后执行的
2.构造函数注入--
构造注入也就是通过构造方法注入依赖,构造函数的参数一般情况下就是依赖项,
spring容器会根据bean中指定的构造函数参数来决定调用那个构造函数
在日常的开发中,setter注入和构造注入经常会混合使用,后面我们还会分析到注解装配,它在开发中将更为常用


4.编码实战

我给大家说一说实例化bean的几种方式和注入bean的两种种方式

1.构造方式实例化bean

setter函数进行实例化bean

<!-- 默认构造创建,使用setter方式来进行实例化,通过property 注入属性值 --> <bean id="player1" class="xiuzhenyuan.pojo.Player" >
<property name="id" value="66" />
<property name="name" value="Jack" />
    <property name="citys">
    <list>
        <value>beijing</value>
        <value>shanghai</value>
        <value>shenzhen</value>
        <value>guangzhou</value>
    </list>
</property>
</bean>

构造函数实例化bean

<!-- 默认构造创建,并通过property 注入属性值 --> <bean id="player2" class="xiuzhenyuan.pojo.Player" >
    <constructor-arg name="id" value="88" />
    <constructor-arg name="name" value="Rose" />
</bean>

2.工厂模式进行实例化bean

静态工厂

<!-- 静态工厂创建,调用静态方法createPlayer --> <bean id="playerFactory1" class="xiuzhenyuan.pojo.PojoFactory"
      factory-method="createPlayer"/>

实例工厂

<!-- 工厂实例创建,先创建工厂类在调用方法createPlayer2 --> <bean id="factory" class="xiuzhenyuan.pojo.PojoFactory" />
<bean id="playerFactory2" factory-bean="factory"  factory-method="createPlayer2"/>

1.setter函数注入bean

<!-- 声明playerDao对象并交给spring创建 --> <bean name="playerDao" class="xiuzhenyuan.dao.PlayerDaoImp"/>
<!-- 声明playerDao对象,交给spring创建 --> <bean name="playerDaoServiceImp" class="xiuzhenyuan.service.PlayerDaoServiceImp">
    <!-- 通过setter注入playerDao对象,对象注入使用ref-->  <property name="playerDao" ref="playerDao"/>
</bean>

2.构造函数注入bean

<!--<bean name="playerDao1" class="xiuzhenyuan.dao.PlayerDaoImp"/>--> <!-- 通过构造注入依赖 --> <bean name="playerDaoServiceImp" class="xiuzhenyuan.service.PlayerDaoServiceImp">
    <!-- 构造方法方式注入playerDao对象,-->  <constructor-arg  ref="playerDao1"/>
</bean>

5.常见问题

1.用setter实例bean和使用setter注入的区别?

如果不存在依赖关系的话,setter实例化bean,和setter注入的方式是一个意思,只是注入更强调依赖关系。

2.IoC和DI由什么关系呢?

其实它们是同一个概念的不同角度描述,ioc强调实例化由容器来帮忙完成,di强调spring注入和对象之间的依赖的关系。

6.参考资料

https://blog.csdn.net/qq_22654611/article/details/52606960/
https://blog.csdn.net/javazejian/article/details/54561302#spring-依赖注入


猜你喜欢

转载自blog.csdn.net/qq_39706019/article/details/81411961
今日推荐