1. 非自定义Bean实例化方式解析
在Spring框架中,Bean的实例化方式主要分为三种:构造器实例化、静态工厂方法实例化和实例工厂方法实例化。本文将重点探讨如何通过配置非自定义Bean(如JDK内置类或第三方库类)来演示这些实例化方式。
1.1 工厂实例化方式(非静态)
1.1.1 原理剖析
非静态工厂方法实例化是指通过一个已存在的Bean实例(工厂Bean)来创建另一个Bean实例。这种方式特别适用于那些需要通过特定对象方法才能创建的实例。
以java.util.Date和java.text.SimpleDateFormat为例:
- SimpleDateFormat作为工厂Bean
- 通过其parse()方法创建Date对象
这种模式实现了:
- 对象创建逻辑的封装
- 复杂初始化过程的隔离
- 实例创建过程的标准化
注意:工厂Bean必须先于目标Bean定义,因为Spring容器会按照定义顺序初始化Bean
1.1.2 具体实现步骤
XML配置示例:
xml复制<!-- 1. 首先定义工厂Bean -->
<bean class="java.text.SimpleDateFormat" id="simpleDateFormat">
<constructor-arg name="pattern" value="yyyy-MM-dd HH:mm:ss"/>
</bean>
<!-- 2. 使用工厂Bean创建目标Bean -->
<bean class="java.util.Date" id="date"
factory-bean="simpleDateFormat"
factory-method="parse">
<constructor-arg name="source" value="2020-05-05 09:09:09"/>
</bean>
关键参数说明:
factory-bean:指定工厂Bean的IDfactory-method:指定创建实例的方法名constructor-arg:传递给工厂方法的参数
测试代码:
java复制public class BeanFactoryTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext_beanfac.xml");
// 获取通过工厂方法创建的Date实例
Date date = (Date) context.getBean("date");
System.out.println(date);
}
}
1.1.3 常见问题与解决方案
问题1:工厂Bean未正确初始化
- 现象:抛出NoSuchBeanDefinitionException
- 原因:工厂B
