实例化bean的三种方式

构造器实例化bean

Person.java

 public class Person {

     private String name;
private Integer age; public Person() {
System.out.println("这是一个无参构造函数");
} public Person(String name) {
this.name = name;
System.out.println("带有name="+name+"参数的构造函数");
} public Person(String name, Integer age) {
this.name = name;
this.age = age;
System.out.println("带有名字="+name+"和年龄="+age+"参数的构造函数");
} }
 

applicationContext.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.xsd"> <bean id="person" class="com.dfdc.spring.demo.Person"></bean>
<bean id="personWithParam" class="com.dfdc.spring.demo.Person">
<constructor-arg name="name" value="等风的草"/>
</bean>
<bean id="personWirhParams" class="com.dfdc.spring.demo.Person">
<constructor-arg name="name" value="等风的草"/>
<constructor-arg name="age" value="21"/>
</bean>
</beans>

以下将省略DTD部分。

测试方法:

 //以下将省略这行
private static final String configLocation = "applicationContext.xml"; /*
*构造函数实例化bean
*/
@Test
public void constructTest() {
ApplicationContext context = new ClassPathXmlApplicationContext(configLocation);
//Person p = (Person) context.getBean("person");//不带参数 //Person p = (Person) context.getBean("personWirhParam");//带一个参数 Person p = (Person) context.getBean("personWirhParams");//带多个参数
}

结果:

静态工厂实例化bean

当采用静态工厂方法创建bean时,除了需要指定class属性外,还需要通过factory-method属性来指定创建bean实例的工厂方法。

Spring将调用此方法返回实例对象,就此而言,跟通过普通构造器创建类实例没什么两样。

下面的bean定义展示了如何通过工厂方法来创建bean实例。 
注意,此定义并未指定返回对象的类型,仅指定该类包含的工厂方法。在此例中,createInstance()必须是一个static方法。

 <bean id="personStaticFactory" class="com.dfdc.spring.demo.PersonStaticFactory" factory-method="createInstance"/>

 <bean id="personStaticFactoryWithParam" class="com.dfdc.spring.demo.PersonStaticFactory" factory-method="createInstance">
<constructor-arg name="name" value="等风的草"/>
</bean>
<bean id="personStaticFactoryParams" class="com.dfdc.spring.demo.PersonStaticFactory" factory-method="createInstance">
<constructor-arg name="name" value="等风的草"/>
<constructor-arg name="age" value="21"/>
</bean>

添加新bean,PersonStaticFactory.java:

 /*
* 静态工厂方法实例化bean
*/
public static Person createInstance() {
return new Person();
} public static Person createInstance(String name) {
return new Person(name);
} public static Person createInstance(String name,Integer age) {
return new Person(name,age);
}

测试代码:

 ApplicationContext context = new ClassPathXmlApplicationContext(configLocation);
context.getBean("personStaticFactory"); context.getBean("personStaticFactoryWithParam"); context.getBean("personStaticFactoryWithParams");
 

结果:

spring调用工厂方法产生对象,但是真正创建对象还是由程序员来完成的。

spring配置文件中,只要是一个bean就会为该bean创建对象。

实例工厂实例化bean

与使用静态工厂方法实例化类似,用来进行实例化的非静态实例工厂方法位于另外一个bean中(即下面的InstanceFactory.java),容器将调用该bean的工厂方法来创建一个新的bean实例。

为使用此机制,class属性必须为空,而factory-bean 属性必须指定为当前(或其祖先)容器中包含工厂方法的bean的名称,而该工厂bean的工厂方法本身必须通过factory-method属性来设定。

添加实例工厂bean,InstanceFactory.java:

 public class InstanceFactory {

     public Person createInstance() {
return new Person();
} public Person createInstance(String name) {
return new Person(name);
} public Person createInstance(String name,Integer age) {
return new Person(name,age);
}
}

applicationContext.xml:

 <!--实例化工厂实例化bean  -->
<bean id="instancefactory" class="com.dfdc.spring.demo.InstanceFactory"/> <bean id="personInstance" factory-bean="instancefactory" factory-method="createInstance"/> <bean id="personInstanceWithParam" factory-bean="instancefactory" factory-method="createInstance">
<constructor-arg name="name" value="等风的草"/>
</bean>
<bean id="personInstanceWithParams" factory-bean="instancefactory" factory-method="createInstance">
<constructor-arg name="name" value="等风的草"/>
<constructor-arg name="age" value="21"/>
</bean>

测试代码:

 /**
* 实例工厂实例化bean
*/
@Test
public void instanceFactoryTest() {
ApplicationContext context = new ClassPathXmlApplicationContext(configLocation);
context.getBean("personInstance");
}

