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中的各个类中,去掉所有注解标签.然后为 ...
随机推荐
- MySQL 用户与权限管理
MySQL权限系统的主要功能是证实连接到一台给定主机的用户,而且赋予该用户在数据库上的相关DML,DQL权限.MySQL存取控制包括2个阶段,一是server检查是否同意你连接:二是假定你能连接,se ...
- java中已经排序的列表中插入新值
static List<Integer> insertSortedList(){ List<Integer> nums = new ArrayList<Integer&g ...
- 《Lucene in Action 第二版》第三章节的学习总结----IndexSearcher以及Term和QueryParser
本章节告诉我们怎么用搜索.通过这章节的学习,虽然搜索的内部原理不清楚,但是至少应该学会简单的编写搜索程序了本章节,需要掌握如下几个主要API1.IndexSearcher类:搜索索引的门户,发起者. ...
- PlSql加入数据库链接
Oracle-OraDb10g_home2 -> 配置和移植工具 -> net Manager -> 本地 -> 服务命名 -> 加入(网络服务名自己命名,主机名:要 ...
- mysql单表导入数据,全量备份导入单表
(1)“导出”表 导出表是在备份的prepare阶段进行的,因此,一旦完全备份完成,就可以在prepare过程中通过--export选项将某表导出了: innobackupex --apply-log ...
- mongodb 安装及使用
https://www.cnblogs.com/shileima/p/7823434.html
- python3读取BJDA药品经营企业数据
#-*- coding:utf-8 -*- #读取北京FDA的药品经营企业数据 # 20161125 zhangshaohua import re import urllib.request impo ...
- RMQ with Shifts(线段树)
RMQ with Shifts Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%I64d & %I64u Pra ...
- Kerberos Ticket管理
Kerberos Ticket管理 本章介绍如何管理您的Kerberos Ticket,这里的Ticket是指Ticket-Granting-Ticket(TGT),是您访问集群中服务的凭证.我们假设 ...
- Entity Framework 4.1 : 贪婪加载和延迟加载
这篇文章将讨论查询结果的加载控制. EF4.1 允许控制对象之间的关系,当我们进行查询的时候,哪些关系的数据将会被加载到内存呢?所有相关的对象都需要吗?在一些场合可能有意义,例如,当查询的实体仅仅拥有 ...