传统应用程序可以通过反射方式进行实例化Bean,而Spring Ioc 容器则需要根据Bean定义的配置元数据使用反射机制来创建Bean。在Spring Ioc 容器中主要有以下几种创建Bean实例的方式:

使用构造器实例化Bean

使用静态工厂方式实例化Bean

使用实例工厂方法实例化Bean

使用空构造器实例化时,该类必须含有空参构造器,如果不存在的话在实例化过程中将会抛出异常。

样例结构

HelloWorld接口

package com.zc.spring.chapter04.instance;

public interface HelloWorld {
public void sayHello();
}

接口实现类

package com.zc.spring.chapter04.instance;

public class HelloWorldImpl implements HelloWorld {

	private String message;

	/**
* 空构造器
*/
public HelloWorldImpl() {
this.message = "hello world!";
} /**
* 带参构造器
* @param message
*/
public HelloWorldImpl(String message) { this.message = message;
} @Override
public void sayHello() {
System.out.println(message); } }

src下的conf/conf-instance.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-3.0.xsd">
<!-- 使用默认构造参数 -->
<bean id="helloWorldWithNoArgs" class="com.zc.spring.chapter04.instance.HelloWorldImpl" /> <!-- 使用有参构造参数 -->
<bean id="helloWorldWithArgs" class="com.zc.spring.chapter04.instance.HelloWorldImpl" >
<!-- 指定构造器参数 -->
<constructor-arg index="0" value="Hello Args!" />
</bean> <!-- 静态工厂方法 -->
<bean id="helloWorldStaticFactory"
class="com.zc.spring.chapter04.instance.HelloWorldStaticFactory" factory-method="newInstance">
<!-- 指定构造器参数 -->
<constructor-arg index="0" value="Hello Static Factory!" />
</bean> <!-- 1.定义实例工厂Bean -->
<bean id="helloWorldInstanceFactory"
class="com.zc.spring.chapter04.instance.HelloWorldInstanceFactory"/>
<!-- 2.使用实例工厂Bean创建Bean -->
<bean id="helloWorldInstance" factory-bean="helloWorldInstanceFactory" factory-method="newInstance" >
<constructor-arg index="0" value="Hello Instance Factory!"></constructor-arg>
</bean> </beans>

  静态工厂

使用静态工厂的方式除了指定必须的class属性,还要指定factory-method属性来指定实例化Bean的方法,而且使用静态工厂方法也允许指定方法参数,Spring Ioc容器将调用此属性指定的方法来获取Bean。

package com.zc.spring.chapter04.instance;

public class HelloWorldStaticFactory {

	/**
* 工厂方法
* @param message
* @return
*/
public static HelloWorld newInstance(String message) {
//返回需要的Bean实例
return new HelloWorldImpl(message);
}
}

  实例工厂

使用实例工厂方式不能指定class属性,此时必须使用factory-bean属性来指定工厂Bean,factory-method属性指定实例化Bean的方法,而且使用实例化工厂方法允许指定方法参数,方式和使用构造器方式一样。

package com.zc.spring.chapter04.instance;

public class HelloWorldInstanceFactory {
/**
* 工厂方法
* @param message
* @return
*/
public HelloWorld newInstance(String message) {
// 返回需要的Bean实例
return new HelloWorldImpl(message);
}
}

  Main

package com.zc.spring.chapter04.instance;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args) {
sayHelloWithNoArgs();
sayHelloWithArgs();
sayHelloStaticFactory();
helloWorldInstanceFactory();
} //使用无参数构造器来实例化Bean
public static void sayHelloWithNoArgs() {
BeanFactory beanFactory = new ClassPathXmlApplicationContext("conf/conf-instance.xml");
HelloWorld helloWorld = beanFactory.getBean("helloWorldWithNoArgs",HelloWorld.class);
helloWorld.sayHello();
} //使用有参数构造器来实例化Bean
public static void sayHelloWithArgs() {
BeanFactory beanFactory = new ClassPathXmlApplicationContext("conf/conf-instance.xml");
HelloWorld helloWorld = beanFactory.getBean("helloWorldWithArgs",HelloWorld.class);
helloWorld.sayHello();
} //使用静态工厂方法来实例化Bean
public static void sayHelloStaticFactory() {
// 1.读取配置文件实例化一个IOC容器
BeanFactory beanFactory = new ClassPathXmlApplicationContext("conf/conf-instance.xml"); // 2.从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现”
HelloWorld helloWorld = beanFactory.getBean("helloWorldStaticFactory",HelloWorld.class); // 3.执行业务逻辑
helloWorld.sayHello();
} // 使用实例工厂方法来实例化Bean
public static void helloWorldInstanceFactory() {
// 1.读取配置文件实例化一个IOC容器
BeanFactory beanFactory = new ClassPathXmlApplicationContext("conf/conf-instance.xml"); // 2.从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现”
HelloWorld helloWorld = beanFactory.getBean("helloWorldInstance",HelloWorld.class); // 3.执行业务逻辑
helloWorld.sayHello();
} }

  

