Spring IoC容器如何实例化Bean呢?传统应用程序可以通过new和反射方式进行实例化Bean。而Spring IoC 容器则需要根据Bean定义里的配置元数据使用反射机制来创建Bean。在Spring IoC 容器中主要有以下几种创建Bean实例的方式:

  • 使用构造器实例化Bean
  • 使用静态工厂方式实例化Bean
  • 使用实例工厂方法实例化Bean

构造器实例化

构造器实例化 Bean 是最简单的方式,Spring IoC容器既能使用默认空构造器也能使用有参数构造器两种方式创建Bean

空构造器实例化:要求java Bean必须要有构造方法

  • 空构造器实例化:

  <bean id="helloServiceNoWithArgs" class="com.jike.***.HelloWorldImpl" />

  • 有参数构造器实例化:

  <bean id="helloServiceWithArgs" class="com.jike.***.HelloWorldmpl">

    <!-- 指定构造器参数,index指定位置 -->

    <constructor-arg index="0" value="Hello Spring!"/>

  </bean>

静态工厂实例化

使用静态工厂的方式除了指定必须的class属性,还要指定factory-method属性来指定实例化Bean的方法,而且使用静态工厂方法也允许指定方法参数,Spring IoC容器将调用此属性指定的方法来获取Bean

  • <!--使用有参数构造参数-->

  <bean id="helloServiceStaticFactory" class="com.jike.***.HelloWorldStaticFactory" factory-method="newInstance">

    <!-- 指定构造器参数 -->

    <constructor-arg index="0" value="Hello Static Factory!"/>

  </bean>

实例工厂实例化

使用实例工厂方式不能指定class属性,此时必须使用factory-bean属性来指定工厂Bean,factory-method属性指定实例化Bean的方法,而且使用实例工厂方法允许指定方法参数,方式和使用构造器方式一样,配置如下:

  <!-- 1、定义实例工厂Bean -->

  <bean id="beanInstanceFactory" class="com.jike.***.HelloWorldInstanceFactory" />

  <!-- 2、使用实例工厂Bean创建Bean -->

  <bean id=“helloWorldInstance" factory-bean="beanInstanceFactory" factory-method="newInstance">

    <constructor-arg index="0" value="Hello  Instance Factory!"></constructor-arg>

  </bean>

实例化示例

配置文件配置见上文

基础类HelloWord.java

public interface HelloWorld {
public void sayHello();
}

基础类HelloWordImpl.java

public class HelloWorldImpl implements HelloWorld {

    private String message;

    /**
* 空构造器
*/
public HelloWorldImpl() {
this.message = "Hello World!";
} /**
* 带参构造器
*
* @param message
*/
public HelloWorldImpl(String message) {
this.message = message;
} public void sayHello() {
System.out.println(message);
} }

静态工厂实例化类HelloWorldInstanceFactory.java

public class HelloWorldStaticFactory {
/**
* 工厂方法
*
* @param message
* @return
*/
public static HelloWorld newInstance(String message) {
// 返回需要的Bean实例
return new HelloWorldImpl(message);
} }

实例工厂实例化类HelloWorldStaticFactory.java

public class HelloWorldInstanceFactory {

    /**
* 工厂方法
*
* @param message
* @return
*/
public HelloWorld newInstance(String message) {
// 返回需要的Bean实例
return new HelloWorldImpl(message);
} }

程序入口类Main.java

public class Main {

    public static void main(String[] args) {
helloWorldInstanceFactory();
} //使用无参数构造器来实例化Bean
public static void sayHelloWithNoArgs() {
BeanFactory beanFactory =
new ClassPathXmlApplicationContext("conf/conf-instance.xml");
HelloWorld helloWorld = beanFactory.getBean("helloWorldWithNoArgs", HelloWorld.class);
helloWorld.sayHello();
}
//使用有参数构造器来实例化Bean
public static void sayHelloWithArgs() {
BeanFactory beanFactory =
new ClassPathXmlApplicationContext("conf/conf-instance.xml");
HelloWorld helloWorld = beanFactory.getBean("helloWorldWithArgs", HelloWorld.class);
helloWorld.sayHello();
} //使用静态工厂方法来实例化Bean
public static void helloWorldStaticFactory() {
// 1、读取配置文件实例化一个IOC容器
BeanFactory beanFactory =
new ClassPathXmlApplicationContext("conf/conf-instance.xml");
// 2、从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现”
HelloWorld helloWorld
= beanFactory.getBean("helloWorldStaticFactory", HelloWorld.class);
// 3、执行业务逻辑
helloWorld.sayHello();
} //使用实例化工厂方法来实例化Bean
public static void helloWorldInstanceFactory() {
// 1、读取配置文件实例化一个IOC容器
BeanFactory beanFactory =
new ClassPathXmlApplicationContext("conf/conf-instance.xml");
// 2、从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现编程”
HelloWorld helloWorld
= beanFactory.getBean("helloWorldInstance", HelloWorld.class);
// 3、执行业务逻辑
helloWorld.sayHello();
}
}

Spring---bean的实例化的更多相关文章

  1. 【Spring】Spring bean的实例化

    Spring实现HelloWord 前提: 1.已经在工程中定义了Spring配置文件beans.xml 2.写好了一个测试类HelloWorld,里面有方法getMessage()用于输出" ...

  2. Spring源码解析(四)Bean的实例化和依赖注入

    我们虽然获得了Bean的描述信息BeanDefinition,但是什么时候才会真正的实例化这些Bean呢.其实一共有两个触发点,但是最后实际上调用的是同一个方法. 第一个:在AbstractAppli ...

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

     Bean 定义 被称作 bean 的对象是构成应用程序的支柱也是由 Spring IoC 容器管理的.bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象.这些 bean ...

  4. Spring8:一些常用的Spring Bean扩展接口

    前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格 ...

  5. Spring bean的作用域以及生命周期

    一.request与session的区别 request简介 request范围较小一些,只是一个请求. request对象的生命周期是针对一个客户端(说确切点就是一个浏览器应用程序)的一次请求,当请 ...

  6. Spring中Bean的实例化

                                    Spring中Bean的实例化 在介绍Bean的三种实例化的方式之前,我们首先需要介绍一下什么是Bean,以及Bean的配置方式. 如果 ...

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

    1构造函数实例化 2静态工厂方法实例化 3实例工厂方法实例化 service接口: package service; public interface PersonService { public v ...

  8. Spring学习笔记之Bean的实例化

    一.bean的实例化方法有3种, 1.构造器实例化 2.静态工厂方法实例化 3.实例工厂方法实例化 二.用构造器来实例化 <bean id="ShunDao" class=& ...

  9. Spring三种实例化Bean的方法

    1.实例化bean的三种方法:(1) 构造器<!-- 体验1 --><bean id="personService" class="com.persia ...

  10. spring IOC容器实例化Bean的方式与RequestContextListener应用

    spring IOC容器实例化Bean的方式有: singleton 在spring IOC容器中仅存在一个Bean实例,Bean以单实例的方式存在. prototype 每次从容器中调用Bean时, ...

随机推荐

  1. 夜色的 cocos2d-x 开发笔记 00

    第一次写博客,本人还是大二学生,纯新手,无论是文章的技术性,还是参考性,都不高,但却是根据我的经历,开发过的真实过程,对自己记载一些备忘的笔记,更希望也能帮到一些人. 本人用的win7 + vs201 ...

  2. python模块详解 time与date time

    模块的分类: a:标准库 内置模块 如sys,os等 b:开源模块 大神封装好的 直接可以拿来用的. c:自定义模块 自己封装的模块 Python中通常表示时间的方式有:时间戳.格式化的日期.元组(九 ...

  3. Apache common-io AutoCloseInputStream 分析

    Apache common-io 包是常用的工具包,他提供了对IO操作的一些封装.首先看一下input包下的 AutoCloseInputStream 类 1: * This class is typ ...

  4. Eclipse下JRebel的安装和基本使用

    JRebel有什么用? 做Java Web开发,一个很头疼的事情是,修改了一个类以后,Tomcat必须重新启动. 工程规模小还好说,如果规模大了,重启一次动不动就是一分多钟.那么频繁重启就会导致大量的 ...

  5. CentOS7下SSH服务学习笔记

    测试环境: [root@nmserver-7 ~]# uname -aLinux nmserver-7.test.com 3.10.0-514.el7.centos.plus.i686 #1 SMP ...

  6. excel跨表查询数据

    环境:公司部分部门进行商品盘点,店铺经理要求不经过系统进行盘点,全程采用excel表格处理所示:            左图为总表,右图为首饰部门录入的数据 需求:找出盘点差异(即首饰部商品数量是否和 ...

  7. IOS 拉伸图片(封装)

    /** * 根据图片名返回一张能够自由拉伸的图片 */ +(UIImage *)resizedImage:(NSString *)name { UIImage *image=[UIImage imag ...

  8. IOS 制作动画代码和 设置控件透明度

    方式1: //animateWithDuration用1秒钟的时间,执行代码 [UIView animateWithDuration:1.0 animations:^{ //存放需要执行的动画代码 s ...

  9. spring boot学习1

    转:https://blog.csdn.net/jsyxcjw/article/details/46763639 1 开始 1.1 spring介绍 Spring Boot使开发独立的,产品级别的基于 ...

  10. 如何迅速掌握并提高linux运维技能(收藏文)

    如何迅速掌握并提高linux运维技能   文章来源于南非蚂蚁   之前曾经写过一篇如何学习Linux的文章,得到了很多反馈,大家都在分享自己的学习经验和体会,并且也提出了不少意见和建议.学习这个事情其 ...