前言

IoC其实有两种方式,一种是DI,而另一种是DL,即Dependency Lookup(依赖查找),前者是当前软件实体被动接受其依赖的其他组件被IOc容器注入,而后者是当前软件实体主动去某个服务注册地查找其依赖的那些服务。

我们通常提到的Spring IoC实际上是值Spring框架提供的IoC容器实现(IoC Container),而使用Spring IoC容器的典型代码片段是

  ApplicationContext ac = new ClassPathXmlApplicationContext("test.xml");
User user = (User) ac.getBean("testBean");
System.out.println(user.getUserName()+"----------"+user.getEmail());

一、任何一个Spring框架构建的独立的Java应用,通常会存在一行类似于sc.getBean()的代码,实际上这个做的就是DL的工作,Spring Ioc所做的事情

1、收集和注册

在本阶段,我们可以使用XML或Java代码的方式定义一些bean,然后通过收到组装或者让容器基于某些机制自动扫描的形式将这些bean定义收集到IoC容器中。

1)以XML格式配置

<bean id="car" class="com.slp.Car"></bean>

2)以XML Schema形式配置进行批量扫描采集和注册

 <context:component-scan base-package="com.slp">

2、分析和组装

当第一阶段工作完成后,我们可以暂时认为IoC容器中充斥着一个个独立的bean,他们之间没有任何关系,但实际上,他们之间是有依赖关系的,所以,IoC容器在第二阶段做的事情就是分析这些已经在IoC容器中的bean,然后根据他们之间的依赖关系先后组装他们,如果IoC容器发现某个bean依赖于另一个bean,它将会将另一个bean注入依赖他的那么bean,知道所有bean的依赖都注入完成,所有bean都“整装待发”,整个IoC容器的工作即算完成。

至于分析和组装的依据,Sring框架最早是通过XML配置文件的形式来描述bean与bean之间的关系额,随着Java业界研发技术和理念的转变,基于Java代码和Snnotation元信息的描述方式也日渐兴盛(@Autowired和@Inject)但不管是哪种方式,都只是为了简化绑定逻辑描述的各种“表象”,最终都是为本阶段的最终目的服务。

二、了解一点JavaConfig

基于JavaConfig方式额的依赖关系绑定描述基本上映射了最早的基于XML的配置方式

1)表达形式层面

基于XML的配置方式是这样的

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:c="http://www.springframework.org/schema/c"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd"> <bean id="car" class="com.slp.Car"></bean>
</beans>

而基于JavaConfig的配置方式是这样的

 @Configuration
public class MockConfiguration{
//bean定义
}

任何一个标注了@Configuration的java类定义都是JavaConfig配置类

2)注册bean定义层面

基于XML的配置形式

 <bean id="test" class="com.slp.Test">
</bean>

而基于JavaConfig的配置形式

 @Configuration
public class MockTest(){
@Bean
public Test mockTest(){
return new Test();
}
}

任何一个标注了@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器、方法名将默认称为该bean定义的id.

3)表达式依赖注入关系层面

xml形式

 <bean id="test" class="com.slp.Test">
<property name="dependencyService" ref="user"/>
</bean>
<bean id="user" class="com.slp.User"/>

而使用JavaConfig的时候是这样的

 @Configuration
public class MockTest{
@Bean
public Test mockTest(){
return new Test();
}
@Bean
public User user(){
return new User();
}
}

如果一个bean的定义依赖其他bean,则直接调用对应的JavaConfig类中依赖bean的创建方法就可以了。

三、常用的Annotation

1、@ComponentScan

对应XML配置形式中的<context:component-scan>元素,用于配合一些元信息Java Annotation,比如@Conponent和@Repository等,将标注了这些元信息Annotation的bean定义类批量采集到Spring的IoC容器中。

可以通过basePackage等属性来细粒度的定制@ConponentScan自动扫描的范围,如果不指定则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描。

2、@PropertySource与@PropertySources

@PropertySource用于从某些地方加载*.properties文件内容,并将其中的属性加载到IoC容器中,便于填充一些bean定义属性的占位符,当然,这需要PropertySourcesPlaceholderConfigurer的配合

 //Java8或更高版本
@Configuration
@PropertySource("classpath:1.properties")
@PropertySource("classpath:2.properties")
public class XConfiguration{
}
//低版本
@PropertySources({@PropertySource("classpath:1.properties"),@PropertiesSource("classpath:2.properties")})
public class XConfiguration{
}

3、@Import与@ImportResource

在XML形式的配置中,我们通过<import resource="XXX.xml"/>的形式将多个分开的容器配置合到一个配置中,在JavaConfig形式的配置中,我们则使用@Import这个Annotation完成同样目的:

@Configuration

@Import(MockTest.class)

public class XConfiguration{

}

@Import只负责引入JavaConfig形式定义的IoC容器配置,如果有一些遗留的配置或者系统需要以XML形式来配置(比如dubbo框架)我们依然可以通过@ImportResource将他们一起合并到当前JavaConfig配置的容器中。

 @Configuration
@Import(MockTest.class)
@ImportResource("...")
public class XConfiguration{
}

