Spring IOC 容器核心功能解析与优化架构

一、IOC 容器创建 Bean 的四种方式

1.1 普通创建方式

使用场景:直接通过类默认构造器创建对象
实现步骤


<bean id="book01" class="cn.cjxy.ioc_bean.domain.Book"/>

代码说明

  • id:Bean 的唯一标识符
  • class:指定类的全限定名
  • Spring 会调用默认无参构造器实例化对象

1.2 工厂模式创建

使用场景:需要工厂类处理复杂初始化逻辑时
实现步骤

// 工厂类
public class BookFactory {
    public Book createBook() {
        return new Book("001", "Factory Book", 99.9);
    }
}

<bean id="bookFactory" class="cn.cjxy.ioc_bean.factory.BookFactory"/>
<bean id="book02" factory-bean="bookFactory" factory-method="createBook"/>

代码说明

  • 先注册工厂 Bean
  • factory-bean 指向工厂实例
  • factory-method 指定创建方法

1.3 静态工厂创建

使用场景:不需要工厂实例时的高效创建方式
实现步骤

public class BookStaticFactory {
    public static Book createBook() {
        return new Book("002", "Static Book", 88.8);
    }
}

<bean id="book03" class="cn.cjxy.ioc_bean.factory.BookStaticFactory" 
      factory-method="createBook"/>

代码说明

  • 直接通过类名调用静态方法
  • 不需要先注册工厂 Bean

1.4 FactoryBean 接口方式

使用场景:需要精细控制 Bean 创建过程时
实现步骤

public class BookFactoryBean implements FactoryBean<Book> {
    @Override
    public Book getObject() {
        return new Book("003", "FactoryBean Book", 77.7);
    }

    @Override
    public Class<?> getObjectType() {
        return Book.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}

<bean id="book04" class="cn.cjxy.ioc_bean.factory.BookFactoryBean"/>

代码说明

  • 实现 FactoryBean 接口的三个方法
  • 容器实际存储的是 getObject() 返回的对象

二、依赖注入方式优化

2.1 构造器注入

参数匹配方式


<bean id="book05" class="cn.cjxy.ioc_bean.domain.Book">
    <constructor-arg name="id" value="001"/>
    <constructor-arg name="name" value="《论语》"/>
    <constructor-arg name="price" value="28.9"/>
bean>

<bean id="book06" class="cn.cjxy.ioc_bean.domain.Book">
    <constructor-arg index="0" value="002"/>
    <constructor-arg index="1" value="《大学》"/>
    <constructor-arg index="2" value="33.9"/>
bean>


2.2 Setter 注入

标准方式

<bean id="book08" class="cn.cjxy.ioc_bean.domain.Book">
    <property name="id" value="004"/>
    <property name="name" value="《孟子》"/>
    <property name="price" value="22.3"/>
bean>


2.3 p 名称空间注入

配置优化


<beans xmlns:p="http://www.springframework.org/schema/p">

<bean id="book09" class="cn.cjxy.ioc_bean.domain.Book"
      p:id="005" p:name="《狂人日记》" p:price="88.8"/>

2.4 级联赋值

对象嵌套处理


<bean id="emp01" class="cn.cjxy.ioc_bean.domain.Emp">
    <property name="dept.id" value="001"/>
    <property name="dept.name" value="研发部"/>
bean>

<bean id="dept01" class="cn.cjxy.ioc_bean.domain.Dept">
    <property name="id" value="002"/>
    <property name="name" value="销售部"/>
bean>
<bean id="emp02" class="cn.cjxy.ioc_bean.domain.Emp">
    <property name="dept" ref="dept01"/>
bean>


2.5 特殊值处理

null 值处理

<bean id="emp03" class="cn.cjxy.ioc_bean.domain.Emp">
    <property name="dept">
        <null/> 
    property>
bean>


2.6 复杂类型注入

集合类型处理

<bean id="dept04" class="cn.cjxy.ioc_bean.domain.Dept">
    <property name="empList">
        <list>
            <ref bean="emp01"/>
            <ref bean="emp02"/>
        list>
    property>
bean>
<bean id="book11" class="cn.cjxy.ioc_bean.domain.Book">
    <property name="maps">
        <map>
            <entry key="id" value="005"/>
            <entry key="name" value="《小时代》"/>
        map>
    property>
bean>


三、Bean 生命周期管理

3.1 生命周期阶段

public class Person {
    // 初始化方法
    public void init() {
        System.out.println("Bean初始化完成");
    }
    
    // 销毁方法
    public void destroy() {
        System.out.println("Bean即将销毁");
    }
}
<bean id="person01" class="cn.cjxy.ioc_bean.domain.Person"
      init-method="init" destroy-method="destroy"/>

执行流程

  1. 对象实例化
  2. 属性注入
  3. 调用 init-method
  4. Bean 就绪可用
  5. 容器关闭时调用 destroy-method

四、作用域与懒加载

4.1 作用域配置

<bean id="person02" class="cn.cjxy.ioc_bean.domain.Person"
      scope="prototype" 
      lazy-init="true"/>
属性 可选值 说明
scope singleton/prototype 单例(默认) vs 多例
lazy-init true/false 是否延迟初始化(默认false)

五、架构优化建议

  1. 工厂模式选择
    • 简单对象:优先使用普通创建方式
    • 复杂初始化:使用 FactoryBean
    • 静态工具类:采用静态工厂
  2. 依赖注入原则
    • 强制依赖使用构造器注入
    • 可选依赖使用 setter 注入
    • 避免混合使用多种注入方式
  3. 配置优化策略

<context:property-placeholder location="classpath:config.properties"/>

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
    <property name="jdbcUrl" value="${db.url}"/>
    <property name="username" value="${db.user}"/>
bean>

  1. 组件扫描优化

<context:component-scan base-package="cn.cjxy.ioc_bean"/>

六、测试示例

public class SpringTest {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = 
            new ClassPathXmlApplicationContext("applicationContext.xml");
        
        // 获取单例Bean
        Book book1 = context.getBean("book01", Book.class);
        
        // 获取原型Bean
        Person person = context.getBean("person02", Person.class);
        
        context.close(); // 触发destroy方法
    }
}

输出示例

创建了......  // 构造器输出
初始化了...... // init-method
销毁了......  // destroy-method

通过以上优化架构,可以实现:

  1. 清晰的 Bean 管理策略
  2. 灵活的依赖注入方式
  3. 可维护的配置结构
  4. 精确的生命周期控制

实际开发中建议结合注解方式(@Component, @Autowired)进行混合配置,提升开发效率。

你可能感兴趣的:(Java基础,spring,架构,java)