Spring- 通过Xml的方式完成Bean的实例化
传统应用程序可以通过反射方式进行实例化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的实例化的更多相关文章
- 跟着刚哥学习Spring框架--通过注解方式配置Bean(四)
组件扫描:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定组件包括: 1.@Component:基本注解,识别一个受Spring管理的组件 2.@Resposit ...
- Web.xml配置详解之context-param (加载spring的xml,然后初始化bean看的)
http://www.cnblogs.com/goody9807/p/4227296.html(很不错啊) 容器先加载spring的xml,然后初始化bean时,会为bean赋值,包括里面的占位符
- Spring中基于注解方式管理bean
操作步骤 第一步:导入相关jar包 spring IoC的基本包 Spring支持注解的Jar包 第二步:创建Spring配置文件,ApplicationContext.xml 引入约束和开启注解扫描 ...
- Spring 源码学习 - 单例bean的实例化过程
本文作者:geek,一个聪明好学的同事 1. 简介 开发中我们常用@Commpont,@Service,@Resource等注解或者配置xml去声明一个类,使其成为spring容器中的bean,以下我 ...
- spring 5.x 系列第21篇 —— spring 定时任务 (xml配置方式)
源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 关于任务的调度配置定义在springApp ...
- Spring 在xml文件中配置Bean
Spring容器是一个大工厂,负责创建.管理所有的Bean. Spring容器支持2种格式的配置文件:xml文件.properties文件,最常用的是xml文件. Bean在xml文件中的配置 < ...
- spring使用注解的方式创建bean ,将组件加入容器中
第一种使用@Bean的方式 1.创建一个bean package com.springbean; public class Person { private String name; private ...
- spring之通过注解方式配置Bean(一)
(1)组件扫描:spring能够从classpath下自动扫描.侦测和实例化具有特定注解的组件. (2)特定组件包括: @Component:基本注解,标识一个受spring管理的组件: @Respo ...
- Spring 基于xml配置方式的事务
参考前面的声明式事务的例子:http://www.cnblogs.com/caoyc/p/5632198.html 我们做了相应的修改.在dao中和service中的各个类中,去掉所有注解标签.然后为 ...
随机推荐
- ORACLE 12C R2 RAC 安装配置指南
>> from zhuhaiqing.info ASM磁盘空间最低要求 求12C R2相比前一版本,OCR的磁盘占用需求有了明显增长.为了方便操作,设置如下:External: 1个卷x4 ...
- sparkstreaming+socket workCount 小案例
Consumer代码 import org.apache.spark.SparkConf import org.apache.spark.streaming.StreamingContext impo ...
- Vue.js 2 入门与提高(一)
** Vue.js -- 渐进式前端框架 ** Vue.js作为一个后起的前端框架,借鉴了Angular .React等现代前端框架/库的诸多特点,并且 取得了相当不错的成绩. Vue.js的定位是一 ...
- FFmpeg与libx264 x264接口对应关系源代码分析
源代码位于“libavcodec/libx264.c”中.正是有了这部分代码,使得FFmpeg可以调用libx264编码H.264视频. 从图中可以看出,libx264对应的AVCodec结构体ff ...
- linux 上安装apache 出现 configure: error: APR not found. Please read the documentation错误
今日编译apache时出错: #./configure --prefix……检查编辑环境时出现: checking for APR... noconfigure: error: APR not fou ...
- 从sql走向linq的我撞死在起点上
[本文纯个人理解,错误轻喷,非常希望能有大神指点] A left (outer) join B on A.bid=B.id 上面这句话叫做左连接,原因是left(左)join(加入,连入)被译为左连接 ...
- xcrun: error: unable to find utility "instruments", not a developer tool or in PATH
xcrun: error: unable to find utility "instruments", not a developer tool or in PATH 用web ...
- 将PHP 5.3.3 (cli)升级到PHP 5.6.31 (cli)
centos默认系统安装的是php5.3 [root@sz-local1 scripts]# rpm -qa |grep phpphp-pdo-5.3.3-47.el6.x86_64php-mysql ...
- markdown流程图语法
从网上找了非常久关于markdown语法的文章.机会微乎其微.大多所指向的都是同一个页面https://github.com/adrai/flowchart.js 这是github上的一个开源项目,里 ...
- lucas定理证明
Lucas 定理(证明) A.B是非负整数,p是质数.AB写成p进制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0]. 则组合数C(A,B)与C(a[n],b[n])* ...