传统应用程序可以通过反射方式进行实例化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. ArrayList add remove 代码分析

    Add 首次add 元素需要对数组进行扩容(初始化Capacity 10, 第二次扩容10>>1 为5, 第三次扩容15>>1 为7), 每次扩容之前长度的1.5倍,当add ...

  2. 【Python+selenium Wendriver API】之鼠标悬停事件

    # encoding=utf-8 from selenium import webdriver from selenium.webdriver.common.action_chains import ...

  3. Unity Editor Inspector编辑模板

    效果图: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEdito ...

  4. window下php5安装redis扩展 设置自启动服务

    最近想在5.6版本的开发环境装一下redis的扩展,结果找了半天都是失效链接,特此做下备份 5.3-5.6 https://pecl.php.net/package/redis/2.2.7/windo ...

  5. Github上好的Android开源框架

    1.volley 项目地址 https://github.com/smanikandan14/Volley-demo (1)  JSON,图像等的异步下载: (2)  网络请求的排序(scheduli ...

  6. ASIHTTPRequest中文入门教程全集 http://www.zpluz.com/thread-3284-1-1.html

    本文转载至 目录  3 第  1  章  创建和运行请求  5 1.1.  创建一个同步请求  5 1.2.  创建一个异步请求  5 1.3.  使用程序块(blocks )  6 1.4.  使用 ...

  7. Mysql 行数据转换为列数据

    现有如下表: 需要统计手机所有售卖价格,显示为如下表: 需要使用group_concat对price进行处理,并且去重重复价格 sql如下: select type,group_concat(DIST ...

  8. vs重复编译

    VS用了这么久都没有这样的问题,昨天突然发现在自己电脑时间不对了,就调了下,以后这问题都来了.每次运行项目都要重新编译下,不管改不改底层代码.这让我很痛苦,浪费大量时间,找了好久才得到答案: .时间问 ...

  9. c3p0;maven;model;

  10. 【BZOJ3991】[SDOI2015]寻宝游戏 树链的并+set

    [BZOJ3991][SDOI2015]寻宝游戏 Description 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩 ...