转自:http://www.sohu.com/a/115194552_466964

我们知道可以通过ApplicationContext的getBean方法来获取Spring容器中已初始化的bean。getBean一共有以下四种方法原型:

l getBean(String name)

l getBean(Class<T> type)

l getBean(String name,Class<T> type)

l getBean(String name,Object[] args)

下来我们分别来探讨以上四种方式获取bean的区别。

首先本案例项目包结构如下图:

其中实体类Person定义如下:

public class Person {

private String name;

private int age;

public Person()

{

}

public Person(String name, int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public String toString() {

return "Person [name=" + name + ", age=" + age + "]";

}

}

applicationContext.xml注册有id为p的bean,配置如下:

<bean id="p" class="com.bean.Person">

<property name="name" value="张三"/>

<property name="age" value="18"/>

</bean>

l getBean(String name)

参数name表示IOC容器中已经实例化的bean的id或者name,且无论是id还是name都要求在IOC容器中是唯一的不能重名。那么这种方法就是通过id或name去查找获取bean.获取bean的参考代码如下:

@Test

public void testPerson()

{

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

Person p = (Person) ctx.getBean("p");

System.out.println(p);

}

l getBean(Class<T> type)

参数Class<T> type表示要加载的Bean的类型。如果该类型没有继承任何父类(Object类除外)和实现接口的话,那么要求该类型的bean在IOC容器中也必须是唯一的。比如applicationContext.xml配置两个类型完全一致的bean,且都没有配置id和name属性。

<bean class="com.bean.Person">

<property name="name" value="张三"/>

<property name="age" value="18"/>

</bean>

<bean class="com.bean.Person">

<property name="name" value="李四"/>

<property name="age" value="20"/>

</bean>

那么通过com.bean.Person这种类型来查找bean,参考代码如下:

@Test

public void testPerson()

{

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

Person p = ctx.getBean(Person.class);

System.out.println(p);

}

但是由于属于com.bean.Person的bean在IOC容器中不唯一,所以这里会抛出NoUniqueBeanDefinitionException异常。

由此我们可以总结getBean(String name)和getBean(Class<T> type)的异同点。

相同点:都要求id或者name或者类型在容器中的唯一性。

不同点:getBean(String name)获得的对象需要类型转换而getBean(Class<T> type)获得的对象无需类型转换。

l getBean(String name,Class<T> type)

这种方式比较适合当类型不唯一时,再通过id或者name来获取bean。

例如applicationContext.xml配置有如下bean:

<bean id="p1" class="com.bean.Person">

<property name="name" value="张三"/>

<property name="age" value="18"/>

</bean>

<bean name="p2" class="com.bean.Person">

<property name="name" value="李四"/>

<property name="age" value="20"/>

</bean>

参考代码如下:

@Test

public void testPerson()

{

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

Person p = ctx.getBean("p2",Person.class);

System.out.println(p);

}

这样可以获取到名字叫”李四”的对象。测试结果如下:

l getBean(String name,Object[] args)

这种方式本质还是通过bean的id或者name来获取bean,通过第二个参数Object[] args可以给bean的属性赋值,赋值的方式有两种:构造方法和工厂方法。但是通过这种方式获取的bean必须把scope属性设置为prototype,也就是非单例模式。

先在com.factory包下设计有如下的工厂类:

public class PersonFactory {

//静态工厂注入

public static Person getPersonInstance(String name,int age)throws Exception

{

Person p = (Person)Class.forName("com.bean.Person").newInstance();

Method m = p.getClass().getMethod("setName", java.lang.String.class);

m.invoke(p, name);

m = p.getClass().getMethod("setAge", int.class);

m.invoke(p, age);

return p;

}

}

在applicationContext.xml中配置有如下bean:

<bean name="p3" class="com.bean.Person" scope="prototype"/>

获取bean的参考代码如下:

@Test

public void testPerson()

{

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

Person p = (Person) ctx.getBean("p3",new Object[]{"王五",35});

System.out.println(p);

}

如果想通过工厂注入属性,在applicationContext.xml配置如下bean:

<bean name="p3" class="com.factory.PersonFactory" factory-method="getPersonInstance" scope="prototype">

<constructor-arg name="name">

<null/>

</constructor-arg>

<constructor-arg name="age" value="0"/>

</bean>

ApplicationContext之getBean方法详解的更多相关文章

