首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

【Spring教程四】Spring框架大揭秘:IOC之Bean实例化方式的构造方法、静态工厂、实例工厂实例化方式详解,让你秒变大神!

  • 24-03-05 07:20
  • 3232
  • 13382
blog.csdn.net

Bean的各种实例化方式

  • 1 环境准备
  • 2 构造方法实例化
  • 3 静态工厂实例化
    • 3.1 工厂方式创建bean
    • 3.2 静态工厂实例化
  • 4 实例工厂与FactoryBean
    • 4.1 环境准备
    • 4.2 实例工厂实例化
    • 4.3 FactoryBean的使用

欢迎大家回到《Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《如何在windows11下安装Maven并配置以及 IDEA配置Maven环境]》,本文的上一篇为《 IOC之Bean基础配置》。
在这里插入图片描述

对象已经能交给Spring的IOC容器来创建了,但是容器是如何来创建对象的呢?
就需要研究下bean的实例化过程,在这块内容中主要解决两部分内容,分别是

  • bean是如何创建的
  • 实例化bean的三种方式,构造方法,静态工厂和实例工厂

在讲解这三种创建方式之前,我们需要先确认一件事:
bean本质上就是对象,对象在new的时候会使用构造方法完成,那创建bean也是使用构造方法完成的。
基于这个知识点出发,我们来验证spring中bean的三种创建方式

1 环境准备

为了方便大家阅读代码,重新准备个开发环境,

  • 创建一个Maven项目
  • pom.xml添加依赖
  • resources下添加spring的配置文件applicationContext.xml

这些步骤和前面的都一致,大家可以快速的拷贝即可,最终项目的结构如下:
在这里插入图片描述

2 构造方法实例化

在上述的环境下,我们来研究下Spring中的第一种bean的创建方式构造方法实例化:
步骤1:准备需要被创建的类
准备一个BookDao和BookDaoImpl类

