标签: spring framework
2015-09-01 13:43 918人阅读 评论(0) 收藏 举报
 分类:
Spring FrameWork(7) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

spring IoC容器 根据基于xml的配置元数据(configuration metadata),使用反射机制来创建Bean的实例。

创建的方法有三种:

1. 通过构造器<constructor-arg/>

1.1 使用空构造器进行定义。类中必须有空构造器(可以是默认的)

空构造器中没有传入参数,bean的配置只需要一个定义名就可以了。

<bean id="beanID" class="com.szse.beans.HelloApiImpl "> </bean>

例子:

接口HelloApi.Java

  1. package com.szse.beans;
  2. public interface HelloApi {
  3. public void sayHello();
  4. }

它的实现类HelloApiImpl.java

  1. package com.szse.beans;
  2. public class HelloApiImpl implements HelloApi{
  3. private int num;
  4. private String message;
  5. public HelloApiImpl(){
  6. num = 1;
  7. message = "Hello world!";
  8. }
  9. @Override
  10. public void sayHello() {
  11. System.out.println(num + ":" + message);
  12. }
  13. }
配置文件HelloWorld.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://www.springframework.org/schema/beans"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">
  6. <bean id="firstBean" class="com.szse.beans.HelloApiImpl ">
  7. </bean>
  8. </beans>
单元测试类TestHello.java
  1. package com.szse.beans;
  2. import org.junit.Test;
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5. public class TestHello {
  6. @Test
  7. public void testInstantiatingBeanByConstructor() {
  8. //使用构造器
  9. ApplicationContext ctx =
  10. new ClassPathXmlApplicationContext("HelloWorld.xml");
  11. HelloApi firstBean = ctx.getBean("firstBean", HelloApi.class);
  12. firstBean.sayHello();
  13. }
  14. }
输出 1:Hello world!
 
1.2 带参构造器,类中有带参的构造方法
①根据参数索引(index)
<bean id="beanID" class="com.szse.beans.HelloApiImpl "> 
      <constructor-arg  index=" " value=" "/>
</bean>
index表示构造器的第几个参数,从0开始,value即为该参数的值。
例子:
在HelloApiImpl.java添加
  1. public HelloApiImpl(int num,String message){
  2. this.num = num;
  3. this.message = message;
  4. }
在HelloWorld.xml文件中添加
  1. <bean id="secondBean" class="com.szse.beans.HelloApiImpl ">
  2. <constructor-arg index="0" value="2" />
  3. <constructor-arg index="1" value="Hello spring!" />
  4. </bean>

在TestHello.java的测试方法,保留第一个例子作为对比

  1. @Test
  2. public void testInstantiatingBeanByConstructor() {
  3. //使用构造器
  4. ApplicationContext ctx =
  5. new ClassPathXmlApplicationContext("HelloWorld.xml");
  6. HelloApi firstBean = ctx.getBean("firstBean", HelloApi.class);
  7. firstBean.sayHello();
  8. HelloApi secondBean = ctx.getBean("secondBean", HelloApi.class);
  9. secondBean.sayHello();
  10. }

输出1:Hello world!
       2:Hello spring!

②根据参数类型(type)

将上面的secondBean配置改为如下

  1. <bean id="secondBean" class="com.szse.beans.HelloApiImpl ">
  2. <constructor-arg type="int" value="2" />
  3. <constructor-arg type="java.lang.String" value="Hello spring!" />
  4. </bean>

若是java基础类型,type可以直接指定该类型,其他都要用全类名。

测试方法不变,大家可以自己运行一遍试试结果是否一样。

③根据参数名(name)

将上面的secondBean配置改为如下

  1. <bean id="secondBean" class="com.szse.beans.HelloApiImpl ">
  2. <constructor-arg name="num" value="2" />
  3. <constructor-arg name="message" value="Hello spring!" />
  4. </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

  1. package com.szse.beans;
  2. public class HelloApiStaticFactory {
  3. //工厂方法
  4. public static HelloApi newInstance(int num,String message) {
  5. //返回需要的Bean实例
  6. return new HelloApiImpl(num,message);
  7. }
  8. }

xml中加上

  1. <bean id="thirdBean" class="com.szse.beans.HelloApiStaticFactory" factory-method="newInstance">
  2. <constructor-arg name="num" value="3" />
  3. <constructor-arg name="message" value="Hello Jane!" />
  4. </bean>

测试类中加上方法

  1. @Test
  2. public void testInstantiatingBeanByFactory() {
  3. //使用工场方法
  4. ApplicationContext ctx =
  5. new ClassPathXmlApplicationContext("HelloWorld.xml");
  6. HelloApi thirdBean = ctx.getBean("thirdBean", HelloApi.class);
  7. thirdBean.sayHello();
  8. }

