Spring中bean实例化的三种方式
之前我已经有好几篇博客介绍Spring框架了,不过当时我们都是使用注解来完成注入的,具体小伙伴可以参考这几篇博客(Spring&SpringMVC框架案例)。那么今天我想来说说如何通过xml配置来实例化bean,其实也很简单。
使用xml配置来实例化bean共分为三种方式,分别是普通构造方法创建、静态工厂创建、实例工厂创建,OK,那么接下来我们来分别看看这几种方式。
普通构造方法创建
这种创建方式使我们使用最多的一种创建方式,直接配置bean节点即可,比如我有一个User类,如下:
public class User {
public void add() {
System.out.println("add()---------");
}
}
然后通过简单配置一个bean节点就可以获取实例了,如下:
<bean class="org.sang.User" id="user"/>
OK,我们通过如下代码进行一个简单的测试:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user");
System.out.println(user);
运行输出结果如下:
静态工厂创建
除了通过普通的构造方法创建之外,我们也可以通过静态构造方法来创建一个bean的实例,假设我有一个类叫做User2,如下:
public class User2 {
public void add() {
System.out.println("add2()---------");
}
}
我给它创建一个静态工厂,如下:
public class User2Factory {
public static User2 getInstance() {
return new User2();
}
}
该工厂中有一个静态方法,该静态方法返回一个User2的实例,在Spring的配置文件中,我们看看如何生成User2的实例:
<bean id="user2" class="org.sang.User2Factory" factory-method="getInstance"/>
还是bean节点,只是多了一个factory-method属性,该属性指明该类中的静态工厂方法名为getInstance,这样Spring框架就知道调用哪个方法来获取User2的实例了,测试代码如下:
@Test
public void test2() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User2 user = (User2) context.getBean("user2");
user.add();
}
测试结果如下:
值得强调的是,这种方法并不常用。
实例工厂创建
小伙伴们看了静态工厂创建bean实例肯定都觉得很麻烦,事实上还有比静态工厂更麻烦的写法,那就是通过实例工厂来创建bean实例。实例工厂,顾名思义,就是我们工厂中的方法不是静态的,比如说,我有一个实体类叫做User3,如下:
public class User3 {
public void add() {
System.out.println("add3()---------");
}
}
然后我还有一个工厂方法,如下:
public class User3Factory {
public User3 getUser3() {
return new User3();
}
}
小伙伴们看到,在User3Factory类中有一个getUser3的方法,该方法返回一个User3类的实例,但是该方法不是静态的,那么我们在Spring的配置文件中要进行怎样的配置才能获取User3的一个实例呢?如下:
<bean class="org.sang.User3Factory" id="user3Factory"/>
<bean id="user3" factory-bean="user3Factory" factory-method="getUser3"/>
第一个bean用来获取user3Factory的实例,第二个bean则根据User3Factory的实例,然后指定factory-method,通过getUser3方法来获取User3的实例。
测试代码如下:
@Test
public void test3() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User3 user = (User3) context.getBean("user3");
user.add();
}
测试结果如下:
OK,以上就是bean实例化的三种方式,最最常用的是第一种。
以上。
本文案例下载:
本文案例GitHub地址https://github.com/lenve/JavaEETest/tree/master/Test28-Spring1。
关注公众号【江南一点雨】,专注于 Spring Boot+微服务以及前后端分离等全栈技术,定期视频教程分享,关注后回复 Java ,领取松哥为你精心准备的 Java 干货!

