Spring Bean的基础配置与实例化详解

Spring Bean的基础配置与实例化详解

文章目录

    • [Spring Bean的基础配置与实例化详解](#Spring Bean的基础配置与实例化详解)
      • 一、Bean的基础配置
        • [1. Bean基础配置](#1. Bean基础配置)
        • [2. Bean别名配置](#2. Bean别名配置)
        • [3. Bean作用范围配置](#3. Bean作用范围配置)
      • 二、Bean的实例化
        • [1. 构造方法实例化Bean](#1. 构造方法实例化Bean)
        • [2. 静态工厂实例化Bean](#2. 静态工厂实例化Bean)
        • [3. 实例工厂实例化Bean](#3. 实例工厂实例化Bean)
      • 三、Bean的生命周期
        • [1. Bean生命周期控制](#1. Bean生命周期控制)
        • [2. Bean销毁时机](#2. Bean销毁时机)
      • 四、依赖注入(DI配置)
        • [1. 依赖注入方式](#1. 依赖注入方式)
          • [1.1 Setter方式注入](#1.1 Setter方式注入)
          • [1.2 构造器方式注入](#1.2 构造器方式注入)
        • [2. 依赖自动装配](#2. 依赖自动装配)

一、Bean的基础配置

1. Bean基础配置

在Spring中,Bean的基础配置是通过XML文件或Java注解来完成的。以下是通过XML文件配置Bean的示例:

xml 复制代码
<beans>
    <bean id="myBean" class="com.example.MyClass">
        <property name="propertyName" value="propertyValue"/>
    </bean>
</beans>

在Java注解方式中,可以使用@Component@Service@Repository@Controller注解来定义Bean:

java 复制代码
@Component
public class MyClass {
    @Value("propertyValue")
    private String propertyName;
}
2. Bean别名配置

为了方便管理和引用Bean,Spring允许为Bean配置别名。配置别名可以通过alias标签来实现:

xml 复制代码
<bean id="myBean" class="com.example.MyClass"/>
<alias name="myBean" alias="myBeanAlias"/>

在代码中,可以通过别名获取Bean实例:

java 复制代码
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
MyClass myBean = (MyClass) ctx.getBean("myBeanAlias");
3. Bean作用范围配置

Spring提供了多种Bean作用范围(Scope)配置,决定了Bean的生命周期和可见性。常见的作用范围包括:

  • singleton(默认):整个Spring IoC容器中只有一个Bean实例。
  • prototype:每次请求都会创建一个新的Bean实例。
  • request:每个HTTP请求都会创建一个新的Bean实例,仅适用于Web应用。
  • session:每个HTTP会话都会创建一个新的Bean实例,仅适用于Web应用。
  • globalSession:全局HTTP会话,通常仅在Portlet应用中使用。
  • application:在ServletContext范围内创建一个单例Bean。
  • websocket:在WebSocket范围内创建一个单例Bean。

以下是一些示例配置:

xml 复制代码
<!-- 单例Bean -->
<bean id="singletonBean" class="com.example.SingletonBean" scope="singleton"/>

<!-- 多例Bean -->
<bean id="prototypeBean" class="com.example.PrototypeBean" scope="prototype"/>

<!-- Request作用域 -->
<bean id="requestBean" class="com.example.RequestBean" scope="request"/>

<!-- Session作用域 -->
<bean id="sessionBean" class="com.example.SessionBean" scope="session"/>

二、Bean的实例化

Spring提供了多种实例化Bean的方式,包括构造方法、静态工厂方法和实例工厂方法。

1. 构造方法实例化Bean

通过构造方法实例化Bean是最常见的方式。以下是通过构造方法实例化Bean的示例:

java 复制代码
public class BookDaoImpl implements BookDao {
    public BookDaoImpl() {
        System.out.println("book dao constructor is running ....");
    }
    public void save() {
        System.out.println("book dao save ...");
    }
}

在XML配置文件中:

xml 复制代码
<bean id="bookDao" class="com.example.dao.impl.BookDaoImpl"/>
2. 静态工厂实例化Bean

通过静态工厂方法实例化Bean也是一种常见的方式。以下是通过静态工厂方法实例化Bean的示例:

java 复制代码
public class OrderDaoFactory {
    public static OrderDao getOrderDao() {
        System.out.println("factory setup....");
        return new OrderDaoImpl();
    }
}

在XML配置文件中:

xml 复制代码
<bean id="orderDao" class="com.example.factory.OrderDaoFactory" factory-method="getOrderDao"/>
3. 实例工厂实例化Bean

通过实例工厂方法实例化Bean也是一种常见的方式。以下是通过实例工厂方法实例化Bean的示例:

java 复制代码
public class UserDaoFactory {
    public UserDao getUserDao() {
        return new UserDaoImpl();
    }
}

在XML配置文件中:

xml 复制代码
<bean id="userFactory" class="com.example.factory.UserDaoFactory"/>
<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>

三、Bean的生命周期

1. Bean生命周期控制

在Spring中,可以通过配置初始化方法和销毁方法来控制Bean的生命周期。以下是一个示例:

java 复制代码
public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
    // 表示bean初始化对应的操作
    public void init() {
        System.out.println("init...");
    }
    // 表示bean销毁前对应的操作
    public void destroy() {
        System.out.println("destroy...");
    }
}

在XML配置文件中:

xml 复制代码
<bean id="bookDao" class="com.example.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>
2. Bean销毁时机

Bean的销毁通常在Spring容器关闭时发生,可以通过手动关闭容器或注册关闭钩子来触发销毁方法:

java 复制代码
public class AppForLifeCycle {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        bookDao.save();
        // 注册关闭钩子函数,在虚拟机退出之前回调此函数,关闭容器
        ctx.registerShutdownHook();
        // 手动关闭容器
        // ctx.close();
    }
}

四、依赖注入(DI配置)

1. 依赖注入方式

Spring支持两种主要的依赖注入方式:Setter注入和构造器注入。

1.1 Setter方式注入

Setter方式注入可以用于注入简单类型和引用类型:

java 复制代码
public class BookDaoImpl implements BookDao {
    private int connectionNumber;

    public void setConnectionNumber(int connectionNumber) {
        this.connectionNumber = connectionNumber;
    }

    // 其他方法...
}

在XML配置文件中:

xml 复制代码
<bean id="bookDao" class="com.example.dao.impl.BookDaoImpl">
    <property name="connectionNumber" value="10"/>
</bean>
1.2 构造器方式注入

构造器方式注入也可以用于注入简单类型和引用类型:

java 复制代码
public class BookDaoImpl implements BookDao {
    private int connectionNumber;

    public BookDaoImpl(int connectionNumber) {
        this.connectionNumber = connectionNumber;
    }

    // 其他方法...
}

在XML配置文件中:

xml 复制代码
<bean id="bookDao" class="com.example.dao.impl.BookDaoImpl">
    <constructor-arg name="connectionNumber" value="10"/>
</bean>
2. 依赖自动装配

Spring支持自动装配Bean的依赖,可以通过autowire属性配置自动装配类型:

  • byName:根据属性名自动装配。
  • byType:根据属性类型自动装配。
  • constructor:通过构造器自动装配。
  • autodetect :Spring会尝试使用constructorbyType进行自动装配。

以下是一个按类型自动装配的示例:

xml 复制代码
<bean id="bookDao" class="com.example.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.example.service.impl.BookServiceImpl" autowire="byType"/>
相关推荐
uzong5 小时前
面试官:Redis中的 16 库同时发送命令,服务端是串行执行还是并行执行
后端·面试·架构
呼啦啦啦啦啦啦啦啦5 小时前
常见的排序算法
java·算法·排序算法
anlogic5 小时前
Java基础 8.18
java·开发语言
追逐时光者6 小时前
.NET 使用 MethodTimer 进行运行耗时统计提升代码的整洁性与可维护性!
后端·.net
练习时长一年6 小时前
AopAutoConfiguration源码阅读
java·spring boot·intellij-idea
你的人类朋友7 小时前
【Node.js】什么是Node.js
javascript·后端·node.js
源码宝7 小时前
【智慧工地源码】智慧工地云平台系统,涵盖安全、质量、环境、人员和设备五大管理模块,实现实时监控、智能预警和数据分析。
java·大数据·spring cloud·数据分析·源码·智慧工地·云平台
David爱编程8 小时前
面试必问!线程生命周期与状态转换详解
java·后端
J_bean8 小时前
Spring AI Alibaba 项目接入兼容 OpenAI API 的大模型
人工智能·spring·大模型·openai·spring ai·ai alibaba
LKAI.9 小时前
传统方式部署(RuoYi-Cloud)微服务
java·linux·前端·后端·微服务·node.js·ruoyi