一、环境准备
依赖配置(pom.xml)
<dependencies>
<!-- Spring Context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.34</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>
二、实例化方式详解
1. 构造器实例化(默认方式)
配置示例:
<bean id="userService" class="com.example.UserServiceImpl"/>
Mermaid图示:
业务类:
public interface UserService {
}
public class UserServiceImpl implements UserService {
}
测试代码:
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class InstanceDemoTest {
@Test
public void testConstructor() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("instanceDemo.xml");
UserService service = ctx.getBean("userService", UserService.class);
System.out.println(service);
}
}
2. 静态工厂实例化
工厂类:
public class ServiceFactory {
public static UserService createUserService() {
return new UserServiceImpl();
}
}
XML配置:
id
:beanName。factory-method
:方法返回值就是Bean。
<bean id="staticUserService"
class="com.example.ServiceFactory"
factory-method="createUserService"/>
测试代码:
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class InstanceDemoTest {
@Test
public void testConstructor() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("instanceDemo.xml");
UserService service = ctx.getBean("staticUserService", UserService.class);
System.out.println(service);
}
}
Mermaid流程:
3. 实例工厂实例化
工厂类:
public class InstanceFactory {
public UserService buildUserService() {
return new UserServiceImpl();
}
}
XML配置:
id
:beanName。factory-bean
:指定要使用的工厂实例。factory-method
:指定工厂实例中用于创建 Bean 的方法名。
<!-- 先创建工厂实例 -->
<bean id="instanceFactory" class="com.example.InstanceFactory"/>
<!-- 通过工厂实例创建Bean -->
<bean id="instanceUserService"
factory-bean="instanceFactory"
factory-method="buildUserService"/>
测试代码:
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class InstanceDemoTest {
@Test
public void testConstructor() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("instanceDemo.xml");
UserService service = ctx.getBean("instanceUserService", UserService.class);
System.out.println(service);
}
}
Mermaid类关系图:
三、完整测试案例
**beans.xml**:<?xml version="1.0" encoding="UTF-8"?>
<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="userService" class="com.example.UserServiceImpl"/>
<!-- 静态工厂 -->
<bean id="staticUserService"
class="com.example.ServiceFactory"
factory-method="createUserService"/>
<!-- 实例工厂 -->
<bean id="instanceFactory" class="com.example.InstanceFactory"/>
<bean id="instanceUserService"
factory-bean="instanceFactory"
factory-method="buildUserService"/>
</beans>
JUnit测试类:
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class InstanceDemoTest {
@Test
public void testConstructor() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("instanceDemo.xml");
// 默认实例化Bean
UserService defaultBean = ctx.getBean("userService", UserService.class);
// 静态工厂
UserService staticFactoryBean = ctx.getBean("staticUserService", UserService.class);
// 工厂
UserService factoryBean = ctx.getBean("instanceUserService", UserService.class);
System.out.println(defaultBean);
System.out.println(staticFactoryBean);
System.out.println(factoryBean);
}
}
四、不同方式的对比
方式 | 优点 | 适用场景 |
---|---|---|
构造器实例化 | 配置简单,直观 | 简单对象创建,无参构造可用时 |
静态工厂实例化 | 封装创建逻辑,支持复杂初始化 | 需要统一管理对象创建过程 |
实例工厂实例化 | 工厂本身可维护状态,支持更灵活的对象创建逻辑 | 需要根据运行时状态动态创建对象的场景 |
五、常见问题
- 工厂方法是否需要静态?
- 静态工厂方法需要声明为static
- 实例工厂方法不需要static修饰
- 如何选择实例化方式?
- 优先使用构造器方式
- 需要封装创建逻辑时使用工厂模式
- 需要复用工厂实例时选择实例工厂方式
- Spring 5.x对XML配置的支持:
- 仍然完全支持XML配置方式
- 推荐组合使用XML和注解配置
本文示例代码已测试通过Spring 5.3.34版本,建议结合实际的IDE环境进行验证和调试。