输出结果: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

  1. package com.szse.beans;
  2. public class HelloApiInstanceFactory {
  3. public HelloApi newInstance(int num,String message) {
  4. return new HelloApiImpl(num,message);
  5. }
  6. }

xml文件中加入

  1. <bean id="instanceFactoryBean" class="com.szse.beans.HelloApiInstanceFactory"/>
  2. <bean id="fourthBean" factory-bean="instanceFactoryBean" factory-method="newInstance">
  3. <constructor-arg name="num" value="4" />
  4. <constructor-arg name="message" value="Hello Tom!" />
  5. </bean>

测试方法testInstantiatingBeanByFactory加入

  1. HelloApi fourthBean = ctx.getBean("fourthBean", HelloApi.class);
  2. fourthBean.sayHello();

输出结果 4:Hello Tom!

这三种实例化Bean的方式只是配置不一样,从获取方式看完全一样。这三种方式都是基于XML配置文件,脱离xml文件

Spring容器还有基于注解(Annotation)的方式来创建Bean,这个我们以后会讲到。

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

  1. JSON.parseObject将json字符串转换为bean类,是否大小写敏感区分---https://blog.csdn.net/mathlpz126/article/details/80684034

    JSON.parseObject将json字符串转换为bean类,是否大小写敏感区分 https://blog.csdn.net/mathlpz126/article/details/80684034

  2. XML操作:1.XML类(http://blog.csdn.net/happy09li/article/details/7460521)

    XML绑定TreeView private void XmlOperation_Load(object sender, EventArgs e) { path = AppDomain.CurrentD ...

  3. [环境搭建]-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的默认处理程序默认情况下只允 ...

  4. Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析

    Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析 本文简要介绍了基于 Spring 的 web project 的启动流程,详细分析了 Spring 框架将开发人员基于 XML ...

  5. 转-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 ...

  6. 基于eclipse的mybatis映射代码自动生成的插件http://blog.csdn.net/fu9958/article/details/7521681

    基于eclipse的mybatis映射代码自动生成的插件 分类: JAVA 数据库 工具相关2012-04-29 00:15 2157人阅读 评论(9) 收藏 举报 eclipsegeneratori ...

  7. 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"命令清除编 ...

  8. Nginx 配置location root 转自https://blog.csdn.net/rofth/article/details/78581617

    nginx指定文件路径有两种方式root和alias,root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上. 最基本的区别 ...

  9. 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 ...

随机推荐

  1. ssm所需要的pom(jre8、tomcat8、spring4)

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  2. 文件名含中文的JavaWeb文件下载

    在javaweb项目中实现文件下载,当文件名中包含中文文字时,需要进行如下的处理,才能在浏览器端正常显示中文文件名: response.setContentType("octets/stre ...

  3. web上的复制

    你可能曾经尝试过复制网页上的一些文字,得到的却是令人沮丧的的结果.这篇文章介绍相关的内容. 不是真正的文字 这可能是最常见的问题,很多人尝试对一张带有文字的图片进行像文字那样的选择,复制当然不行了. ...

  4. 【运维技术】Nginx安装教程(yum安装,源码编译)

    安装方式 yum直接更新源安装 源码直接编译之后安装 使用yum进行直接安装 Installing a Prebuilt CentOS/RHEL Package from an OS Reposito ...

  5. Python3.x:定时任务实现方式

    Python3.x:定时任务实现方式 Python3.x下实现定时任务的方式有很多种方式. 一.循环sleep: 最简单的方式,在循环里放入要执行的任务,然后sleep一段时间再执行.缺点是,不容易控 ...

  6. JS的 instanceof 方法

    http://www.cnblogs.com/jasonxuli/p/6769282.html 这是 2014-12-10 发在 iteye 上的文章 今天突然想起js的原型继承模型和相关的proto ...

  7. 20145104张家明 《Java程序设计》第5周学习总结

    20145104张家明 <Java程序设计>第5周学习总结 教材学习内容总结 第八章(概括为一下内容) 1.如果父类异常对象在子类异常前被捕捉,则catch子类异常对象的区块将永远不会被执 ...

  8. AJAX,JSON,GSON

    AJAX将数据使用JSON格式发送给后端Servlet或其他语言解析. 对JSON内容使用GSON外扩展包进行分解,并使用(如查询用户名是否已经被注册), 最后使用Map集合设置新的返回状态码,并使用 ...

  9. 简单实现Ubuntu16.04 + caffe2 + CUDA9.0 + cuDNN8.0

    在Ubuntu16.04 CUDA9.0 cuDNN8.0的环境下安装caffe2 本博客比较简单,cuda9.0 cudnn8.0部分请看上一篇博客,其中详细讲了: 如何安装驱动 安装cuda 安装 ...

  10. 解决 vim 乱码

    打开vim安装目录下的_vimrc,在头部加上几句配置语句就能搞定: //设置默认编码 set encoding=utf-8 set fileencodings=utf-8,chinese,latin ...