Spring学习之实例化bean的三种方式
实例化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的三种方式的更多相关文章
- Spring实例化Bean的三种方式及Bean的类型
1.使用类构造器实例化 [默认的类构造器] <bean id=“orderService" class="cn.itcast.OrderServiceBean"/ ...
- Spring 实例化bean的三种方式
第一种方法:直接配置Bean <bena id="所需要实例化的一个实例名称" class="包名.类名"/> 例如: 配置文件中的bean.XML ...
- Spring 实例化bean的三种方式:
方法一:使用构造器实例化bean java代码: package com.model; public class User { private String username; public User ...
- 02Spring基于xml的IOC配置--实例化Bean的三种方式
maven依赖 <dependencies> <!--IOC相关依赖--> <dependency> <groupId>org.springframew ...
- spring实例化bean的三种方式
公共使用的实体
- 实例化bean的三种方式
简单的说 当获取bean时: 1.直接创建对象 2.不创建对象,直接调用factory-method指定的静态方法 3.先创建对象,再调用factory-method指点的非静态方法
- spring创建bean的三种方式
spring创建bean的三种方式: 1通过构造方法创建bean(最常用) 1.1 spring默认会通过无参构造方法来创建bean,如果xml文件是这样配置,则实体类中必须要有无参构造方法,无参构造 ...
- Solon 开发,三、构建一个Bean的三种方式
Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...
- 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring实例化Bean的三种方法
在面向对象的程序中,要想调用某个类的成员方法,就需要先实例化该类的对象.在 Spring 中,实例化 Bean 有三种方式,分别是构造器实例化.静态工厂方式实例化和实例工厂方式实例化. 构造器实例化 ...
随机推荐
- UITextField只能输入数字NSCharacterSet实现
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementS ...
- bootstrap 简单练习(后续把其它页面也进行练习)
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- [524.A]2019-05-02(星期四)登顶梧桐山邀请
*** 看房活动召集 ***五一期间天气炎热, 除了登山活动, 还将组织看房活动.拥有一套自己的住房是很多深圳人的梦想.政府十三五期间计划供应人才住房和保障性住房35万套, 与需求相比仍很少, 排队的 ...
- loadrunner场景之集合点设置技巧
在loadrunner的虚拟用户中,术语concurrent(并发)和simultaneous(同时)存在一些区别,concurrent 是指虚拟场景中参于运行的虚拟用户. 而simultaneous ...
- 2018-2019-2 网络对抗技术 20165303 Exp4 恶意代码分析
实践目标 1.1是监控你自己系统的运行状态,看有没有可疑的程序在运行. 1.2是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sysinternals,systr ...
- Nginx缓存
一.基于proxy_cache的缓存 worker_processes ; events { worker_connections ; } http { include mime.types; def ...
- liunx-centos的安装学习篇
1.centos下载地址:网易镜像:http://mirrors.163.com/centos/6/isos/搜狐镜像:http://mirrors.sohu.com/centos/6/isos/ 2 ...
- Matlab - 各种函数学习
一.find函数 (1)find()函数的基本功能是返回向量或者矩阵中不为0的元素的位置索引. X = [1 0 4 -3 0 0 0 8 6]; index = find(X) 返回不为零的位置索引 ...
- jmeter csv 参数化
from:https://blog.csdn.net/bafasanqianzhang/article/details/77480297 [注意:csv可以上传txt,csv,另外参数必须正确否则会报 ...
- SWUST OJ(1028)
特定字符序列的判断 #include <iostream> #include <cstdlib> #include <stack> #include <str ...