【Spring一】IOC控制对象

IoC :inverse of control 控制反转:把对象的创建、初始化、销毁等工作交给spring容器来做,由spring容器控制对象的生命周期。

一.创建对象及别名

对象的创建的过程:

(1)、写一个java类

(2)、写一个spring的配置文件,把该类放入到spring容器中

<bean id="helloWorld" class="com.xxx.HelloWorld"></bean>

(3)、启动spring容器

(4)、把对象从spring容器中取出来

(5)、对象调用方法

说明:bean中的id值是唯一的,不能出现相同的ID值

1.导包:

spring.jar;

commons-logging.jar;

2.创建一个HelloWorld类,提供hello方法;

3.src根目录下新建applicationContext.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"

xsi:schemaLocation="http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<!--

把一个类放入到spring容器中,该类为bean

-->

<!--

id

唯一标识

把helloWorld放入到spring容器中了

-->

<bean id="helloWorld" class="com.oterman.create.HelloWorld1" ></bean>

<!--  给helloWorld创建一个别名,注意name属性的值和bean的ID的值一致
-->

<alias name="helloWorld" alias= "俊哥好帅" />

</beans>

4.测试获取对象


     /**

* 测试创建对象

*/

@Test

public void 
testCreate(){

/**

* 1.启动Spring容器

* 2.取出对象

* 3.调用方法

*/

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

HelloWorld1 helloWorld=(HelloWorld1) context.getBean("helloWorld" );

helloWorld.hello();

}

/**

*测试别名

*/

@Test

public void 
testAlias(){

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

HelloWorld1 helloWorld1=(HelloWorld1 )
context.getBean("俊哥好帅" );

helloWorld1.hello();

}

二、创建对象的三种方法:

1.构造函数实例化

上面的例子就是采用默认构造函数实例化的。

2.静态工厂实例化

为了控制创建对象时调用具体的某个构造函数,可以使用静态工厂来创建对象。

(1)创建静态工厂


public class HelloFactory
{

public static HelloWorld2
getInstance(){

//使用工厂可以控制调用哪一个构造方法

return new HelloWorld2();

}

}

(2)在applicationContext_createMethod.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"

xsi:schemaLocation="http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<bean id="helloWorld2" class="com.oterman.createmethod.HelloWorld2"   ></bean >

<bean id="helloFactory" class="com.oterman.createmethod.HelloFactory" factory-method="getInstance" ></bean>

</beans>

(3)在applicationContext.xml中引入上述xml文件:


< import resource ="com/oterman/createmethod/applicationContext_createMethod.xml" ></import>

(4)测试:


     /**

* 采用静态工厂模式创建对象

*/

@Test

public void 
testCreate_Factory(){

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

HelloWorld2 helloWorld2=(HelloWorld2) context.getBean("helloFactory" );

helloWorld2.hello();

}

3.实例工厂实例化(略)

三.  spring的scope

scope表示创建的对象是单例还是多例。

1、spring创建对象默认是单例模式scope="singleton":

如果把一个list集合声明在该bean的属性中,这样list成了共享的数据,所以一般情况下把list声明在方法中。

即单例的类中的属性是共享的。

2、把spring创建的bean改成prototype模式(多例模式),只需要在<bean>中写一个属性:

scope ="prototype"

       

四.spring什么时候创建对象

1. scope="singleton",单例模式:

(1)、在默认情况下(lazy-init=false或default),spring容器启动的时候,就创建对象了;

优点:有利于开发,当spring容器启动的时候,如果配置文件中有错误,则会报错

(2)、lazy-init="true",即开启延迟初始化,当从spring容器中获取bean的时候创建对象;        

如果所有的bean按照这种模式加载,当spring容器启动的时候是不会报错的

如果一个bean中有大量的数据,需要的是用到的情况下加载

2.scope="prototype",多例模式:

如果spring中的bean是多例,这个时候,不管在配置文件中lazy-init设置成什么样的值,

在context.getBean时才要创建对象,而且不负责销毁 .

即设置了scope="prototype"后,不用再设置lazy-init了,设置了也没有用。

五.spring容器的初始化和销毁

前提条件:spring中的bean是单例的,scope="singleton":

1、在一个bean中可以提供init方法和destroy方法:

<bean>标签中可以设置:

init-method:初始化方法

destroy-method:销毁方法

2、当创建对象完成以后,直接执行init方法,该方法由spring容器来执行:

①lazy-init="false":

spring容器启动->构造方法->init()方法;

②lazy-init="true":

spring启动->context.getBean()->构造方法->init()方法;

3、当spring容器关闭的时候,执行destroy方法,该方法由spring容器来执行,由该方法释放资源

ClassPathXmlApplicationContext xmlApplicationContext = (ClassPathXmlApplicationContext)context;

xmlApplicationContext.close();

说明:

如果spring中的bean是多例的情况下,spring容器不负责对象的销毁,由程序员把该对象设置为null

如果spring中的bean是多例,这个时候,不管在配置文件中lazy-init设置成什么样的值,在context.getBean时才要创建对象,而且不负责销毁

六.解决spring配置文件没提示问题:

windows-->preference--->myeclipse--->files and editors-->xml--->xmlcatalog

点击add ,在出现的窗口中的 Key Type 中选择URI,在location中选择File system,然后找到spring-beans-2.5.xsd文件所在地,

应该把窗口中的

Key Type改为Schema location ,

Key 改为http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-31 01:06:37

【Spring一】IOC控制对象的相关文章

Spring之ioc控制反转(依赖注入)

个人感觉依赖注入比控制反转更好理解,所以下面就只说依赖注入: spring的整体结构示意图: 一.spring 中的概念 beanFactory容器 1.容器是spring框架的核心,容器使用ioc依赖注入来管理所有组成应用系统的组件. 2.spring中的两种容器: beanFactory  这个容器提供了基础的依赖注入支持,而且是延迟加载的,而 applicationcontext是对beanFactory 这个容器的扩展, 3.beanFactory :beanFactory就是一个Bea

[转]Java Spring的Ioc控制反转Java反射原理

转自:http://www.kokojia.com/article/12598.html 学习一个东西的时候,如果想弄明白,最好想想框架内部是如何实现的,如果是我做我会怎么实现.下面我就写一个Ioc DI的程序.Spring就相当于一个Bean工厂,你写好自己的bean,输入配置文件,Spring就可以帮你自动生成bean对象.下面我们创建一个java工程SimulateIoc 我们先写二个Bean.内容都一样,只是类名不一样.定义一个Spring配置文件,我们起名字叫IocConfig.xml

spring中的控制反转IoC和依赖注入DI

原文:http://blog.163.com/[email protected]/blog/static/50639037200721345218382/ IoC(Inversion of Control),这是spring的核心,贯穿始终.所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关 系.这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱好.qq 号.电话号.手机号.

Spring详解(二)------IOC控制反转

我相信提到 Spring,很多人会脱口而出IOC(控制反转).DI(依赖注入).AOP等等概念,这些概念也是面试官经常问到的知识点.那么这篇博客我们就来详细的讲解 IOC控制反转. ps:本篇博客源码下载链接:http://pan.baidu.com/s/1miwZIf2 密码:oquc 1.什么是 IOC? IOC-Inversion of Control,即控制反转.它不是什么技术,而是一种设计思想. 传统的创建对象的方法是直接通过 new 关键字,而 spring 则是通过 IOC 容器来

Spring之IOC/DI(反转控制/依赖注入)_入门Demo

软件152 刘安民 在平时的java应用开发中,我们要实现某一个功能或者说是完成某个业务逻辑时至少需要两个或以上的对象来协作完成,在没有使用Spring的时候,每个对象在需要使用他的合作对象时,自己均要使用像new object() 这样的语法来将合作对象创建出来,这个合作对象是由自己主动创建出来的,创建合作对象的主动权在自己手上,自己需要哪个合作对象,就主动去创建,创建合作对象的主动权和创建时机是由自己把控的,而这样就会使得对象间的耦合度高了,A对象需要使用合作对象B来共同完成一件事,A要使用

Spring的IOC、Spring对象初始化bean时机、Spring容器生命周期

IOC指的是控制反转,把对象的创建.初始化.销毁等工作都交给Spring容器.由spring容器来控制对象的生命周期. Spring对象初始化bean时机: 在默认情况下,只要在Spring容器中配置了一个bean,容器在启动时就会实例化该bean,单例模式. 如果在Spring配制文件时设置懒加载模式(lazy-init="true"),在getBean时才会实例化对象. 如果scope="prototype"时,无论lazy-init的值是什么都只会在使用时才会

Spring的Ioc

引用:http://www.cnblogs.com/xdp-gacl/p/4249939.html 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解. 一.分享Iteye的开涛对Ioc的精彩讲解 首先要分享的是Iteye的开涛这位技术牛人对Spring框

对Spring的IoC和DI最生动的解释

首先想说说IoC(Inversion of Control,控制倒转).这是spring的核心,贯穿始终.所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系.这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱好.qq号.电话号.ip号.iq号………,想办法认识她们,投其所好送其所要,然后嘿嘿……这个过程是复杂深奥的,我们必须自己设计和面对每个环节.传统的程序开发也是如此,在

Spring.Net——理解控制反转和依赖倒置

一,控制反转(Inversion of Control,缩写IoC)和依赖注入(Dependency Injection,简称DI) 1,控制反转 IoC(Inversion of Control),这是spring的核心,贯穿始终.所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关 系. 以前,我们是这样创建对象的: /* //普通调用 IPersonDAO persondao=new PersonDAO(); persondao.Save(); */