  1. Spring IoC getBean 方法详解

    前言 本篇文章主要介绍 Spring IoC 容器 getBean() 方法. 下图是一个大致的流程图: 正文 首先定义一个简单的 POJO,如下: public class User { priva ...

  2. spring获取webapplicationcontext,applicationcontext几种方法详解

    法一:在初始化时保存ApplicationContext对象代码: ApplicationContext ac = new FileSystemXmlApplicationContext(" ...

  3. 【spring框架】spring获取webapplicationcontext,applicationcontext几种方法详解--(转)

    方法一:在初始化时保存ApplicationContext对象代码:ApplicationContext ac = new FileSystemXmlApplicationContext(" ...

  4. spring获取webapplicationcontext,applicationcontext几种方法详解(转)

    方法一:在初始化时保存ApplicationContext对象 代码: ApplicationContext ac = new FileSystemXmlApplicationContext(&quo ...

  5. spring获取webapplicationcontext,applicationcontext几种方法详解(转载)

    转载自  http://www.blogjava.net/Todd/archive/2010/04/22/295112.html 方法一:在初始化时保存ApplicationContext对象 代码: ...

  6. session的使用方法详解

    session的使用方法详解 Session是什么呢?简单来说就是服务器给客户端的一个编号.当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站.当每个用户首次与这台WWW服务器 ...

  7. Kooboo CMS - Html.FrontHtml[Helper.cs] 各个方法详解

    下面罗列了方法详解,每一个方法一篇文章. Kooboo CMS - @Html.FrontHtml().HtmlTitle() 详解 Kooboo CMS - Html.FrontHtml.Posit ...

  8. HTTP请求方法详解

    HTTP请求方法详解 请求方法:指定了客户端想对指定的资源/服务器作何种操作 下面我们介绍HTTP/1.1中可用的请求方法: [GET:获取资源]     GET方法用来请求已被URI识别的资源.指定 ...

  9. ecshop后台增加|添加商店设置选项和使用方法详解

    有时候我们想在Ecshop后台做个设置.radio.checkbox 等等来控制页面的显示,看看Ecshop的设计,用到了shop_config这个商店设置功能 Ecshop后台增加|添加商店设置选项 ...

随机推荐

  1. Ubuntu 16.04 中安装谷歌 Chrome 浏览器

    http://jingyan.baidu.com/article/335530da98061b19cb41c31d.html 根据教程安装成功!! http://askubuntu.com/quest ...

  2. bzoj1692

    题解: 二分最近的不相同 然后hash判断是否相同 然后贪心 代码: #include<bits/stdc++.h> using namespace std; #define ull un ...

  3. OO作业总结(三)

    类规格设计 由于没能找到关于类规格设计的发展历史,所以结合程序设计思想的发展来谈谈规格化设计. 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数 据.简单来说 ...

  4. docker(三)容器的基本操作

    下载镜像 docker pull name 基本启动容器 docker run IMAGE command args run 在新容器中运行 IMAGE 镜像名称 command 容器命令 args ...

  5. Cracking The Coding Interview 4.1

    //Implement a function to check if a tree is balanced. For the purposes of this question, a balanced ...

  6. SQL-37 创建索引

    题目描述 针对如下表actor结构创建索引:CREATE TABLE IF NOT EXISTS actor (actor_id smallint(5) NOT NULL PRIMARY KEY,fi ...

  7. SQL-24 获取所有非manager员工当前的薪水情况,给出dept_no、emp_no以及salary ,当前表示to_date='9999-01-01'

    题目描述 获取所有非manager员工当前的薪水情况,给出dept_no.emp_no以及salary ,当前表示to_date='9999-01-01'CREATE TABLE `dept_emp` ...

  8. JavaWeb基础-Session和Cookie

    JSP状态管理 http的无状态性,服务器不会记得发送请求的浏览器是哪一个 保存用户状态的两大机制:session和cookie Cookie:是web服务器保存在客户端的一系列文本信息 作用:对特定 ...

  9. React 高阶组价详解

    这个教程还是不错的...

  10. socketserver 和 事件Event

    socketserver 处理socket服务端 # 服务端TCP: import socketserver from threading import current_thread # fork l ...