标签: 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. 72. Edit Distance(编辑距离 动态规划)

    Given two words word1 and word2, find the minimum number of operations required to convert word1 to  ...

  2. 关于Cooperation.GTST

    Cooperation.GTST团队项目简介 我们打算利用Android Studio开发一款博客园的Android APP,初步设想能够实现在Android手机平台使用博客园的相关功能,后续想法会在 ...

  3. 论文笔记——N2N Learning: Network to Network Compression via Policy Gradient Reinforcement Learning

    论文地址:https://arxiv.org/abs/1709.06030 1. 论文思想 利用强化学习,对网络进行裁剪,从Layer Removal和Layer Shrinkage两个维度进行裁剪. ...

  4. 比较两个JSON字符串是否完全相等

    RT,比较两个JSON字符串是否完全相等,这里使用google贡献的Gson. 一,no POJO,即不另外创建一个简单Java类 [java] view plain copy String str1 ...

  5. 原生DOM操作vs框架虚拟DOM比较

    1. 原生 DOM 操作 vs. 通过框架封装操作. 这是一个性能 vs. 可维护性的取舍.框架的意义在于为你掩盖底层的 DOM 操作,让你用更声明式的方式来描述你的目的,从而让你的代码更容易维护.没 ...

  6. Combobox绑定泛型字典时提示“复杂的 DataBinding 接受 IList 或 IListSource 作为数据源”的解决方法

    一般情况下我们会将 DataTable 或 DataView 绑定到 Combobox 控件上,这时候进行数据绑定是没有问题的,因为DataTable 和 DataView 都继承了 IList 接口 ...

  7. BZOJ 4569 【SCOI2016】 萌萌哒

    题目链接:萌萌哒 我先不吐槽题目名……这道题的并查集好像我们考过……既然那道题我没写就来把这道题写了吧(雾 这道题由于合并操作只有\(m\)次,那么很显然的一个想法就是把建一棵线段树类似物,然后每次在 ...

  8. linux进程概论

    1操作系统几大模块 进程管理,进程调度,进程间通讯机制,内存管理,中断异常处理,文件系统,I/O系统,网网络部分. 2操作系统的目的 管理硬件设备,为上层应用程序提供良好的执行环境. 3linux系统 ...

  9. 自定义jQuery的animate动画

    //擦除效果 jQuery.extend(jQuery.easing, { easeOutBack : function(x, t, b, c, d, s) { s = s || 1.3; retur ...

  10. bzoj1068

    题意: 给你一个未压缩串,要求你把它压缩 问你压缩后最小长度 题解: 区间dp 怎么少就怎么来 代码: #include<bits/stdc++.h> using namespace st ...