前言

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系列-SpringBase+IOC

    Spring 一.前言 Thinking is more important than learning 本文主要讲述spring 以及它的 IOC原理 代码地址:https://gitee.com/ ...

  9. Spring系列之手写一个SpringMVC

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

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

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

随机推荐

  1. lua----------------使用VS2015搭建lua开发环境的一些侥幸成功经验,

    所以本篇博文介绍在Windows平台下,使用VS2015搭建lua开发环境的一些侥幸成功经验,安装过程参考网上教程,安装过程如下(参考http://www.byjth.com/lua/33.html) ...

  2. mysql分页查询语句怎么写?

    ref: http://www.dashen100.com/question/500 是用limit函数 取前5条数据 select * from table_name limit 0,5 或者 se ...

  3. T4使用经验

    .<#@ template debug="true" hostspecific="true" language="C#" #> ...

  4. Intellij 2016非服务器激活

    下载 http://idea.lanyus.com/jar/JetbrainsCrack-2.6.2.jar 并将 JetbrainsCrack-2.6.0.jar 放置到 D盘根目录(也可以根据自己 ...

  5. oauth 2.0转

    原文:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛 ...

  6. excel做回归分析的应用【风控数据分析】

    方法1     统计逻辑:统计一个loginname的所有去重的通讯录数C,统计这个Loginname对应的每个设备对应的通讯录c1,c2,c3…cn; X=(c1/c+c2/c+c3/c+….cn/ ...

  7. 安装vmware vCenter Appliance

    vcenter appliance是一个vmware配置好的基于suse系统的vcenter的all in one式的虚拟机,比安装基于windows的vcenter服务省事多了,所以我选择部署vCe ...

  8. 页面 JavaScript 存在多个同名方法的调用分析

    在 JavaScript 中,不存在方法重载的概念,方法重载指的是可以定义不同类型的参数和参数个数的同名方法,然后可以按需调用. 如需实现按参数个数的不同去执行不同的方法主体,正确的做法是通过定义一个 ...

  9. Linux安装rpc监控系统资源

    1.rpc服务需rsh的支持,一般情况下rsh已安装.rpm -qa rsh查看. 2.右键另存为http://heanet.dl.sourceforge.net/sourceforge/rstatd ...

  10. Nine-patch

    http://developer.android.com/guide/topics/graphics/2d-graphics.html#nine-patch   This NinePatch defi ...