Spring中bean实例化的三种方式的更多相关文章
- Spring配置文件-Bean实例化的三种方式
1.无参构造方法实例化(详见我的博客) 2.工厂静态方法实例化 创建StaticFactory类 public class StaticFactory { public static UserDao ...
- Spring bean管理器 bean实例化的三种方式
bean实例化的三种方式实现 第一种:使用类的无参数构造方法创建(常用 重要) 第一种实例化方式最常用,实例化类时会通过调用无参构造方法创建.示例代码如下: package spring.com.Us ...
- 【Spring】的【bean】管理(XML配置文件)【Bean实例化的三种方式】
Bean实例化的三种方式 说明:通过配置文件创建对象就称为Bean实例化. 第一种:使用类的无参构造创建(重点) 实体类 package com.tyzr.ioc; public class User ...
- 【转】Spring学习---Bean配置的三种方式(XML、注解、Java类)介绍与对比
[原文]https://www.toutiao.com/i6594205115605844493/ Spring学习Bean配置的三种方式(XML.注解.Java类)介绍与对比 本文将详细介绍Spri ...
- spring学习(03)之bean实例化的三种方式
bean实体例化的三种方式 在spring中有三中实例化bean的方式: 一.使用构造器实例化:(通常使用的一个方法,重点) 二.使用静态工厂方法实例化: 三.使用实例化工厂方法实例化 第一种.使用构 ...
- Bean实例化的三种方式
1. 构造器实例化 spring容器通过bean对应的默认的构造函数来实例化bean. 2. 静态工厂方式实例化 首先创建一个静态工厂类,在类中定义一个静态方法创建实例. 静态工厂类及静态方法: pu ...
- spring bean实例化的三种方式
一.使用类的无参构造创建 配置文件 java代码 注意若类里面没有无参的构造,则会出现异常 二.使用静态工厂创建 配置文件 java代码 Factory类 测试类 结果 三.使用实例工厂 配置文件 1 ...
- spring中创建bean对象的三种方式以及作用范围
时间:2020/02/02 一.在spring的xml配置文件中创建bean对象的三种方式: 1.使用默认构造函数创建.在spring的配置文件中使用bean标签,配以id和class属性之后,且没有 ...
- 浅谈Spring解决循环依赖的三种方式
引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错.下面说一下Spring是如果解决循环依赖的. 第一种: ...
随机推荐
- 2018-2019-2 20165220 《网络对抗技术》Exp1 PC平台逆向破解
实验目的 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShe ...
- 使用JumpServer管理你的服务器
本文介绍CentOS 7从安装jumpserver到简单使用jumpserver管理服务器. 1.Jumpserver介绍 Jumpserver是一款开源的开源的堡垒机,如下图是官网介绍. 官网地址: ...
- WebStorm重复代码快捷表达
一,问题 平时使用WebStorm时需要很多引用js,重复代码比较多,每次都要写很多次同样的代码,那么如何通过几个快捷键来简单的写出重复代码呢? 问题具体描述: 每次都要写两个script的重复: & ...
- 使用mongo获取文章
先在命令行中输入mongo,进入mongo,然后 show dbs # 从结果中发现有cmb_demo_23_hacker use cmb_demo_23_hacker db.all_in_one.f ...
- Linux服务器运维基本命令
========Linux 服务器常用命令================ cd / 根目录cd ../ 上级目录 ls 列出文件目录 clear 清空控制台tar cvzf name.C ...
- ORM框架之SQLAchemy
SQLAchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,即:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果. 1.安装 ...
- Java_流程控制
介绍: java的流程控制结构有三种:顺序.选择.循环 顺序结构,就是从头到尾依次执行每条语句的操作. 选择结构,也称条件控制,是指根据表达式的值有选择的执行. 循环结构,也称回 ...
- Nginx服务器 配置 https
参考 这里 1. 购买证书 2. 补全信息 3. 下载证书( .pem + .key ) 4. 上传至服务器 /usr/local/nginx/conf/cert 下 5. 修改 nginx.con ...
- spring事务管理方式,aop
达内12 note unit 09 01 1.spring事务管理 2.spring提供了对事务管理支持 spring采用aop机制完成事务控制 可以实现在不修改原有组件代码情况下实现事务控制功能. ...
- iNode客户端“未收到服务器回应,即将强行下线,请检查终端能否正常访问网络或者与管理员联系”问题与解决方式
最后在华工校园网用户故障自助手册中找到答案,参考链接: https://max.book118.com/html/2015/0115/11423952.shtm https://wenku.baidu ...