spring 的IOC Service Provider 形成体式格式

转载 2012年03月31日 09:23:54
经由过程spring官方文档可以很快知道怎么操纵XML文件,生成我们想要的IOC容器。可是我想知道Spring给我们供给的IOC 容器是怎么生成出来的。为何经由过程一个BeanFactory或是ApplicationContext就能获取我们想要的对象信息

在spring2.5中,Spring给我们供给生成IOC容器的体式格式有很多种。 1.硬编码 2.采取资料文件设备 3. XML情势设备 4. 注解,在spring3.0中还供给了一种javaconfig体式格式。这里先经由过程硬编码体式格式发挥解析IOC容器是如何产生的,然后再给出XML的体式格式是如何获得BeanFactory和ApplicationContext的办法

起首给大师看看我的Demo目次和目次中响应文件中的代码:

那些测验测验去做某事却失败的人,比那些什么也不测验测验做却成功的人不知要好上几许。


此中我的UserServiceImpl是如下实现的,很简单:

?

public class UserServiceImpl implements UserService {

private Map<String, String> map;

public UserServiceImpl () {
System.out.println("UserServiceImpl");
}

public void printInfo() {
System.out.println("hello word." + map);
}

public void setMap(Map<String, String> map) {
this.map = map;
}
}
?


我的XML设备,后面将解析的spring.xml设备

<bean id="userService" class="com.zhuxy.app.biz.impl.UserServiceImpl">
    <property name="map">
        <map>
            <entry key="hello" value="world"></entry>
            <entry key="love" value="you"></entry>
        </map>
    </property>
</bean>
?



在AppRun 中我添加了如下的代码,欲望运行后,能顺利的履行 printInfo()办法

public static void main(String[] args) {
    UserService userService = (UserService) codeMethod().getBean("userService");
    userService.printInfo();
}

?

?硬编码体式格式

/**
* 经由过程硬编码体式格式
 */
private static BeanFactory codeMethod() {
    DefaultListableBeanFactory beanRegistry = new DefaultListableBeanFactory();
    AbstractBeanDefinition definition = new RootBeanDefinition(UserServiceImpl.class);
    definition.setScope(ConfigurableBeanFactory.SCOPE_SINGLETON);  // 包管单利

    // 将Bean定义注册到容器中
    beanRegistry.registerBeanDefinition("userService", definition);

    Map<String, String> map = new HashMap<String, String>();
    map.put("hello", "world");
    map.put("love", "you");

    // 同过set办法注入
    MutablePropertyValues propertyValues = new MutablePropertyValues();
    propertyValues.addPropertyValue("map", map);
    definition.setPropertyValues(propertyValues);

    return beanRegistry;
}
?

写这段代码之前,我还有些困惑。收拾完下面的图,我逐渐的熟悉打听了:


这张图很清楚的描画了BeanFactory ,DefaultListableBeanFactory ,BeanDefinitionRegistry,以及 XmlBeanFactory之间的关系。

BeanFactory是对生成的Bean进行经管的接口
BeanDefinitionRegistry定义了Bean注册的逻辑
DefaultListableBeanFactory 同时实现了 BeanFactory 和 BeanDefinitionRegistry 2个接口, 从而实现了Bean的注册和经管。

每一个受管的对象在容器中都邑有一个BeanDefinition与之对应,负责保存对象所有的须要信息,此中包含对象的类型,是否是抽象类,机关办法参数,以及其它属性。 当客户端向BeanFactory恳求一个对象的时辰,BeanFactory会经由过程这些信息为客户端返回一个完全可用的对象实例。


对于设备文件的解析,spring供给了XmlBeanDefinitionReader,PropertiesBeanDefinitionReader 2种喜闻乐见的体式格式,也可以本身定义一种体式格式来实现,比如喜好json风格的伴侣,可以本身编写一套json的解析体式格式。

XML 解析体式格式

如下就是经由过程XmlBeanDefinitionReader来解析的做法

/**
   * Spring 为 XML 格局的设备文件供给了BeanDefinitionReader实现即:XmlBeanDefinitionReader。
   * 它负责读取Spring指定格局的XML文件并解析,之后将解析的文件内容映射到BeanDefinition,
   * 并加载到响应 的BeanDefinitionRegistry中,这时就可以给用户应用了
   */
private static BeanFactory xmlMethod1() {
    DefaultListableBeanFactory beanRegistry = new DefaultListableBeanFactory();
    XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanRegistry);
    reader.loadBeanDefinitions("classpath:spring.xml");

    return (BeanFactory) beanRegistry;
}
?



简化版:

/**
  * 简化第一钟 XML 体式格式:
 * Spring 还在DefaultListableBeanFactory的根蒂根基上构建了简化XML格局设备加载的XmlBeanFactory实现
 */
private static BeanFactory xmlMethod2() {
    return new XmlBeanFactory(new ClassPathResource("spring.xml"));
}
?



别的这里还供给了2种体式格式,创建ApplicationContext高低文,同样可以当做Spring 的 IOC Service Provider.

/**
  * 经由过程FileSystemXmlApplicationContext形成ApplicationContext
 */
private static ApplicationContext applicationMethod1() {
    ApplicationContext context = new FileSystemXmlApplicationContext("src/spring.xml");
    return context;
}
?

?

?

/**
 * 经由过程ClassPathXmlApplicationContext形成Application
 */
private static ApplicationContext applicationMethod2() {
    ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
    return context;
}
?


这里为了申明BeanFactory和ApplicationContext 的差别,收拾了下图。

?


从这张图中可以看出
1. ApplicationContext 间接持续于 BeanFactory 。 所以用BeanFactory 能操纵的东东,ApplicationContext 也可以。
2. ApplicationContext 所实现的功能远比BeanFactory的功能多。比如国际化,事务公布等

ps:
在实际应用中,大师可以调查到应用ApplicationContext来加载资料文件,速度比拟BeanFactory会慢很多,占用的体系资料也相对较多。这里主如果因为
采取ApplicationContext默认一开端就初始化所有的对象,而BeanFactory是在初次接见时才初始化这些对象

spring揭秘(三)——掌管大局的IoC Service Provider

IoC Service Provider
  • wangmaohong0717
  • wangmaohong0717
  • 2016年11月28日 21:11
  • 276

服务提供者框架(Service Provider FrameWork)——jdbc连接

服务提供者框架组建: Service Interface  具体的业务逻辑实现 的协议,各大业内厂商根据自己的业务逻辑实现。Service Provider Interface "负责创建其服务...
  • lemon89
  • lemon89
  • 2015年04月18日 12:42
  • 831

Spring中IoC的基本概念(一)

什么是Ioc,spring中Ioc的基本概念
  • Veggiel
  • Veggiel
  • 2016年09月02日 11:24
  • 1072

简明扼要谈Spring IOC的好处

简明扼要谈Spring IOC的好处   IOC:控制反转,它是不是什么技术,它是一种设计模式。所谓控制反转就是由容器控制程序间的关系,而不是传统实现中,由编程代码直接操控。说白了就是由容...
  • u014802309
  • u014802309
  • 2015年01月06日 10:07
  • 1884

Spring IOC 依赖注入的两种方式XML和注解

依赖注入的原理 依赖注入的方式---XML配置 依赖注入的方式---注解的方式 Spring 它的核心就是IOC和AOP。而IOC中实现Bean注入的实现方式之一就是DI(依赖注入)。 ...
  • hechurui
  • hechurui
  • 2015年07月29日 22:18
  • 1625

Spring IOC源码详解之容器初始化

Spring IOC源码详解之容器初始化 上篇介绍了Spring IOC的大致体系类图,先来看一段简短的代码,使用IOC比较典型的代码 ClassPathResource...
  • yujin753
  • yujin753
  • 2015年07月26日 08:51
  • 3413

spring中为什么要使用IOC

开篇前言 在前面的博文中,小编主要简单的介绍了spring的入门知识,随着学习的深入,我们知道spring最核心的两大技术,IOC和AOP,这两个技术也是spring最耀眼的地方,在后续的博文中...
  • sdmxdzb
  • sdmxdzb
  • 2016年08月04日 16:14
  • 2750

Spring IOC容器启动过程

IOC容器启动过程 资源定位(classpath,filesystem等) 载入,将bean定义转换为内部数据结构BeanDefintion 向IOC容器注册bean 资源定位定位配置文件,通过Bea...
  • sichenglain
  • sichenglain
  • 2016年12月18日 13:41
  • 549

Spring IOC(整体流程)

IOC容器基本分成BeanFactory和ApplicationContext两类 BeanFactory是基本,ApplicationContext多用在框架 继承结构如图: BeanFact...
  • zly9923218
  • zly9923218
  • 2016年05月03日 00:07
  • 1688

Spring中IOC配置xml实现和IOC注解实现

1.什么是spring spring 是分层的JavaSE/EE轻量级应用开源框架,已控制反转IOC和面向切面编程AOP为核心,提供了展现层SpringMVC, 和持久层Srping JDBC以及事务...
  • u014292162
  • u014292162
  • 2016年08月22日 16:10
  • 3275
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:spring 的IOC Service Provider 形成体式格式
举报原因:
原因补充:

(最多只允许输入30个字)