Spring基于XML的配置:Bean实例化详解

一、环境准备

依赖配置(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图示

实例化
ApplicationContext
+getBean()
UserServiceImpl
+UserServiceImpl()

业务类

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流程

SpringContainer ServiceFactory UserServiceImpl 调用createUserService() 创建实例 返回Bean SpringContainer ServiceFactory UserServiceImpl

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类关系图

创建
持有
管理
InstanceFactory
+buildUserService()
UserServiceImpl
ApplicationContext

三、完整测试案例

**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);
    }
}

四、不同方式的对比

方式优点适用场景
构造器实例化配置简单,直观简单对象创建,无参构造可用时
静态工厂实例化封装创建逻辑,支持复杂初始化需要统一管理对象创建过程
实例工厂实例化工厂本身可维护状态,支持更灵活的对象创建逻辑需要根据运行时状态动态创建对象的场景

五、常见问题

  1. 工厂方法是否需要静态
    • 静态工厂方法需要声明为static
    • 实例工厂方法不需要static修饰
  2. 如何选择实例化方式
    • 优先使用构造器方式
    • 需要封装创建逻辑时使用工厂模式
    • 需要复用工厂实例时选择实例工厂方式
  3. Spring 5.x对XML配置的支持
    • 仍然完全支持XML配置方式
    • 推荐组合使用XML和注解配置

本文示例代码已测试通过Spring 5.3.34版本,建议结合实际的IDE环境进行验证和调试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值