Spring- 通过Xml的方式完成Bean的实例化的更多相关文章

  1. 跟着刚哥学习Spring框架--通过注解方式配置Bean(四)

    组件扫描:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定组件包括: 1.@Component:基本注解,识别一个受Spring管理的组件 2.@Resposit ...

  2. Web.xml配置详解之context-param (加载spring的xml,然后初始化bean看的)

    http://www.cnblogs.com/goody9807/p/4227296.html(很不错啊) 容器先加载spring的xml,然后初始化bean时,会为bean赋值,包括里面的占位符

  3. Spring中基于注解方式管理bean

    操作步骤 第一步:导入相关jar包 spring IoC的基本包 Spring支持注解的Jar包 第二步:创建Spring配置文件,ApplicationContext.xml 引入约束和开启注解扫描 ...

  4. Spring 源码学习 - 单例bean的实例化过程

    本文作者:geek,一个聪明好学的同事 1. 简介 开发中我们常用@Commpont,@Service,@Resource等注解或者配置xml去声明一个类,使其成为spring容器中的bean,以下我 ...

  5. spring 5.x 系列第21篇 —— spring 定时任务 (xml配置方式)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 关于任务的调度配置定义在springApp ...

  6. Spring 在xml文件中配置Bean

    Spring容器是一个大工厂,负责创建.管理所有的Bean. Spring容器支持2种格式的配置文件:xml文件.properties文件,最常用的是xml文件. Bean在xml文件中的配置 < ...

  7. spring使用注解的方式创建bean ,将组件加入容器中

    第一种使用@Bean的方式 1.创建一个bean package com.springbean; public class Person { private String name; private ...

  8. spring之通过注解方式配置Bean(一)

    (1)组件扫描:spring能够从classpath下自动扫描.侦测和实例化具有特定注解的组件. (2)特定组件包括: @Component:基本注解,标识一个受spring管理的组件: @Respo ...

  9. Spring 基于xml配置方式的事务

    参考前面的声明式事务的例子:http://www.cnblogs.com/caoyc/p/5632198.html 我们做了相应的修改.在dao中和service中的各个类中,去掉所有注解标签.然后为 ...

随机推荐

  1. python 中的"switch"用法

    转载:http://python.jobbole.com/82008/ 为什么Python中没有Switch/Case语句? 不同于我用过的其它编程语言,Python 没有 switch / case ...

  2. 清华EMBA课程系列思考之三 -- 中国经济与金融

    清华EMBA的第三次课,大家都已经渐渐了解了课程系列的基本节奏,也逐步适应了思考的基本思路,本次课程涉及到的全部内容都非常专业.闲话少述,直入主题了. 李稻葵教授部分: -- 清华大学经济管理学院弗里 ...

  3. IIS8应用池重启脚本

    重启 IIS8 应用程序池的批处理 批处理很简单:c:\windows\system32\inetsrv\AppCmd.exe stop apppool /apppool.name:"ASP ...

  4. [转载]Axis2 and CXF的比较

    在Celtix 和XFire 宣布合并的同年,另一个著名开源Web 服务框架Axis 的后继者Axis2 也诞生了.Axis2 并非Axis 的2.0 版,而是完全重写了Axis 的新项目.作为功能和 ...

  5. NHibernate 延迟加载与立即加载 (第七篇)

    NHibernate 延迟加载与立即加载 (第七篇) 一.延迟加载 延迟加载可以理解为:当需要用的时候才加载. 假设我们数据库有一个Person对象,一个Country对象,其中Person属于Cou ...

  6. RS-232针脚(8 pin)

    1 CD Carrier Detect 载波检测 2 RXD Receive Data 接收 3 TXD Transmit Data 发送 4 DTR Data Terminal Ready      ...

  7. 中国版Office 365混合部署功能

    中国版Office 365混合部署功能已经正式上线了(原计划6月份推出),虽然支持的类型不如国际版的Office 365全面,但这也标志了该功能与之前相比,已经迈出了重要一步.目前中国版Office ...

  8. HDOJ 4923 Room and Moor

    用一个栈维护b的值,每次把一个数放到栈顶. 看栈首的值是不是大于这个数,假设大于的话将栈顶2个元素合并.b的值就是这两个栈顶元素的平均值. .. Room and Moor Time Limit: 1 ...

  9. Windows下搭建React Native Android开发环境

    准备工作 安装JDK 安装Android SDK 安装C++环境 安装node.js 安装react-native命令行工具 创建项目 运行packager 运行模拟器 安卓运行 安卓调试 安装JDK ...

  10. pdf文件编辑

    下载软件:Foxit PDF Editor,这个工具挺好用的,可以对pdf文件内容进行编辑 Foxit PDF Editor 是第一个真正的PDF文件编辑软件.许多人都希望能找到一个象编辑其它类型的文 ...