Spring Framework系统架构

Data Access:数据访问

Data Integration:数据集成

AOP:面向切面编程

Aspects:AOP思想实现

Core Container:核心容器

Test:单元测试与集成测试

核心概念:

IOC(Inversion of Control)控制反转

作用:

        对象的创建控制权由程序员转移到外部。

Spring技术对IOC思想进行了实现:

        1.Spring提供IOC容器,用来充当IOC思想的外部

        2.IOC容器负责对象的创建,初始化等一系列工作。被管理或创建的对象在IOC容器中被统称为Bean。

DI(Dependency Injection)依赖注入

作用:       

        容器中建立bean与bean之间的依赖关系的整个过程。

目标:充分解耦       

        1.使用IOC容器管理bean(IoC)

        2.在IoC容器内将有依赖关系的bean进行关系绑定(DI)

最终效果:

        使用对象时不仅可以直接从IoC容器中获取,并且获取到的bean已经绑定了所有的依赖关系。

DI步骤:

        1)删除使用new创建对象代码

        2)提供依赖对象对应的setter方法

        3)配置service与dao之间的关系

                property标签表示配置当前bean的属性

                name属性表示配置哪一个具体的属性

                ref属性表示参照哪个bean

Bean:

概念:

       由Spring容器管理的对象实例,是应用程序的构建块。Bean的创建、依赖注入和生命周期均由Spring IoC(控制反转)容器控制。

别名配置:

        name,可定义多个,使用“,;空格”分隔

作用范围配置:

        singleton:单例(默认);prototype:非单例

        适合交给容器管理的bean:表现层对象,业务层对象,数据层对象,工具对象

        不适合交给容器管理的bean:封装实体的域对象。

实例化bean的三种方式:

1.构造方法(常用)

        使用默认的构造方法创建Bean实例,适用于无参构造或依赖注入场景。(无参构造方法不存在会抛出异常)在Spring配置文件中直接定义Bean:        

<bean id="exampleBean" class="com.example.ExampleBean"/>
 

        对应Java类需有无参构造方法: 

public class ExampleBean {
    public ExampleBean() {}
}
 
2.静态方法(了解)

        通过类的静态方法返回Bean实例,适用于复杂初始化逻辑。配置时指定工厂类和方法名

<bean id="staticFactoryBean" 
      class="com.example.StaticFactory"
      factory-method="createInstance"/>

        静态工厂类实现示例:

public class StaticFactory {
    public static ExampleBean createInstance() {
        return new ExampleBean();
    }
}
 

3.实例工厂(了解)

        先实例化工厂对象,再调用其非静态方法生成Bean。需先配置工厂Bean,再引用其方法:

<bean id="instanceFactory" class="com.example.InstanceFactory"/>
<bean id="instanceBean" 
      factory-bean="instanceFactory"
      factory-method="getBean"/>
 

        实例工厂类实现示例:

public class InstanceFactory {
    public ExampleBean getBean() {
        return new ExampleBean();
    }
}
4.FactoryBean 

        FactoryBean 是 Spring 框架中的一个特殊接口,用于创建复杂的 Bean 实例。当需要定制化 Bean 的创建逻辑时,可以实现 FactoryBean 接口,而不是直接通过传统的 Bean 定义方式。

三个核心方法:
public interface FactoryBean<T> {
    T getObject() throws Exception;
    Class<?> getObjectType();
    boolean isSingleton();
}
  • getObject():返回由 FactoryBean 创建的 Bean 实例。
  • getObjectType():返回创建的对象类型。
  • isSingleton():指示创建的 Bean 是否为单例。
实现 FactoryBean 的示例

以下是一个简单的 FactoryBean 实现,用于创建自定义的 Bean 实例:

public class CustomFactoryBean implements FactoryBean<CustomObject> {
    @Override
    public CustomObject getObject() throws Exception {
        return new CustomObject();
    }

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

    @Override
    public boolean isSingleton() {
        return true;
    }
}
配置 FactoryBean 的 Bean 定义

在 Spring 配置文件中,FactoryBean 的 Bean 定义与普通 Bean 类似。例如,在 XML 配置中:

<bean id="customBean" class="com.example.CustomFactoryBean" />

此时,Spring 容器会通过 CustomFactoryBeangetObject() 方法创建实际的 Bean 实例。

获取 FactoryBean 创建的 Bean

从 Spring 容器中获取 FactoryBean 创建的 Bean 时,直接使用 Bean 的 ID 即可:

ApplicationContext context = ...;
CustomObject customObject = context.getBean("customBean", CustomObject.class);
获取 FactoryBean 本身

如果需要获取 FactoryBean 实例本身(而非它创建的 Bean),可以在 Bean ID 前添加 & 符号:

FactoryBean<?> factoryBean = context.getBean("&customBean", FactoryBean.class);
FactoryBean 的使用场景
  • 创建复杂的 Bean 实例,如数据库连接池、线程池等。
  • 需要动态生成 Bean 实例的逻辑。
  • 封装第三方库的初始化过程。

通过 FactoryBean,可以灵活控制 Bean 的创建过程,实现更高级的依赖注入功能。

bean的生命周期 :

        bean从创建到销毁的整体过程。

        1)实例化        2)属性赋值        3)初始化        4)使用        5)销毁

bean生命周期控制:

        在bean创建后到销毁前做的一些事情

<!-- XML配置示例 -->
<bean id="exampleBean" 
      class="com.example.ExampleBean" 
      init-method="customInit" 
      destroy-method="customDestroy"/>

        在service层实现方法init(),destory()

        在main方法中调用close()方法/registerShutdownHook()

        接口控制:实现InitializingBean,DisposableBean

初始化容器:

        1.创建对象(内存分配)

        2.执行构造方法

        3.执行属性注入(set操作)

        4.执行bean初始化方法

使用bean:

        执行业务操作

关闭/销毁容器:

        执行bean销毁方法

bean销毁时机:

        容器关闭前触发bean的销毁

        1)手工关闭容器:对于单例(singleton)作用域的bean,当Spring容器关闭时(如调用ConfigurableApplicationContext.close(),容器会触发所有单例bean的销毁方法。可以通过@PreDestroy注解或实现DisposableBean接口定义销毁逻辑。

@Component
public class ExampleBean {
    @PreDestroy
    public void cleanup() {
        System.out.println("Bean销毁前的清理工作");
    }
}

        2)注册关闭钩子,在虚拟机退出前先关闭容器再退出虚拟机

        ConfigurableApplicationContext接口的registerShutdownHook()操作。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