之前我们已经提到过,Spring的核心能力之一就是IOC机制,从上章的示例中我们也可以看到,Spring中的ApplicationContext充当了一个实例化对象的容器的角色,并管理着它们的生命周期。你只需要拿来就可以直接使用了。

那么这些Bean是如何实例化的呢?这一章接着之前Coder的示例,我们就来了解一下这个问题。

1、实例化方式

1.1 构造器方式

Spring默认的情况下是调用Java类的构造器进行初始化的,也就是说它调用了类默认的构造函数,我们试着显性地覆盖默认的构造函数,让它打印一些语句,然后重新执行一下程序:
public class Coder {
private String name;
private int age; public Coder() {
System.out.println("This is the constructor with none-parameter");
} public void print(){
System.out.println("Hello World");
} 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;
}
}
x
 
1
public class Coder {  
2
    private String name;
3
    private int age;
4

5
    public Coder() {
6
        System.out.println("This is the constructor with none-parameter");
7
    }
8

9
    public void print(){
10
        System.out.println("Hello World");
11
    }
12

13
    public String getName() {
14
        return name;
15
    }
16

17
    public void setName(String name) {
18
        this.name = name;
19
    }
20

21
    public int getAge() {
22
        return age;
23
    }
24

25
    public void setAge(int age) {
26
        this.age = age;
27
    }
28
}
 
那么使用构造器方式,我们需要默认设置一些初始化的值,那么需要有对应的构造函数,以及在xml中进行对应的配置,那么配置的方式是利用<constructor-arg>标签,如下:
  • 增加构造函数
  • 增加xml中对应bean标签中的<constructor-arg>
public Coder(String name, int age) {
this.name = name;
this.age = age;
}
4
 
1
public Coder(String name, int age) {
2
    this.name = name;
3
    this.age = age;
4
}
<bean id="coder" class="dulk.learn.spring.Coder">
<constructor-arg index="0" value="Dulk"></constructor-arg>
<constructor-arg index="1" value="27"></constructor-arg>
</bean>
4
 
1
<bean id="coder" class="dulk.learn.spring.Coder">
2
    <constructor-arg index="0" value="Dulk"></constructor-arg>
3
    <constructor-arg index="1" value="27"></constructor-arg>
4
</bean>

顺便覆盖一下Coder的toString方法,在测试类中进行调用,我们就可以看到Bean的信息了:
 

1.2 静态工厂方式

即调用工厂类的静态方法来创建对象,并返回引用。配置文件中的bean标签,除了class属性,还需要用到"factory-method"属性,如下:
public class StaticFactory {
public static Coder produceCoder() {
System.out.println("invoke the produceCode() of StaticFactory");
return new Coder();
}
}
6
 
1
public class StaticFactory {
2
    public static Coder produceCoder() {
3
        System.out.println("invoke the produceCode() of StaticFactory");
4
        return new Coder();
5
    }
6
}
<bean id="coder" class="dulk.learn.spring.StaticFactory" factory-method="produceCoder"></bean>
1
 
1
<bean id="coder" class="dulk.learn.spring.StaticFactory" factory-method="produceCoder"></bean>
 
值得一提的是,尽管这里的静态工厂方法每次返回都使用了new关键字,但你多次获取Coder时却始终是同一个对象,也就是说,new Coder()调用一次之后,该实例化对象就作为单例存储在容器中了,每次获取的都是容器中的该对象,而不是重新实例化。事实上,构造器方式也是如此,Spring中管理Bean的默认方式就是单例模式。

1.3 普通工厂方式

普通工厂方式和静态工厂方式的区别就在于,普通工厂类需要你首先进行初始化,然后再调用其生产方法。这意味着,你在配置普通的对象之前,也要配置工厂类,交给Spring去管理,这里需要额外用到“factory-bean”属性。如下:
public class CustomFactory {
public Coder produceCoder() {
System.out.println("invoke the produceCode() of CustomFactory");
return new Coder();
}
}
6
 
1
public class CustomFactory {
2
    public Coder produceCoder() {
3
        System.out.println("invoke the produceCode() of CustomFactory");
4
        return new Coder();
5
    }
6
}
<bean id="customFactory" class="dulk.learn.spring.CustomFactory"></bean>
<bean id="coder" factory-bean="customFactory" factory-method="produceCoder"></bean>
2
 
1
<bean id="customFactory" class="dulk.learn.spring.CustomFactory"></bean>
2
<bean id="coder" factory-bean="customFactory" factory-method="produceCoder"></bean>
 
工厂类型的生产方式,主要在于可以提前封装一些信息,假如需要数据库连接对象,在工厂类中可以提前将连接信息(数据库连接账户密码等)封装进去,通过工厂类获取的对象可以直接使用。这时候若是使用new来获取新的对象,就无法达到如期的效果。