结果:

以上。。。

Spring学习之实例化bean的三种方式的更多相关文章

  1. Spring实例化Bean的三种方式及Bean的类型

    1.使用类构造器实例化  [默认的类构造器] <bean id=“orderService" class="cn.itcast.OrderServiceBean"/ ...

  2. Spring 实例化bean的三种方式

    第一种方法:直接配置Bean <bena id="所需要实例化的一个实例名称" class="包名.类名"/> 例如: 配置文件中的bean.XML ...

  3. Spring 实例化bean的三种方式:

    方法一:使用构造器实例化bean java代码: package com.model; public class User { private String username; public User ...

  4. 02Spring基于xml的IOC配置--实例化Bean的三种方式

    maven依赖 <dependencies> <!--IOC相关依赖--> <dependency> <groupId>org.springframew ...

  5. spring实例化bean的三种方式

    公共使用的实体

  6. 实例化bean的三种方式

    简单的说 当获取bean时: 1.直接创建对象 2.不创建对象,直接调用factory-method指定的静态方法 3.先创建对象,再调用factory-method指点的非静态方法

  7. spring创建bean的三种方式

    spring创建bean的三种方式: 1通过构造方法创建bean(最常用) 1.1 spring默认会通过无参构造方法来创建bean,如果xml文件是这样配置,则实体类中必须要有无参构造方法,无参构造 ...

  8. Solon 开发,三、构建一个Bean的三种方式

    Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...

  9. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring实例化Bean的三种方法

    在面向对象的程序中,要想调用某个类的成员方法,就需要先实例化该类的对象.在 Spring 中,实例化 Bean 有三种方式,分别是构造器实例化.静态工厂方式实例化和实例工厂方式实例化. 构造器实例化 ...

随机推荐

  1. Vue 组件&组件之间的通信 之 使用slot分发内容

    slot详细介绍网址:https://cn.vuejs.org/v2/api/#slot 有时候我们需要在自定义组件内书写一些内容,例如: <com-a> <h1>title& ...

  2. 【题解】Luogu P4867 Gty的二逼妹子序列

    原题传送门 同Luogu P4396 [AHOI2013]作业 询问多了10倍,但还能跑过(smog #include <bits/stdc++.h> #define N 100005 # ...

  3. vml--基础

    VML VML是The Vector Markup Language(矢量可标记语言)的缩写.官网:https://www.vml.com/ ex: <!DOCTYPE html> < ...

  4. VS2110。VC++编译错误"error LNK2005: 已经在 XXX.obj 中定义的问题"

    有时候我们会在头文件当中定义一些全局变量或者全局函数,这种做法会比较方便,但有时候会出现“编译错误"error LNK2005: 已经在 XXX.obj 中定义的问题"的链接问题. ...

  5. openstack-ntp时间同步服务

    ntp时钟同步服务 NTP 工作请求 (1) 客户端将采用随机端口向 NTP 服务器 (UDP:123) 发出时间同步请求 (2)NTP 服务器收到请求后会将发出调校时间 (3)NTP 客户端接收到 ...

  6. kafka可视化客户端工具Kafka Tool

    1.下载 下载地址:http://www.kafkatool.com/download.html 2.安装 根据不同的系统下载对应的版本,我这里kafka版本是1.1.0,下载kafka tool 2 ...

  7. 浮点型/小数/栅格图层转为整数型arcgis操作

    有时候会遇到将32位栅格数据提取属性表的操作,但是一般此类数据都是浮点型,是无法计算得到属性表的.因此我们可以利用数据管理工具下的: 复制栅格工具,在最下面选择16位即可,看自己数据情况选择signe ...

  8. rxjs2学习

    学习一个东西,一定不要管他怎么实现的,先详细的了解他的使用方法. 这篇博客的作用是都点到,书越读越薄,但是不详细阐述.为了记忆.如果想知道更详细,只能看相关的博客. 也是把以前看到的东西能串连起来. ...

  9. hadoop之数据压缩与数据格式

    * 注:本文原创,转载请注明出处,本人保留对未注明出处行为的责任追究. a.数据压缩 优点: 1.节省本地空间 2.节省带宽 缺点: 花时间 1.MR中允许进行数据压缩的地方有三个: 1)input起 ...

  10. APP多开教程

    https://bbs.feng.com/read-htm-tid-11793134.html 本教程原创,送给有需要的人.本人就为了多开百度云盘传数据,故多开两个百度云盘,亲测一周多没毛病.微信多开 ...