【Spring系列】Spring IoC的更多相关文章

  1. Spring系列之IOC的原理及手动实现

    目录 Spring系列之IOC的原理及手动实现 Spring系列之DI的原理及手动实现 导语 Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架.也是几乎所有J ...

  2. Spring 系列: Spring 框架简介 -7个部分

    Spring 系列: Spring 框架简介 Spring AOP 和 IOC 容器入门 在这由三部分组成的介绍 Spring 框架的系列文章的第一期中,将开始学习如何用 Spring 技术构建轻量级 ...

  3. Spring 系列: Spring 框架简介(转载)

    Spring 系列: Spring 框架简介 http://www.ibm.com/developerworks/cn/java/wa-spring1/ Spring AOP 和 IOC 容器入门 在 ...

  4. Spring 系列: Spring 框架简介

    Spring AOP 和 IOC 容器入门(转载) 在这由三部分组成的介绍 Spring 框架的系列文章的第一期中,将开始学习如何用 Spring 技术构建轻量级的.强壮的 J2EE 应用程序.dev ...

  5. [JavaEE] IBM - Spring 系列: Spring 框架简介

    Spring AOP 和 IOC 容器入门 在这由三部分组成的介绍 Spring 框架的系列文章的第一期中,将开始学习如何用 Spring 技术构建轻量级的.强壮的 J2EE 应用程序.develop ...

  6. Spring系列(1)--IOC 和 DI

    IOC 和 DI IOC 原理 xml 配置文件配置 bean dom4j 读取配置文件 工厂设计模式 反射机制创建对象 applicationContext.xml 配置文件,该配置文件名可自定义: ...

  7. Spring系列之IOC容器

    一.概述 IOC容器就是具有依赖注入功能的容器,IOC容器负责实例化.定位.配置应用程序中的对象及建立这些对象之间的依赖.应用程序无需直接在代码中new 相关的对象,应用程序由IOC容器进行组装.在S ...

  8. Spring系列之手写一个SpringMVC

    目录 Spring系列之IOC的原理及手动实现 Spring系列之DI的原理及手动实现 Spring系列之AOP的原理及手动实现 Spring系列之手写注解与配置文件的解析 引言 在前面的几个章节中我 ...

  9. Spring系列之DI的原理及手动实现

    目录 Spring系列之IOC的原理及手动实现 Spring系列之DI的原理及手动实现 前言 在上一章中,我们介绍和简单实现了容器的部分功能,但是这里还留下了很多的问题.比如我们在构造bean实例的时 ...

  10. Spring系列之AOP的原理及手动实现

    目录 Spring系列之IOC的原理及手动实现 Spring系列之DI的原理及手动实现 引入 到目前为止,我们已经完成了简易的IOC和DI的功能,虽然相比如Spring来说肯定是非常简陋的,但是毕竟我 ...

随机推荐

  1. 解剖SQLSERVER 第九篇 OrcaMDF现在能通过系统DMVs显示元数据(译)

    解剖SQLSERVER 第九篇  OrcaMDF现在能通过系统DMVs显示元数据(译) http://improve.dk/orcamdf-now-exposes-metadata-through-s ...

  2. php 得到一个文件夹下的所有文件,包括子文件中的文件

    $dir = FCPATH."uploads/attachment/"; $this->getFiles($dir); function getFiles($dir) { $ ...

  3. [算法导论]BFS @ Python

    class Graph: def __init__(self): self.V = [] class Vertex: def __init__(self, x): self.key = x self. ...

  4. PHP 图片文件上传代码

    通过 PHP,可以把文件上传到服务器.里面加入一些图片的判断,如果不加判断文件的类型就可以上传任意格式的文件. 为了网站的安全,肯定不让上传php文件,如果有人进入你的后台,上传了一个php文件,你的 ...

  5. bzoj1132

    每次都选最左边的点,然后以这个点为原点 统计和这个点构成的三角形面积和 不难想到极角排序然后由叉积很容易求出 shl ; eps=1e-8; var i,j,k,m,n:longint; x,y:.. ...

  6. HDU 1950 Bridging signals (DP)

    职务地址:HDU 1950 这题是求最长上升序列,可是普通的最长上升序列求法时间复杂度是O(n*n).显然会超时.于是便学了一种O(n*logn)的方法.也非常好理解. 感觉还用到了一点贪心的思想. ...

  7. BZOJ 2878([Noi2012]-失落的游乐园树DP+出站年轮加+后市展望DP+vector的erase)

    2878: [Noi2012]迷失乐园 Time Limit: 10 Sec  Memory Limit: 512 MBSec  Special Judge Submit: 319  Solved:  ...

  8. [转] 快速部署Tomcat项目的Shell脚本

    为了做集群测试,在每台机器上装了3个tomcat,每次发布项目的时候都要反复敲一些命令,重启tomcat之前先检查tomcat进程有没有停掉,没有还要手动kill该进程. 发布次数多了,操作就比较繁琐 ...

  9. Python基础【day03】:字符转编码操作(五)

    本节内容 1.编码介绍 2.字符编码介绍 3.总结 说到python的编码,一句话总结,说多了都是泪啊,这个在以后的python的开发中绝对是一件令人头疼的事情.所以有必要要讲讲清楚 一.编码介绍 1 ...

  10. SQL SERVICE日志收缩

    ALTER DATABASE 数据库SET RECOVERY SIMPLE WITH NO_WAIT;ALTER DATABASE 数据库SET RECOVERY SIMPLE; --简单模式DBCC ...