前言

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. Eclipse中创建Maven项目失败

    Eclipse中创建Maven项目报错:Unable to create project from archetype org.apache.maven.archetypes:maven-archet ...

  2. 如何找回Ucenter创始人密码,账号无需修改

    UCenter 创始人的密码非常重要,忘记或丢失后,就不能进入 UCenter 进行用户和数据的管理,也会对站点造成安全隐患.由于 UCenter 的密码是采用两次 md5 加一个随机数的形式加密的, ...

  3. C# 抓取网页的img src带参数的图片链接,并下载

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  4. Gridview各种功能+AspNetPager+Ajax实现无刷新存储过程分页 (留着用)

    存储过程: GetProductsCount1: GetProductsByPage: ) * @PageSize) +' id from test)' exec sp_executesql @sql ...

  5. DataList中动态显示DIV

    <%# DataBinder.Eval(Container,  "DataItem.ProductName").ToString() == "股票矩阵" ...

  6. Unity三消算法

    消除算法图文详解 三消算法首要实现的就是找到所有三个或三个以上的可消除对象,但直接找到这些对象是不太现实的,所以我们要将需求拆分.可不可以先获取所有图案相连的对象,进而在获取三消对象,这个算法也是众多 ...

  7. hdfs 机架感知

    一.背景   分布式的集群通常包含非常多的机器,由于受到机架槽位和交换机网口的限制,通常大型的分布式集群都会跨好几个机架,由多个机架上的机器共同组成一个分布式集群.机架内的机器之间的网络速度通常都会高 ...

  8. tomcat和nginx的使用

    1.下载tomcat,配置conf/server.xml,在Host节点下添加Context节点,指定程序目录: <Context path="/ol" docBase=&q ...

  9. mysql5.7系列修改root默认密码

    操作系统为centos7 64 1.修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 mysqld 启动时不对密码进行验证 2. ...

  10. Sql Server 跨服务器连接

    用openrowset连接远程SQL或插入数据 --如果只是临时访问,可以直接用openrowset --查询示例 select * from openrowset('SQLOLEDB', 'sql服 ...