`
convertto
  • 浏览: 123816 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

Spring IOC

阅读更多

什么是控制反转
什么是依赖注入
BeanFactory
ApplicationContext
Bean的scope
Bean的生命周期
Type2 Ioc、Type3 IoC
集合对象
资源、消息、事件


什么是控制反转?
IoC,用白话来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓的反转。

什么是依赖注入?
相对IoC 而言,“依赖注入”的确更加准确的描述了这种设计理念。从名字上理解,所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。
依赖注入的几种实现类型
Type1 IoC(接口注入)
Type2 IoC(设值注入)
Type3 IoC(构造注入)

BeanFactory
BeanFactory负责读取Bean定义文件;管理对象的加载、生成;维护Bean对象与Bean对象之间的依赖关系;负责Bean的生命周期。BeanFactory接口包括了5种方法可以调用:
boolean containsBean(String name)
是否包含指定名称的Bean
Object getBean(String name)
取得相对应的Bean实例
Object getBean(String name,Class requiredType)
取得相对应的Bean实例,并转换到指定的类
Class getType(String name)
取得相对应的Bean的Class实例
boolean isSingleton(String name)
测试指定的Bean之scope是否为Singleton

ApplicationContext
ApplicationContext提供一个应用程序所需的更完整的框架功能,例如:
提供更方便地取得资源文件的方法
提供解析文字消息的方法
支持国际化消息
可以发布事件,对事件感兴趣的Bean可以接收这些事件

在实现ApplicationContext的类中,最常使用的是以下3个:
FileSystemXmlApplicationContext
可指定XML定义文件的相对路径或绝对路径读取定义文件
ClassPathXmlApplicationContext
从Classpath设置路径中读取XML定义文件
XmlWebApplicationContext
在Web应用程序的文件架构中,指定相对位置读取定义文件
举例:
可以将第一个Spring程序中的SpringDemo类修改为以下内容:
package org.fire;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringDemo {
    public static void main(String[] args) {
        ApplicationContext context=new
        ClassPathXmlApplicationContext("beans-config.xml");
        HelloBean hello=(HelloBean) context.getBean("helloBean");
        System.out.println(hello.getHelloWorld());
    }
}


Bean的scope
在Spring中,从BeanFactory或ApplicationContext取得的实例被默认为Singleton,也就是默认每一个Bean名称只维持一个实例。
使用Singleton模式产生单一实例,对单线程的程序来说不会有什么问题,但对于多线程的程序,必须注意到线程安全的问题,防止多个线程同时存取共用资源所引发的数据不同步问题,通常Singleton的Bean都是无状态的。
在Spring中,“scope”属性预设是“singleton”,通过将其设置为“prototype”,使得每次指定名称来取得Bean时,都会产生一个新的实例。
举例:
<bean id="date" class="java.util.Date" scope="singleton" />

Resource rs = new ClassPathResource("beans-config1.xml");
BeanFactory factory = new XmlBeanFactory(rs);
Date d1 = (Date) factory.getBean("date");
Thread.sleep(1000);
Date d2 = (Date) factory.getBean("date");
System.out.println(d1);
System.out.println(d2);

<bean id="date" class="java.util.Date" scope="prototype" />

Resource rs = new ClassPathResource("beans-config2.xml");
BeanFactory factory = new XmlBeanFactory(rs);
Date d1 = (Date) factory.getBean("date");
Thread.sleep(1000);
Date d2 = (Date) factory.getBean("date");
System.out.println(d1);
System.out.println(d2);

Bean的生命周期
一个Bean从建立到销毁,会历经几个执行阶段,我们可以在Bean的配置文件中定义“init-method”属性来设置初始化方法;定义“destroy-method”属性来设置销毁方法。
<bean id="beanLife“
    class="BeanLife"
    lazy-init="true"
    init-method="init"
    destroy-method="destroy">
</bean>

public class BeanLife {
  public void init(){
    System.out.println("init");
  }   
  public void destroy(){
    System.out.println("destroy");
  }   
  public static void main(String[] args) {   
    AbstractApplicationContext context=new       ClassPathXmlApplicationContext("applicationContext.xml");
    BeanLife life=(BeanLife) context.getBean("beanLife");
    //向JVM注册关闭
    context.registerShutdownHook();
  }
}


Type2 Ioc、Type3 IoC
在Spring中两种基本的依赖注入方式是设值注入及构造注入。在第1章完成的第一个Spring程序中,利用了Bean的Setter方法完成依赖注入。下面来介绍构造注入如何实现。
实现步骤:
JavaBean
import java.util.Date;

public class HelloBean {
    private String helloWorld;
    private Date date;
    public HelloBean(String helloWorld, Date date) {
        this.helloWorld = helloWorld;
        this.date = date;
    }
    ……
}

Bean的配置文件
<bean id="date" class="java.util.Date" />

<bean id="helloBean" class="HelloBean">
    <constructor-arg index="0">
        <value>Hello,fire</value>
    </constructor-arg>
    <constructor-arg index="1">
        <ref bean="date" />
    </constructor-arg>
</bean>

示范程序
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringDemo {
    public static void main(String[] args) {
         ApplicationContext context=new
         ClassPathXmlApplicationContext("applicationContext.xml");
         HelloBean hello=(HelloBean) context.getBean("helloBean");
         System.out.println(hello.getHelloWorld());
         System.out.println(hello.getDate());
    }
}


集合对象
对于Array、List 、Set 、Map等集合对象,在注入前必须填充入一些对象至集合中,然后再将集合注入至所需的Bean,也可以交由Spring的IoC容器来自动维护或生成集合对象,并完成依赖注入。
实现步骤:
JavaBean
import java.util.List;
import java.util.Map;

public class SomeBean {
    private String[] someArray;
    private List someList;
    private Map someMap;
    ……
}

Bean的配置文件
<bean id="someBean" class="SomeBean">
  <property name="someArray">
    <list>
      <value>1</value><value>2</value><value>3</value>
    </list>
  </property>
  <property name="someList">
    <list>
      <value>张三</value><value>李四</value><value>五王</value>
    </list>
  </property>
  <property name="someMap">
    <map>
      <entry key="1"><value>路人甲</value></entry>
      <entry key="2"><value>路人乙</value></entry>
    </map>
  </property>
</bean>

示范程序
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
SomeBean some = (SomeBean) context.getBean("someBean");
// 取得Array类型依赖注入对象
String[] strs = some.getSomeArray();
for (int i = 0; i < strs.length; i++) {
    System.out.println(strs[i]);
}
// 取得List类型依赖注入对象
List list=some.getSomeList();
for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}
// 取得Map类型依赖注入对象
Map map=some.getSomeMap();
System.out.println(map.get("1"));
System.out.println(map.get("2"));


资源、消息、事件
资源的取得
ApplicationContext.getResource()方法提供了对资源文件访问的支持,示例如下:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//获得资源对象
Resource rs = context.getResource("classpath:test.txt");
// Resource rs = context.getResource("file:src/test.txt");
//资源文件是否存在
if (rs.exists()) {
    //输出资源文件的绝对路径
    System.out.println(rs.getFile().getAbsolutePath());
    //获得资源文件的输入流对象
    InputStream in=rs.getInputStream();
    InputStreamReader inr=new InputStreamReader(in);
    while(inr.ready()){
        System.out.print((char)inr.read());
    }
    in.close();inr.close();
}

解析文字消息
ApplicationContext继承了MessageSource接口,可以使用getMessage()的各种版本的方法来取得文字消息的资源文件,从而实现国际化消息的目的。
messages_en.properties
User {0} login at {1}
messages_zh.properties
用户 {0} 于 {1} 登录

<!-- 使用ResourceBundleMessageSource来取国际化消息 -->
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
  <!-- 设置消息资源的前置档案文件名称 -->
  <property name="basename" value="messages"></property>
</bean>

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 消息中需要传递的参数
Object[] arg = { "Fire", new Date() };
// 输出英文消息
System.out.println(context.getMessage("userLogin", arg, Locale.US));
// 输出中文消息
System.out.println(context.getMessage("userLogin", arg, Locale.CHINA));

事件传播
如果打算发布事件通知ApplicationListener的实例,可以使用ApplicationContext的publishEvent()方法。示例如下:
//自定义动作事件
public class ActionEvent extends ApplicationEvent {
    public ActionEvent(Object source) {
        super(source);
    }
}

<bean id="listener" class="ActionListener" />

//自定义动作事件监听器
public class ActionListener implements ApplicationListener{
    public void onApplicationEvent(ApplicationEvent event) {
        if(event instanceof ActionEvent){
            System.out.println(event.getSource());
        }
    }
}

ApplicationContext context = new     ClassPathXmlApplicationContext("applicationContext.xml");
context.publishEvent(new ActionEvent("Hello"));

分享到:
评论

相关推荐

    springIoc实现原理

    **Spring Ioc 实现原理详解** Spring Ioc(Inversion of Control,控制反转)是Spring框架的核心特性之一,它改变了传统应用程序中对象的创建和管理方式。在传统的软件设计中,对象的创建和依赖关系的维护通常由...

    spring Ioc容器配置

    spring Ioc容器配置 IOC容器数据源配置 &lt;!-- 配置数据源 --&gt; destroy-method="close"&gt; &lt;value&gt;org.gjt.mm.mysql.Driver &lt;value&gt;jdbc:mysql://localhost:3306/demo &lt;value&gt;root ...

    spring ioc和aop原理流程图(详细)

    Spring 框架是Java开发中的核心框架,它主要由两个关键部分组成:IOC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。这两个概念是Spring框架的核心特性,极大地简化了企业...

    实验一 Springioc基本操作.docx

    SpringIOC是Spring Framework中的核心组件之一,负责管理应用程序中的对象、依赖关系和生命周期。 在 Spring IOC 中,对象的创建和管理是通过 BeanFactory 或 ApplicationContext 实现的。BeanFactory 是 Spring ...

    spring ioc

    标题 "Spring IOC" 描述了我们讨论的核心主题——Spring 框架中的依赖注入(Inversion of Control,简称 IOC)机制。Spring 是一个广泛应用的 Java 应用开发框架,其核心特性之一就是IOC,它极大地简化了软件组件...

    Spring IoC加载流程讲解

    Spring IoC 加载流程讲解 在本节中,我们将对 Spring IoC 加载流程进行详细的讲解,并探讨 IoC 思想和依赖倒置原则的应用。 IoC 控制反转 IoC(Inversion of Control)是指在软件设计中,将对象实例的控制权从...

    SpringIoc示例代码

    Spring IOC,全称Inversion of Control,即“控制反转”,是Spring框架的核心特性之一。在传统的Java应用程序中,对象的创建和管理通常由开发者自己控制。而在Spring IOC中,这种控制权被反转,对象的创建、初始化、...

    spring ioc思维导图源文件

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性之一,它允许开发者将对象的创建和管理交给Spring容器来处理,从而使代码更加松耦合,更易于测试和维护。下面将详细介绍Spring IOC的基本概念、...

    SpringIOC经典Demo

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它极大地简化了Java应用的开发,通过将对象的创建和管理交由Spring容器来处理,开发者可以更专注于业务逻辑。下面,我们将深入探讨Spring IOC...

    Springioc注入Demo

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它将对象的创建和管理权交由Spring容器来负责,从而实现了依赖倒置,增强了代码的可测试性和可维护性。DI(Dependency Injection,依赖注入)...

    Spring IoC依赖包

    Spring IoC,全称为Inversion of Control,即控制反转,是Spring框架的核心特性之一。它是一种设计模式,改变了传统程序中的对象创建和管理的方式,将对象的生命周期管理交由Spring容器来负责,使得代码更加解耦,...

    Spring IOC.pdf

    Spring IOC,即Spring控制反转,是Spring框架的核心特性之一。控制反转(Inversion of Control,简称IoC)是一种设计原则,用于减少代码间的耦合,提高系统模块化和代码的重用性。在Spring框架中,IOC具体体现在对...

    Spring IoC源码深度剖析开源架构源码2021.pdf

    标题《Spring IoC源码深度剖析开源架构源码2021.pdf》和描述《Spring IoC源码深度剖析开源架构源码2021.pdf》表明该文档主要面向于分析Spring框架中控制反转(IoC)容器的核心源码,解析和理解其内部的工作机制及...

    Java反射_Spring IOC

    Java反射和Spring IOC是Java开发中的两个重要概念,它们在构建灵活、可扩展的应用程序时起着关键作用。本文将深入探讨这两个主题,并提供相关的学习资源。 首先,让我们了解一下Java反射。Java反射机制是Java语言的...

    Spring Ioc 注解 依赖注入

    ### Spring IoC与注解依赖注入详解 #### 一、Spring框架简介 Spring框架是由Rod Johnson创建的一个开源项目,最初是为了解决企业级应用开发中的复杂性问题而诞生的。Spring框架的核心特性包括IoC(Inversion of ...

    手写spring ioc(三) 资源org.zip

    在本资源"手写spring ioc(三) 资源org.zip"中,我们主要关注的是如何实现一个简易版的Spring IOC(Inversion of Control)容器,它涵盖了ioc的基本功能,包括解决循环依赖、使用构造器注入以及自动注入等核心特性。...

    模拟spring ioc过程

    在Spring框架中,IOC(Inversion of Control,控制反转)是一种设计原则,它将对象的创建和管理职责从应用代码中分离出来,交由框架来处理。这样,开发者可以更专注于业务逻辑,而不是对象的生命周期。AOP(Aspect ...

    springIOC手写框架分析

    springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC...

    spring ioc模块手写demo

    spring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demo...

    Spring IoC讲解PPT

    **Spring 的 IoC 容器** IoC(Inversion of Control)即控制反转,是 Spring 的核心特性之一。在传统的编程模式中,对象之间存在依赖关系,程序员需要手动创建和管理这些对象。而在 Spring 中,IoC 容器负责管理和...

Global site tag (gtag.js) - Google Analytics