2、配置文件

Spring提供了import标签,可以在一个配置文件中引入其他Spring配置文件。这种往往在针对不同模块和团队分工合作上,起到了很好的划分作用。语法如下,其中{path}指引入配置文件的相对路径(相对于主配置文件):
<import resource="{path}" />
 
1
<import resource="{path}" />
 

[04] Bean的实例化和多个配置文件的更多相关文章

  1. Spring中Bean的实例化

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

  2. 【Spring】Spring bean的实例化

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

  3. 【spring源码】bean的实例化(转载)

    首先来看一段代码,看过上一节的朋友肯定对这段代码并不陌生.这一段代码诠释了Spring加载bean的完整过程,包括读取配置文件,扫描包,加载类,实例化bean,注入bean属性依赖. 上一节介绍了Sp ...

  4. 【初识Spring】对象(Bean)实例化及属性注入(xml方式)

    title: [初识Spring]对象(Bean)实例化及属性注入(xml方式) date: 2018-08-29 17:35:15 tags: [Java,Web,Spring] --- #初识S ...

  5. Spring中Bean的实例化与DI的过程

    引言 前文我们介绍了关于如何学习Spring的源码以及解析了spring中加载配置文件注册Beandefinition的过程.今天我们继续学习DI的过程. 创建实例和DI过程 IOC和DI都是对spr ...

  6. 【spring源码系列】之【Bean的实例化】

    人生需要探索的热情.坚持的勇气以及热爱生活热爱自己的力量. 1. Bean的实例化 上一篇讲述了bean的生命周期,其中第一步就涉及到了bean的实例化,本文重点分析bean实例化,先进入源码中的Ab ...

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

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

  8. Spring Ioc介绍和Bean的实例化

    一.IoC:Inverse of Control 控制反转   //  依赖注入  Dependency Injection 控制:某一接口具体实现类的选择权 反转:从调用者中移除控制权,转交第三方 ...

  9. bean的实例化方式

    spring中bean的实例化方式有三种,1.构造器实例化,2.实例工厂实例化,3.静态工厂实例化 1.构造器实例化方式 public class bean1 { public bean1() { } ...

随机推荐

  1. python爬虫入门---第三篇:自动下载图片

    适用的图片网站:美桌 源代码: import requests import re import urllib from bs4 import BeautifulSoup def get_html_t ...

  2. 【20190129】CSS-定位问题记录

    很多情况下我在写div的时候都不会把高度写死,而是用子元素撑开高度的方式,但是如果子元素设置了浮动或者position绝对定位,就相当于把子元素从文档流中拿出来了,这时父元素的高度就不能被子元素撑开了 ...

  3. 【工具相关】Web-ionic-npm的安装

    一, 一般最新版本的Node.js集悲剧了npm.在命令行下,输入命令: "npm-v",可以测试npm是否安装.如下图所示: 二,上图显示了npm的版本号,即代表已经安装了npm ...

  4. Android学习笔记----Java中的字符串比较

    用习惯了C#.C++,在做字符串比较时想当然地使用如下语句: string str1 = "abcd", str2 = "abcd"; if(str1==str ...

  5. Nginx 增加 Image 缩略图 功能

            Nginx 增加 Image 缩略图功能,需要使用Nginx Image 缩略图 模块     官网地址:https://github.com/3078825/ngx_image_th ...

  6. linux设置自动更换壁纸

    #!/bin/bash let n=0 files=($HOME/wallpapers/*.jpg) count=${#files[@]} while [ 1 ] do let "n=n%$ ...

  7. 洗礼灵魂,修炼python(34)--面向对象编程(4)—继承

    前面已经说到面向对象编程有封装,继承,多态三大特性,那么其中的继承则很重要,可以直接单独的拿出来解析 继承 1.什么是继承: 字面意是子女继承父母的家产或者特性等.而在编程里继承是指子类继承父类(基类 ...

  8. java web中java和python混合使用

    利用java web技术展示python算法处理后的数据 工具/原料   myeclipse10 pycharm+Anaconda2 方法/步骤     首先安装配置好pycharm+Anaconda ...

  9. rsync续传大目录一例

    场景 要将大约60T的文件从一台服务器上搬到另外一台上.两边分区还不一样大,一边是一个整的60T大分区,另一边是15T一个的小分区. 解决思路 类比茶壶倒水,一个分区一个分区的填,填满一个再填第二个. ...

  10. Unity RGBA16 + Dither

    游戏开发中有些场合,ETC或者说PVRTC压缩质量不满足的情况下,RGBA32(原图)对美术而言肯定可以满足的,但是RGBA32是不管是对内存占用内存太厉害. RGBA16/RGB16会减少内存的占用 ...