实例化Bean的方法(基于xml配置)-http://blog.csdn.net/shymi1991/article/details/48153293

版权声明:本文为博主原创文章,未经博主允许不得转载。
spring IoC容器 根据基于xml的配置元数据(configuration metadata),使用反射机制来创建Bean的实例。
创建的方法有三种:
1. 通过构造器<constructor-arg/>
1.1 使用空构造器进行定义。类中必须有空构造器(可以是默认的)
空构造器中没有传入参数,bean的配置只需要一个定义名就可以了。
<bean id="beanID" class="com.szse.beans.HelloApiImpl "> </bean>
例子:
接口HelloApi.Java
- package com.szse.beans;
- public interface HelloApi {
- public void sayHello();
- }
它的实现类HelloApiImpl.java
- package com.szse.beans;
- public class HelloApiImpl implements HelloApi{
- private int num;
- private String message;
- public HelloApiImpl(){
- num = 1;
- message = "Hello world!";
- }
- @Override
- public void sayHello() {
- System.out.println(num + ":" + message);
- }
- }
配置文件HelloWorld.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="http://www.springframework.org/schema/beans"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">
- <bean id="firstBean" class="com.szse.beans.HelloApiImpl ">
- </bean>
- </beans>
单元测试类TestHello.java
- package com.szse.beans;
- import org.junit.Test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class TestHello {
- @Test
- public void testInstantiatingBeanByConstructor() {
- //使用构造器
- ApplicationContext ctx =
- new ClassPathXmlApplicationContext("HelloWorld.xml");
- HelloApi firstBean = ctx.getBean("firstBean", HelloApi.class);
- firstBean.sayHello();
- }
- }
输出 1:Hello world!1.2 带参构造器,类中有带参的构造方法①根据参数索引(index)<bean id="beanID" class="com.szse.beans.HelloApiImpl "><constructor-arg index=" " value=" "/></bean>index表示构造器的第几个参数,从0开始,value即为该参数的值。例子:在HelloApiImpl.java添加
- public HelloApiImpl(int num,String message){
- this.num = num;
- this.message = message;
- }
在HelloWorld.xml文件中添加
- <bean id="secondBean" class="com.szse.beans.HelloApiImpl ">
- <constructor-arg index="0" value="2" />
- <constructor-arg index="1" value="Hello spring!" />
- </bean>
在TestHello.java的测试方法,保留第一个例子作为对比
- @Test
- public void testInstantiatingBeanByConstructor() {
- //使用构造器
- ApplicationContext ctx =
- new ClassPathXmlApplicationContext("HelloWorld.xml");
- HelloApi firstBean = ctx.getBean("firstBean", HelloApi.class);
- firstBean.sayHello();
- HelloApi secondBean = ctx.getBean("secondBean", HelloApi.class);
- secondBean.sayHello();
- }
输出1:Hello world!
2:Hello spring!②根据参数类型(type)
将上面的secondBean配置改为如下
- <bean id="secondBean" class="com.szse.beans.HelloApiImpl ">
- <constructor-arg type="int" value="2" />
- <constructor-arg type="java.lang.String" value="Hello spring!" />
- </bean>
若是java基础类型,type可以直接指定该类型,其他都要用全类名。
测试方法不变,大家可以自己运行一遍试试结果是否一样。
③根据参数名(name)
将上面的secondBean配置改为如下
- <bean id="secondBean" class="com.szse.beans.HelloApiImpl ">
- <constructor-arg name="num" value="2" />
- <constructor-arg name="message" value="Hello spring!" />
- </bean>
测试方法不变,大家可以自己再运行一遍试试结果是否一样。
注:这里解释顺便给大家加深一下 对 “bean的实例是由IoC容器主动创建,而不是由我们自己创建” 这句话的理解。可以在构造器中加上System.out.println(”print sth…")。
测试方法中只保留这一句:
ApplicationContext ctx =
new ClassPathXmlApplicationContext("HelloWorld.xml");运行输出,看看是不是我们xml文件中配置了几个bean就会打印出几个“print sth…”。
所以,ApplicationContext加载XML文件时就会创建好所有bean的实例,我们用的时候只需要getBean()就可以了。
2. 使用静态工厂方法
<bean id="beanID" class="com.szse.beans.HelloApiStaticFactory"factory-method="newInstance">
</bean>
注意这里的class属性是静态工厂类,而不是该bean的类。使用factory-method属性来确定哪个静态工厂方法创建的bean实例。
Spring调用工厂方法(也可以包含一组参数),并返回一个有效的对象。如果静态工厂方法需要参数,使用<constructor-arg>元素传入。
例子
静态工场类HelloApiStaticFactory.java
- package com.szse.beans;
- public class HelloApiStaticFactory {
- //工厂方法
- public static HelloApi newInstance(int num,String message) {
- //返回需要的Bean实例
- return new HelloApiImpl(num,message);
- }
- }
xml中加上
- <bean id="thirdBean" class="com.szse.beans.HelloApiStaticFactory" factory-method="newInstance">
- <constructor-arg name="num" value="3" />
- <constructor-arg name="message" value="Hello Jane!" />
- </bean>
测试类中加上方法
- @Test
- public void testInstantiatingBeanByFactory() {
- //使用工场方法
- ApplicationContext ctx =
- new ClassPathXmlApplicationContext("HelloWorld.xml");
- HelloApi thirdBean = ctx.getBean("thirdBean", HelloApi.class);
- thirdBean.sayHello();
- }
输出结果:3:Hello Jane!
3. 使用实例工场方法
先定义实例工厂Bean
<bean id="instanceFactoryBean" class="InstanceFactory全类名"/>
再使用实例工厂Bean创建我们需要的Bean,注意这里没有class属性了。若要传入指定方法参数,则和使用构造器方式一样。
<bean id="fourthBean" factory-bean="instanceFactoryBean" factory-method="newInstance"> </bean>例子
实例工厂类HelloApiInstanceFactory.java
- package com.szse.beans;
- public class HelloApiInstanceFactory {
- public HelloApi newInstance(int num,String message) {
- return new HelloApiImpl(num,message);
- }
- }
xml文件中加入
- <bean id="instanceFactoryBean" class="com.szse.beans.HelloApiInstanceFactory"/>
- <bean id="fourthBean" factory-bean="instanceFactoryBean" factory-method="newInstance">
- <constructor-arg name="num" value="4" />
- <constructor-arg name="message" value="Hello Tom!" />
- </bean>
测试方法testInstantiatingBeanByFactory加入
- HelloApi fourthBean = ctx.getBean("fourthBean", HelloApi.class);
- fourthBean.sayHello();
输出结果 4:Hello Tom!
这三种实例化Bean的方式只是配置不一样,从获取方式看完全一样。这三种方式都是基于XML配置文件,脱离xml文件
Spring容器还有基于注解(Annotation)的方式来创建Bean,这个我们以后会讲到。
实例化Bean的方法(基于xml配置)-http://blog.csdn.net/shymi1991/article/details/48153293的更多相关文章
- JSON.parseObject将json字符串转换为bean类,是否大小写敏感区分---https://blog.csdn.net/mathlpz126/article/details/80684034
JSON.parseObject将json字符串转换为bean类,是否大小写敏感区分 https://blog.csdn.net/mathlpz126/article/details/80684034
- XML操作:1.XML类(http://blog.csdn.net/happy09li/article/details/7460521)
XML绑定TreeView private void XmlOperation_Load(object sender, EventArgs e) { path = AppDomain.CurrentD ...
- [环境搭建]-Web Api搭建到IIS服务器后PUT请求返回HTTP Error 405.0 - Method Not Allowed 解决方法 转摘:http://blog.csdn.net/qiujuer/article/details/23827531
尝试使用微软的Web Api,他的确是一个很有意思的东西. 让我体会到了许多的方便,但是我发现部署到IIS服务器上去了后PUT和Delete请求将返回405. 原因是IIS的默认处理程序默认情况下只允 ...
- Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析
Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析 本文简要介绍了基于 Spring 的 web project 的启动流程,详细分析了 Spring 框架将开发人员基于 XML ...
- 转-spring-boot 注解配置mybatis+druid(新手上路)-http://blog.csdn.net/sinat_36203615/article/details/53759935
spring-boot 注解配置mybatis+druid(新手上路) 转载 2016年12月20日 10:17:17 标签: sprinb-boot / mybatis / druid 10475 ...
- 基于eclipse的mybatis映射代码自动生成的插件http://blog.csdn.net/fu9958/article/details/7521681
基于eclipse的mybatis映射代码自动生成的插件 分类: JAVA 数据库 工具相关2012-04-29 00:15 2157人阅读 评论(9) 收藏 举报 eclipsegeneratori ...
- maven 依赖文件 pom.xml 编译 mvn compile 运行 不用mvn exec:java -Dexec.mainClass="hello.HelloWorld" 打成jar包 mvn package mvn install http://blog.csdn.net/yaya1943/article/details/48464371
使用maven编译Java项目 http://blog.csdn.net/yaya1943/article/details/48464371 使用"mvn clean"命令清除编 ...
- Nginx 配置location root 转自https://blog.csdn.net/rofth/article/details/78581617
nginx指定文件路径有两种方式root和alias,root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上. 最基本的区别 ...
- Golang拼接字符串的5种方法及其效率_Chrispink-CSDN博客_golang 字符串拼接效率 https://blog.csdn.net/m0_37422289/article/details/103362740
Different ways to concatenate two strings in Golang - GeeksforGeeks https://www.geeksforgeeks.org/di ...
随机推荐
- BUG克星:几款优秀的BUG跟踪管理软件
Bug管理是指对开发,测试,设计等过程中一系列活动过程中出现的bug问题给予纪录.审查.跟踪.分配.修改.验证.关闭.整理.分析.汇总以及删除等一系列活动状态的管理.,最后出相应图表统计,email通 ...
- Java与Flex学习笔记(20)---将flex页面嵌入到jsp页面中
如果我们只需要用到Flex的一部分功能,例如播放器功能,我们可以单独把Flex页面嵌入到Jsp页面中.要想实现此功能,需要下载一个工程,将其覆盖在服务器根目录下即可.你可以在次下载:FlexModul ...
- JAVA面试题整理(5)-数据库
数据库 1.Oracle/mysql分页有什么优化 2.悲观锁.乐观锁 悲观锁(Pessimistic Concurrency Control,PCC):假定会发生并发冲突,屏蔽一切可能违反数据完整性 ...
- 解决 E: Could not get lock /var/lib/apt/lists/lock
参考:Unable to lock the administration directory (/var/lib/dpkg/) is another process using it? 在更换软件源时 ...
- LA 7278 Game of Cards(SG函数)
https://vjudge.net/problem/UVALive-7278 题意: 两个人玩游戏,现在有n堆牌,轮到自己时,先在牌堆中选一堆牌,先在牌堆中选择拿走0~k张牌(至少得剩下一张),然后 ...
- hashmap实现及哈希冲突
原文: https://www.cnblogs.com/peizhe123/p/5790252.html HashMap 采用一种所谓的“Hash 算法”来决定每个元素的存储位置.当程序执行 map. ...
- C#中标准Dispose模式的实现(转载)
需要明确一下C#程序(或者说.NET)中的资源.简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类: 托管资源:由CLR管理分配和释放的资源,即由CLR里new出来的对象: 非托管资源:w ...
- 微信小程序登录,获取code,获取openid,获取session_key
微信小程序登录 wx.login(Object object) 调用接口获取登录凭证(code).通过凭证进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session ...
- Kotlin中的object 与companion object的区别
之前写了一篇Kotlin中常量和静态方法的文章,最近有人提出一个问题,在companion object中调用外部的成员变量会调用不到,这才意识到问题,本篇文章会带着这个疑问来解决问题. 一. obj ...
- UVALive-3645 Objective: Berlin (最大流:时序模型)
题目大意:有n个城市,m条航班.已知每条航班的起点和终点,还有每条航班的载客量.出发时间.到达时间.并且要求在任何一个城市(起点.终点除外)都至少要有30分钟的中转时间,求起点到终点的最大客流量. 题 ...