Spring Bean基础

Spring Bean创建方式

1. 基于 XML 配置声明的 Bean(传统方式)

这是 Spring 早期版本的配置方式,虽然现在较少用,但在遗留项目中很常见。

  • 声明方式 :在 applicationContext.xml 文件中使用 <bean> 标签。

  • 特点:

    • 定义明确:所有配置集中在一个文件中,结构清晰。

    • 代码侵入性低:业务类本身无需任何 Spring 注解,是纯粹的 POJO。

    • 繁琐:项目庞大时,XML 文件会变得非常臃肿,难以维护。

  • 示例:

XML 复制代码
<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 -->
    <bean id="userService" class="com.example.service.UserServiceImpl">
        <!-- 属性注入 -->
        <property name="userDao" ref="userDao"/>
    </bean>

    <bean id="userDao" class="com.example.dao.UserDaoImpl"/>
</beans>

2. 基于注解声明的 Bean(现代主流方式)

这是目前最主流的 Bean 定义方式,利用注解来简化配置。

核心注解

  • @Component:通用注解,标识一个类为 Spring 组件(Bean)。

  • @Repository :用于 数据访问层(DAO) 的组件,是 @Component 的特殊化。除了组件扫描,它还负责将数据访问异常转换为 Spring 的统一 DataAccessException。

  • @Service :用于 业务逻辑层(Service) 的组件,是 @Component 的特殊化。主要在语义上区分业务层。

  • @Controller / @RestController :用于 Web 控制层 的组件,是 @Component 的特殊化。@RestController 是 @Controller 和 @ResponseBody 的组合,专用于 REST API。

3. Java 配置类与 @Bean

这是一种更灵活、更强大的编程式配置方式 ,常用于配置第三方库的组件 或 需要复杂初始化逻辑的 Bean。

  • @Configuration:标记一个类为配置类,相当于一个 XML 配置文件。

  • @Bean:在配置类的方法上使用,方法的返回值将被注册为 Spring 容器中的一个 Bean。方法名默认作为 Bean 的名称。

java 复制代码
@Configuration
public class AppConfig {

    @Bean // 方法返回的对象将成为一个名为"dataSource"的Bean
    public DataSource dataSource() {
        DriverManagerDataSource ds = new DriverManagerDataSource();
        ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/mydb");
        ds.setUsername("root");
        ds.setPassword("password");
        return ds;
    }

    @Bean
    public UserService userService() {
        // 可以在此方法中调用其他@Bean方法,进行依赖注入
        return new UserServiceImpl(userDao());
    }

    @Bean
    public UserDao userDao() {
        return new UserDaoImpl(dataSource()); // 注入dataSource
    }
}
类型 优势 劣势 适用场景
XML 配置 配置集中,与代码完全解耦,无需修改源码。 配置繁琐,类型不安全(编译时无法检查),重构困难。 老项目维护,或需要在不修改代码的情况下动态切换实现类。
注解扫描 配置简单,代码直观,类型安全,与业务逻辑紧密结合。 代码有一定侵入性,配置分散在各个类中。 现代 Spring Boot 项目的首选,适用于自己编写的业务组件。
@Bean 方法 灵活性极高,可以编程式控制 Bean 的创建过程,适合集成外部库。 配置相对复杂,需要编写额外的 Java 类。 配置数据源、线程池、第三方框架的客户端 等无法直接加 @Component 注解的组件。

Spring Bean作用域

  • singleton(默认):容器中只存在一个实例。

  • prototype:每次请求(获取)都创建一个新实例。

  • request:每次 HTTP 请求创建一个实例(仅 Web 环境)。

  • session:每个 HTTP Session 创建一个实例(仅 Web 环境)。

  • application:每个 ServletContext 生命周期内一个实例(仅 Web 环境)。

  • websocket:每个 WebSocket 会话一个实例。

Spring Bean初始化方式

  • 预初始化(Eager) :容器启动时就创建(singleton Bean 默认)。

  • 懒初始化(Lazy) :第一次被请求时才创建(使用 @Lazy 注解)。

相关推荐
wuminyu5 小时前
JVM规范学习总结:解释器与JIT编译器如何处理JVM字节码
java·linux·c语言·jvm·c++
txxzjmzlh6 小时前
SpringBoot 配置⽂件
java·spring boot·spring
ZhengEnCi6 小时前
模型训练完整流程:从数据准备到模型上线的 10 个关键步骤(全文可跑)
后端·算法
王中阳Go6 小时前
后端转 Agent 岗面试怎么答:8 个高频问题与应答口径
人工智能·后端·python·大语言模型
Wang's Blog6 小时前
Java 项目实战: 交友项目 - 搜索附近的功能概述和分析
java·开发语言·交友
程序猿DD6 小时前
OctaFuse Gateway 2.18.0:MCP 接入支持 OAuth,供应商粘性绑定可视化管理
后端
骑着蜗牛撵大象3276 小时前
大模型 Agent 的沙箱护栏:gVisor 隔离、出口白名单与审计闭环
java·开发语言·jvm·安全·agent沙箱·gvisor·microvm
独泪了无痕6 小时前
Hutool之LocalDateTimeUtil:让时间间隔操作如虎添翼
java
三无少女指南8 小时前
从这里开始:Java 后端与 AI 工程的三条阅读路线
java·学习路线·ai工程
ZhengEnCi8 小时前
Agent 规则管理:让 Memory 做索引、让 Skill 存规则——上下文上限实测与分工方案
后端