public interface BookDao {
	public void save();
	}
	public class BookDaoImpl implements BookDao {
	public void save() {
		System.out.println("book dao save ...");
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

步骤2:将类配置到Spring容器


<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="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
beans>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

步骤3:编写运行程序

public class AppForInstanceBook {
	public static void main(String[] args) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
		BookDao bookDao = (BookDao) ctx.getBean("bookDao");
		bookDao.save();
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

步骤4:类中提供构造函数测试
在BookDaoImpl类中添加一个无参构造函数,并打印一句话,方便观察结果。

public class BookDaoImpl implements BookDao {
	public BookDaoImpl() {
		System.out.println("book dao constructor is running ....");
	}
	public void save() {
		System.out.println("book dao save ...");
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

运行程序,如果控制台有打印构造函数中的输出,说明Spring容器在创建对象的时候也走的是构造函
数
在这里插入图片描述
步骤5:将构造函数改成private测试

public class BookDaoImpl implements BookDao {
	private BookDaoImpl() {
		System.out.println("book dao constructor is running ....");
	}
	public void save() {
		System.out.println("book dao save ...");
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

运行程序,能执行成功,说明内部走的依然是构造函数,能访问到类中的私有构造方法,显而易见
Spring底层用的是反射
在这里插入图片描述
步骤6:构造函数中添加一个参数测试

public class BookDaoImpl implements BookDao {
	private BookDaoImpl(int i) {
		System.out.println("book dao constructor is running ....");
	}
	public void save() {
		System.out.println("book dao save ...");
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

运行程序,
程序会报错,说明Spring底层使用的是类的无参构造方法。
在这里插入图片描述

3 静态工厂实例化

接下来研究Spring中的第二种bean的创建方式静态工厂实例化:

3.1 工厂方式创建bean

在讲这种方式之前,我们需要先回顾一个知识点是使用工厂来创建对象的方式:
(1)准备一个OrderDao和OrderDaoImpl类

public interface OrderDao {
	public void save();
	}
	public class OrderDaoImpl implements OrderDao {
	public void save() {
		System.out.println("order dao save ...");
	}
}
```.
(2)创建一个工厂类OrderDaoFactory并提供一个静态方法

```java
//静态工厂创建对象
public class OrderDaoFactory {
	public static OrderDao getOrderDao(){
		return new OrderDaoImpl();
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

(3)编写AppForInstanceOrder运行类,在类中通过工厂获取对象

public class AppForInstanceOrder {
	public static void main(String[] args) {
	//通过静态工厂创建对象
		OrderDao orderDao = OrderDaoFactory.getOrderDao();
		orderDao.save();
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

(4)运行后,可以查看到结果
在这里插入图片描述
如果代码中对象是通过上面的这种方式来创建的,如何将其交给Spring来管理呢?

3.2 静态工厂实例化

这就要用到Spring中的静态工厂实例化的知识了,具体实现步骤为:
(1)在spring的配置文件application.properties中添加以下内容:

<bean id="orderDao" class="com.itheima.factory.OrderDaoFactory" factorymethod="getOrderDao"/>
  • 1

class:工厂类的类全名
factory-mehod:具体工厂类中创建对象的方法名
对应关系如下图:
在这里插入图片描述
(2)在AppForInstanceOrder运行类,使用从IOC容器中获取bean的方法进行运行测试

public class AppForInstanceOrder {
	 public static void main(String[] args) {
	 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
	 OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");
	 orderDao.save();
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

(3)运行后,可以查看到结果
在这里插入图片描述
看到这,可能有人会问了,你这种方式在工厂类中不也是直接new对象的,和我自己直接new没什么太
大的区别,而且静态工厂的方式反而更复杂,这种方式的意义是什么?
主要的原因是:

  • 在工厂的静态方法中,我们除了new对象还可以做其他的一些业务操作,这些操作必不可少,如:
public class OrderDaoFactory {
 public static OrderDao getOrderDao(){
	 System.out.println("factory setup....");//模拟必要的业务操作
	 return new OrderDaoImpl();
 }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

之前new对象的方式就无法添加其他的业务内容,重新运行,查看结果:

在这里插入图片描述
介绍完静态工厂实例化后,这种方式一般是用来兼容早期的一些老系统,所以了解为主。

4 实例工厂与FactoryBean

接下来继续来研究Spring的第三种bean的创建方式实例工厂实例化:

4.1 环境准备

(1)准备一个UserDao和UserDaoImpl类

public interface UserDao {
	public void save();
	}
	public class UserDaoImpl implements UserDao {
		public void save() {
		System.out.println("user dao save ...");
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

(2)创建一个工厂类OrderDaoFactory并提供一个普通方法,注意此处和静态工厂的工厂类不一样的地方是方法不是静态方法

public class UserDaoFactory {
	public UserDao getUserDao(){
		return new UserDaoImpl();
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5

(3)编写AppForInstanceUser运行类,在类中通过工厂获取对象

public class AppForInstanceUser {
	public static void main(String[] args) {
	//创建实例工厂对象
		UserDaoFactory userDaoFactory = new UserDaoFactory();
		//通过实例工厂对象创建对象
		UserDao userDao = userDaoFactory.getUserDao();
		userDao.save();
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

(4)运行后,可以查看到结果
在这里插入图片描述
对于上面这种实例工厂的方式如何交给Spring管理呢?

4.2 实例工厂实例化

具体实现步骤为:
(1)在spring的配置文件中添加以下内容:

<bean id="userFactory" class="com.itheima.factory.UserDaoFactory"/>
<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>
  • 1
  • 2

实例化工厂运行的顺序是:

  • 创建实例化工厂对象,对应的是第一行配置
  • 调用对象中的方法来创建bean,对应的是第二行配置
    • factory-bean:工厂的实例对象
    • factory-method:工厂对象中的具体创建对象的方法名,对应关系如下:
      在这里插入图片描述
      factory-mehod:具体工厂类中创建对象的方法名
      (2)在AppForInstanceUser运行类,使用从IOC容器中获取bean的方法进行运行测试
public class AppForInstanceUser {
	public static void main(String[] args) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
		UserDao userDao = (UserDao) ctx.getBean("userDao");
		userDao.save();
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

(3)运行后,可以查看到结果
在这里插入图片描述
实例工厂实例化的方式就已经介绍完了,配置的过程还是比较复杂,所以Spring为了简化这种配置方式就提供了一种叫FactoryBean的方式来简化开发。

4.3 FactoryBean的使用

具体的使用步骤为:
(1)创建一个UserDaoFactoryBean的类,实现FactoryBean接口,重写接口的方法

public class UserDaoFactoryBean implements FactoryBean<UserDao> {
	//代替原始实例工厂中创建对象的方法
	public UserDao getObject() throws Exception {
		return new UserDaoImpl();
	}
	//返回所创建类的Class对象
	public Class<?> getObjectType() {
		return UserDao.class;
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

(2)在Spring的配置文件中进行配置

<bean id="userDao" class="com.itheima.factory.UserDaoFactoryBean"/>
  • 1

(3)AppForInstanceUser运行类不用做任何修改,直接运行
在这里插入图片描述
这种方式在Spring去整合其他框架的时候会被用到,所以这种方式需要大家理解掌握。

源码获取~定制咨询~非开源
微信名片
注:本文转载自blog.csdn.net的老牛源码的文章"https://biyesheji365.blog.csdn.net/article/details/134718566"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top