Spring Boot Bean的多种加载方式
在 Spring Boot 中,您可以以多种方式加载 Bean,这取决于项目的需求和设计。以下是一些常见的加载 Bean 的方式以及相应的示例源代码。
1.组件扫描(Component Scanning)
组件扫描是 Spring Boot 中默认的 Bean 加载方式,它会自动扫描指定包及其子包,寻找带有 @Component 及其衍生注解(如 @Service、@Repository、@Controller)的类,并将其注册为 Spring Bean。
// 示例1: 使用@Component注解声明一个Bean
@Component
public class MyComponent {
// Bean 的业务逻辑
}
// 示例2: 使用@Service注解声明一个服务Bean
@Service
public class MyService {
// 服务Bean的业务逻辑
}
2.XML 配置
虽然 Spring Boot 倾向于使用注解驱动的配置,但仍支持传统的 XML 配置方式。您可以通过 XML 文件定义 Bean,然后在 Spring Boot 主类中引入这些 XML 配置。
<!-- beans.xml -->
<beans>
<bean id="myBean" class="com.example.MyBean">
<!-- Bean 属性配置 -->
</bean>
</beans>
@SpringBootApplication
@ImportResource("classpath:beans.xml")
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
3.Java 配置类
Spring Boot 支持使用 Java 配置类定义 Bean。您可以创建一个带有 @Configuration 注解的类,在其中使用 @Bean 注解定义 Bean。
@Configuration
public class MyConfiguration {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
4.条件化加载
有时,您可能只希望在特定条件下加载某些 Bean。Spring Boot 提供了条件化加载的方式,您可以使用 @Conditional 注解或实现 Condition 接口来定义加载条件。
@Configuration
public class MyConfiguration {
@Bean
@Conditional(MyCondition.class)
public MyConditionalBean myConditionalBean() {
return new MyConditionalBean();
}
}
public class MyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// 在这里定义条件
return true; // 或者根据条件返回true或false
}
}
5.外部配置
Spring Boot 允许您在 application.properties 或 application.yml 中配置 Bean 的属性,然后使用 @Value 注解注入这些属性值。
# application.properties
myBean.name=John
myBean.age=30
@Component
public class MyBean {
@Value("${myBean.name}")
private String name;
@Value("${myBean.age}")
private int age;
// Getter 和 Setter 方法
}
6.自动配置
Spring Boot 自动配置是其独特的功能之一。它根据项目的依赖和配置,自动配置和加载适当的 Bean。例如,当您引入 Spring Data JPA 依赖时,Spring Boot 会自动配置 JPA 相关的 Bean,您无需手动创建它们。
7.使用第三方库自动配置
Spring Boot 也支持使用第三方库的自动配置。例如,如果您在项目中引入了 Spring Security,Spring Boot 会自动配置安全相关的 Bean。
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
上述方式是 Spring Boot 中加载 Bean 的一些常见方式,您可以根据项目的需要选择合适的方式。通常,建议使用组件扫描和 Java 配置类来加载 Bean,因为它们更符合 Spring Boot 的设计理念,同时也提供了很大的灵活性和便捷性。不同的项目可能会采用不同的加载方式,这取决于项目的规模、复杂性和团队的偏好。最重要的是确保 Bean 的加载方式符合项目的需求和设计目标。
更多技术文章,技术资源请关注公众号:架构师宝库
更多免费高清电子书PDF版本下载 book.sjtt.cc
作者简介:
公众号【架构师宝库】,头条号【架构师老卢】20年资深软件架构师,分享编程、软件设计经验,教授前沿技术,分享技术资源(每天分享一本电子书),分享职场感悟。
Spring Boot Bean的多种加载方式的更多相关文章
- Spring Boot自定义配置与加载
Spring Boot自定义配置与加载 application.properties主要用来配置数据库连接.日志相关配置等.除了这些配置内容之外,还可以自定义一些配置项,如: my.config.ms ...
- 【spring bean】spring中bean的懒加载和depends-on属性设置
项目结构如下: ResourceBean.java代码: package com.it.res; import java.io.File; import java.io.FileNotFoundExc ...
- Spring Boot 2程序不能加载 com.mysql.jdbc.Driver 问题
用Spring Boot Starter 向导生成了一个很简单SpringBoot程序, 用到了 MySQL, 总是下面不能加载 Mysql driver class 错误. Cannot load ...
- spring boot的静态资源加载
1.spring boot默认资源处理 Spring Boot 默认为我们提供了静态资源处理,使用 WebMvcAutoConfiguration 中的配置各种属性. spring boot默认加载文 ...
- Spring Boot 静态资源能加载css 不能加载js
Spring Boot 配置拦截器的时候默认 是放行 静态资源 , 也就是说不需要进行配置 registry.addResourceHandler("/**") .addResou ...
- Spring XML Bean 定义的加载和注册
前言 本篇文章主要介绍 Spring IoC 容器怎么加载 bean 的定义元信息. 下图是一个大致的流程图: 第一次画图,画的有点烂.
- spring boot注解 --@spring-boot-devtools 自动加载修改的文件和类
spriing boot中有一个注解,是自动加载修改后的类或者文件. 使用方法为: spring-boot-devtools=true 需要引入devtools包依赖: <dependency& ...
- spring中Bean的懒加载
在ApplicationContext容器中,当容器一启动时,所有的bean(单例的)都会被创建和注入依赖,这也被视为IOC容器启动过程中的一个步骤. 那如何让一个bean在需要的时候再被创建,而不是 ...
- Spring Boot 2 启动时加载properties文件
每个项目从开发到测试再到上线所需要的各种环境是不同的,这就需要维护相应的配置文件,比如properties或yml文件.有了配置文件后就要考虑如何与应用进行集成. 对于云环境来讲,项目发布需要打成镜像 ...
- spring boot开发 静态资源加载不出来
spring boot 1.5 版本之前 不拦截静态资源 springboot 2.x版本 拦截静态资源 private static final String[] CLASSPATH_RESOURC ...
随机推荐
- 如何正确使用:has和:nth-last-child
我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字.例如,一个拥有三个或更多子项的grid.你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会根据子元素的数量而改变. ...
- 避坑 | OI排雷新生态
可持久化线段树 query 的时候两结点的 sz 相减的时候一定是左儿子相减. 可持久化线段树建新点要将原来的不更改的节点连接上. 动态规划也可以倒着考虑. P3957的单调队列是先加入后删除,否则加 ...
- 预处理器 Less 的十个语法
Less 是一门 CSS 预处理语言,它扩充了 CSS 语言,增加了诸如变量.混合(mixin).函数等功能,让 CSS 更易维护.方便制作主题.扩充. 不过浏览器只能识别 CSS 语言,所以 Les ...
- 交换分区swap的创建与管理
前言 swap分区是linux系统中一块特殊的硬盘空间,当实际内存不够用的时候,系统会按照一定的算法将部分不用的数据放在swap分区中,从而为当前运行的程序腾出足够的内存空间.好处在于避免内存资源不足 ...
- c++算法之离散化例题
离散化基础2 题目描述 给定 n 个元素的数列,将相同的数据离散化为一个数据(去重),即把 {4000,201,11,45,11}{4000,201,11,45,11} 离散化为 {4,3,1,2,1 ...
- cs50ai0----search
cs50ai0-------Search cs50ai0-------Search 基础知识 课后题目 代码实践 学习链接 总结 基础知识 (1) search problem 上图是搜索问题的一般形 ...
- Codeforces Round 882 div.2 B
Smiling & Weeping ----玫瑰花你拿才好看,风景要和你看才浪漫--<-<-<@ B. Hamon Odyssey time limit per test 1 ...
- 探索计算机的I/O控制方式:了解DMA控制器的作用与优势
I/O控制方式 在前面我们已经了解到,每个设备都配备了一个设备控制器.当CPU向设备控制器发送命令并将其存储在寄存器中时,设备控制器会执行相应的操作.然而,尽管设备控制器会更新状态寄存器的状态,但是如 ...
- 【Azure Batch】在批处理的Task中如何让它执行多个CMD指令呢
问题描述 根据Azure Batch的入门文档(使用 Azure 门户创建 Batch 帐户并运行作业 : https://docs.azure.cn/zh-cn/batch/quick-create ...
- Lua5.3 笔记
Lua5.3 笔记 最近用skynet,sproto通讯,完全看不懂通讯二进制是怎么写的,发现都是string这个,string那个,完全理解不来. 于是查了一下string.pack的api,和之前 ...