Spring Beans的魔法门:解密多种配置方式【beans 四】

欢迎来到我的博客,代码的世界里,每一行都是一个故事


在这里插入图片描述

Spring Beans的魔法门:解密多种配置方式【beans 四】

    • 前言
    • XML配置方式
      • 1. 声明和配置Bean:
      • 2. 构造函数注入:
      • 3. 导入其他配置文件:
    • java注解方式
      • 1. 使用`@Component`声明Bean:
      • 2. 使用更具体的注解(`@Service`、`@Repository`):
      • 3. 使用`@Autowired`进行依赖注入:
    • JavaConfig配置方式
      • 1. 使用`@Configuration`注解声明配置类:
      • 2. 使用`@Bean`注解定义Bean:
      • 3. Bean之间的依赖:
      • 4. 使用`@Autowired`注解进行依赖注入:
    • 条件化的配置
      • 示例:
      • 条件类的实现:
    • properties文件配置
      • 1. 创建属性文件:
      • 2. 使用`@PropertySource`注解加载属性文件:
      • 3. 使用属性值:
      • 注意事项:
    • 使用Spring boot简化配置
      • 1. 自动化配置(Auto-Configuration):
      • 2. 默认属性值:
      • 3. 自动扫描和组件注解:
      • 4. 嵌入式Web服务器:
      • 5. 依赖管理和Starter:
      • 6. 自定义属性:
      • 总结:
    • 动态bean的配置
      • 1. 创建配置类:
      • 2. 创建另一个配置类:
      • 3. 主配置类中使用`@Import`导入其他配置类:
      • 4. 使用导入的配置类中的Bean:

前言

在Spring的世界中,Beans是构建应用程序的基础。而Beans的配置方式则是我们进入这个魔法门的通行证。传统的XML配置、简洁的Java注解、灵活的JavaConfig方式,每一种都有其独特的魅力。在这篇文章中,我们将带你探寻Spring Beans的配置之旅,从而让你更加游刃有余地使用这个强大的框架。

XML配置方式

在Spring中,XML配置方式是通过XML文件来声明和配置Bean的,包括属性注入和构造函数注入。以下是一个简单的示例,演示如何通过XML配置文件进行Bean的声明和配置。

1. 声明和配置Bean:

<!-- applicationContext.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"><!-- 声明一个名为 "myBean" 的 Bean,类为 com.example.MyBean --><bean id="myBean" class="com.example.MyBean"><!-- 配置该 Bean 的属性 --><property name="name" value="John Doe"/></bean></beans>

在上述配置中:

  • <bean> 元素用于声明一个Bean。
  • id 属性指定了Bean的唯一标识符,即Bean的名字。
  • class 属性指定了Bean的类。
  • <property> 元素用于配置Bean的属性。

2. 构造函数注入:

<!-- applicationContext.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 id="anotherBean" class="com.example.AnotherBean"><!-- 构造函数参数注入 --><constructor-arg value="42"/></bean></beans>

在上述配置中:

  • <constructor-arg> 元素用于配置构造函数的参数。

3. 导入其他配置文件:

<!-- applicationContext.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"><!-- 导入其他配置文件 --><import resource="classpath:other-beans.xml"/></beans>

在上述配置中,通过 <import> 元素可以导入其他的XML配置文件,这样可以将配置文件拆分为多个模块,提高可维护性。

以上是一个简单的XML配置示例,实际项目中,配置会更为复杂,可能涉及到更多的特性和配置选项。

java注解方式

在Spring中,通过Java注解进行配置的方式更加简洁和灵活。以下是使用一些常见注解(@Component@Service@Repository)进行Bean声明,以及使用@Autowired注解进行依赖注入的示例。

1. 使用@Component声明Bean:

import org.springframework.stereotype.Component;@Component
public class MyComponent {// Bean的实现代码
}

在上述例子中,@Component注解用于声明一个Bean,Spring会自动扫描并注册这个Bean。

2. 使用更具体的注解(@Service@Repository):

import org.springframework.stereotype.Service;@Service
public class MyService {// Bean的实现代码
}
import org.springframework.stereotype.Repository;@Repository
public class MyRepository {// Bean的实现代码
}

在Spring中,@Service@Repository注解分别用于表示服务层和数据访问层的Bean。它们都是@Component的特殊化,用于更精确地指定Bean的角色。

3. 使用@Autowired进行依赖注入:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class MyService {private final MyRepository myRepository;@Autowiredpublic MyService(MyRepository myRepository) {this.myRepository = myRepository;}// 使用 myRepository 进行业务逻辑
}

在上述例子中,@Autowired注解用于在MyService中注入一个MyRepository的实例。Spring容器会自动解析MyRepository的实例,并将其注入到MyService中。

这种基于注解的配置方式可以使代码更加清晰、简洁,而不需要显式地在XML配置文件中声明Bean和依赖关系。这样的注解配置方式也更符合现代Java开发的趋势。

JavaConfig配置方式

在Spring中,JavaConfig是一种基于Java的配置方式,它使用Java类来声明和配置Bean。以下是使用@Configuration注解和@Bean注解进行JavaConfig配置的示例。

1. 使用@Configuration注解声明配置类:

import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {// 这个类用于声明Bean和配置应用程序的其他组件
}

在上述例子中,@Configuration注解用于标识一个配置类。

2. 使用@Bean注解定义Bean:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic MyBean myBean() {return new MyBean();}
}

在上述例子中,@Bean注解用于声明一个Bean。Spring容器会在初始化时调用myBean方法,并将其返回的实例注册为一个Bean。

3. Bean之间的依赖:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic MyBean myBean() {return new MyBean();}@Beanpublic AnotherBean anotherBean(MyBean myBean) {return new AnotherBean(myBean);}
}

在上述例子中,anotherBean方法中的参数myBean表示依赖关系。Spring容器会自动解析myBean方法,并将其实例注入到anotherBean中。

4. 使用@Autowired注解进行依赖注入:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic MyBean myBean() {return new MyBean();}@Beanpublic AnotherBean anotherBean() {return new AnotherBean();}@Beanpublic MyService myService(@Autowired MyBean myBean, @Autowired AnotherBean anotherBean) {return new MyService(myBean, anotherBean);}
}

在上述例子中,myService方法中使用了@Autowired注解,表示对MyBeanAnotherBean的依赖。Spring容器会自动解析这些依赖并将相应的实例注入到myService中。

JavaConfig方式使得配置更加类型安全,并且可以通过Java的编程语言特性来实现更复杂的配置逻辑。

条件化的配置

在Spring中,你可以使用@Conditional注解根据条件来选择性地配置Bean。这样的条件化配置允许你在不同的情况下选择性地加载或不加载特定的Bean。以下是一个简单的示例,演示如何使用@Conditional注解进行条件化配置。

示例:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Bean@Conditional(WindowsCondition.class)public MyBean windowsBean() {return new MyBean("Windows Bean");}@Bean@Conditional(LinuxCondition.class)public MyBean linuxBean() {return new MyBean("Linux Bean");}
}

在上述例子中,@Conditional注解被应用在@Bean注解上,分别标注在windowsBeanlinuxBean方法上。这两个Bean的加载将取决于相应的条件是否满足。

条件类的实现:

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;public class WindowsCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {// 检查是否为Windows操作系统return context.getEnvironment().getProperty("os.name").toLowerCase().contains("win");}
}
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;public class LinuxCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {// 检查是否为Linux操作系统return context.getEnvironment().getProperty("os.name").toLowerCase().contains("nix") ||context.getEnvironment().getProperty("os.name").toLowerCase().contains("nux") ||context.getEnvironment().getProperty("os.name").toLowerCase().contains("mac");}
}

在上述例子中,WindowsConditionLinuxCondition是两个条件类,分别用于判断是否为Windows和Linux操作系统。这样,根据实际运行环境的不同,Spring容器会选择性地加载符合条件的Bean。

条件化的配置允许你在不同的环境或特定条件下选择性地加载Bean,提供了更灵活的配置选项。

properties文件配置

在Spring中,你可以使用@PropertySource注解加载外部的属性文件,然后通过@Value注解注入这些属性值到你的Bean中。以下是一个简单的示例,演示如何使用@PropertySource@Value注解进行属性文件配置。

1. 创建属性文件:

假设有一个名为 application.properties 的属性文件:

# application.propertiesmy.property=value_from_properties_file

2. 使用@PropertySource注解加载属性文件:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;@Component
@PropertySource("classpath:application.properties")
public class MyComponent {@Value("${my.property}")private String myProperty;public String getMyProperty() {return myProperty;}
}

在上述例子中,@PropertySource注解用于加载application.properties属性文件。@Value("${my.property}")注解用于注入属性文件中my.property的值到myProperty字段中。

3. 使用属性值:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class MyService {private final MyComponent myComponent;@Autowiredpublic MyService(MyComponent myComponent) {this.myComponent = myComponent;}public void printMyProperty() {System.out.println("My Property: " + myComponent.getMyProperty());}
}

在上述例子中,MyService通过依赖注入得到了MyComponent,然后通过调用printMyProperty方法来输出属性文件中的值。

注意事项:

  • @PropertySource中的路径可以是相对于classpath的相对路径,也可以是绝对路径。
  • 在使用@Value注解时,被注入的属性值需要包裹在 ${} 中,表示引用属性文件中的值。
  • @PropertySource注解通常用于@Configuration注解的类上,以确保属性文件的加载在容器初始化阶段完成。

通过这种方式,你可以方便地将配置信息从外部属性文件中加载到Spring容器中,并在应用程序中使用这些属性值。

使用Spring boot简化配置

Spring Boot的设计理念是约定大于配置(Convention over Configuration),它通过提供自动化配置和默认约定来简化应用程序的配置和开发。以下是一些Spring Boot简化配置的特性和实践:

1. 自动化配置(Auto-Configuration):

Spring Boot通过自动配置(auto-configuration)机制尝试根据项目的依赖、类路径和其他条件来配置应用程序。这意味着你无需手动配置许多常见的配置项,Spring Boot会根据环境和依赖为你自动完成。

@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}

上述示例中,@SpringBootApplication注解包含了@EnableAutoConfiguration,它启用了自动配置特性。

2. 默认属性值:

Spring Boot在许多情况下都为你提供了合理的默认值。例如,你无需手动配置数据库连接信息,只需在application.propertiesapplication.yml中提供合适的属性值即可。

# application.propertiesspring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=root

3. 自动扫描和组件注解:

Spring Boot默认会自动扫描应用程序包及其子包,将带有@Component@Service@Repository等注解的类注册为Spring容器中的Bean。

@Service
public class MyService {// Bean的实现代码
}

4. 嵌入式Web服务器:

Spring Boot集成了嵌入式Web服务器(如Tomcat、Jetty),无需手动配置,你的应用程序即可运行在内置的Web服务器上。

5. 依赖管理和Starter:

Spring Boot提供了一系列的“Starter”依赖,这些依赖包含了常见场景下所需的依赖和配置,只需引入相应的Starter,即可快速搭建应用。

<!-- pom.xml --><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>

6. 自定义属性:

通过@Value注解和application.propertiesapplication.yml中的属性,可以方便地将配置值注入到应用程序中。

@Component
public class MyComponent {@Value("${my.property}")private String myProperty;// ...
}

总结:

Spring Boot的自动化配置和约定大于配置的理念使得开发者可以更专注于业务逻辑,而不必过多关注底层配置细节。这使得开发过程更加简单、高效,并降低了出错的可能性。

动态bean的配置

在Spring中,你可以使用@Import注解来导入其他配置类,从而实现动态Bean的配置。这使得你可以在一个配置类中引入其他配置,实现模块化和动态配置的效果。以下是一个简单的示例,演示如何使用@Import注解导入其他配置类。

1. 创建配置类:

// DatabaseConfig.javaimport org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class DatabaseConfig {@Beanpublic DataSource dataSource() {// 配置数据源return new DataSource();}
}

2. 创建另一个配置类:

// ServiceConfig.javaimport org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ServiceConfig {@Beanpublic MyService myService() {// 配置业务服务return new MyService();}
}

3. 主配置类中使用@Import导入其他配置类:

// AppConfig.javaimport org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;@Configuration
@Import({DatabaseConfig.class, ServiceConfig.class})
public class AppConfig {// 这个类可以为空,主要用于导入其他配置类
}

在上述例子中,AppConfig类使用了@Import注解,将DatabaseConfigServiceConfig这两个配置类导入。这样,AppConfig就包含了这两个配置类中定义的Bean。

4. 使用导入的配置类中的Bean:

// MyService.javaimport org.springframework.beans.factory.annotation.Autowired;public class MyService {private final DataSource dataSource;@Autowiredpublic MyService(DataSource dataSource) {this.dataSource = dataSource;}// 使用 dataSource 进行业务逻辑
}

在上述例子中,MyService类通过构造函数注入了DataSource这个Bean,而DataSource是在DatabaseConfig配置类中定义的。

通过使用@Import注解,你可以将不同的配置拆分到不同的配置类中,从而实现动态和模块化的配置。这在大型项目中特别有用,使得配置更加清晰、易于维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/601164.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法训练营Day35

#Java #动态规划 开源学习资料 Feeling and experiences&#xff1a; 不同路径&#xff1a;力扣题目链接 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右…

MyBatisPlus学习三:Service接口、代码生成器

学习教程 黑马程序员最新MybatisPlus全套视频教程&#xff0c;4小时快速精通mybatis-plus框架 Service接口 简介 在MyBatis-Plus框架中&#xff0c;Service接口的作用是为实体类提供一系列的通用CRUD&#xff08;增删改查&#xff09;操作方法。通常情况下&#xff0c;Servi…

PyTorch 入门学习数据操作之创建

简介 在深度学习中&#xff0c;我们通常会频繁地对数据进行操作&#xff1b;要操作一般就需要先创建。 官方介绍 The torch package contains data structures for multi-dimensional tensors and defines mathematical operations over these tensors. Additionally, it pr…

SpringMVC通用后台管理系统源码

整体的SSM后台管理框架功能已经初具雏形&#xff0c;前端界面风格采用了结构简单、 性能优良、页面美观大的Layui页面展示框架 数据库支持了SQLserver,只需修改配置文件即可实现数据库之间的转换。 系统工具中加入了定时任务管理和cron生成器&#xff0c;轻松实现系统调度问…

【源码解析】Apache RocketMQ发送消息源码

send message源码解析 引入 send message方法作为我们经常使用的方法&#xff0c;平时我们很难去关注他底层到底做了什么。大部分人只知道通过send message方法可以将消息发送到broker&#xff0c;然后供消费者进行消费。其实不然&#xff0c;消息从客户端发送到broker&#x…

ssm基于vue.js的购物商场的设计与实现论文

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装购物商场软件来发挥其高效地信息处理的作用&#xff0c;可以…

cissp 第10章 : 物理安全要求

10.1 站点与设施设计的安全原则 物理控制是安全防护的第一条防线&#xff0c;而人员是最后一道防线。 10.1.1 安全设施计划 安全设施计划通过关键路径分析完成。 关键路径分析用于找出关键应用、流程、运营以及所有必要支撑元索间的关系。 技术融合指的是各种技术、解决方案…

性能优化-OpenMP基础教程(三)

本文主要介绍OpenMP并行编程的环境变量和实战、主要对比理解嵌套并行的效果。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础教程 &#x1f380;CSDN主页 发狂的小花 &…

书生·浦语大模型全链路开源体系 学习笔记 第一课

背景 大模型是发展人工通用人工智能的一个重要途径&#xff0c;能够解决多种任务和多种模态&#xff0c;展示了一个更面向更高阶的智能的潜在途径。大模型的发展历程是从专用模型到通用模型的过程&#xff0c;从语音识别、图像识别、人脸识别等专用模型&#xff0c;到通用的大…

Java8内置四大核心函数式接口

先来看几个例子,主要练习策略模式: 用策略模式的做法 定义个接口 其实像这样的接口并不需要我们自己创建 java8推出的Lambda表达式主要就是为了简化开发,而Lambda表达式 的应用主要是针对与函数式接口,自然也推出了对应的一些接口 /*** Java8 内置的四大核心函数式接口** C…

【C++】STL 算法 ③ ( 函数对象中存储状态 | 函数对象作为参数传递时值传递问题 | for_each 算法的 函数对象 参数是值传递 )

文章目录 一、函数对象中存储状态1、函数对象中存储状态简介2、示例分析 二、函数对象作为参数传递时值传递问题1、for_each 算法的 函数对象 参数是值传递2、代码示例 - for_each 函数的 函数对象 参数在外部不保留状态3、代码示例 - for_each 函数的 函数对象 返回值 一、函数…

权威认可!甄知科技猪齿鱼产品荣获信创产品评估证书

近日&#xff0c;依据《信息技术应用创新产品评估规范 第1部分&#xff1a;应用软件》&#xff08;T/SSIA 2001-2022&#xff09;&#xff0c;经过严格评估&#xff0c;甄知科技旗下自主研发的猪齿鱼数智化开发管理平台 V2.0.0&#xff0c;通过信创测试认证&#xff0c;获得上海…

差分约束算法

差分约束 差分约束系统包含 m m m个涉及 n n n个变量的差额限制条件&#xff0c;这些差额限制条件每个都是形式为 x i − x j ≤ b ∈ [ 1 , m ] x_i-x_j\leq b_{\in[1,m]} xi​−xj​≤b∈[1,m]​的简单线性不等式。 通常我们要求解出一组可行解。 最短路差分约束 如果我们…

ubuntu 22 virt-manger(kvm)安装winxp; ubuntu22体验 firebird3.0

安装 、启动 virt-manager sudo apt install virt-manager sudo systemctl start libvirtdsudo virt-manager安装windowsXP 安装过程截图如下 要点1 启用 “包括寿终正寝的操作系统” win_xp.iso 安装过程 &#xff1a; 从winXp.iso启动, 执行完自己重启从硬盘重启&#xff0c…

稿件代写3个不可或缺的步骤让你事半功倍-华媒舍

作为一个需求频繁的作者&#xff0c;你可能会面临大量的稿件代写任务。但是&#xff0c;你是否曾经为提高文章质量而苦恼过&#xff1f;是否希望在有限的时间内完成更多的代写任务&#xff1f;本篇文章将向你介绍三个不可或缺的稿件代写步骤&#xff0c;帮助你事半功倍&#xf…

Redis高级特性和应用(慢查询、Pipeline、事务、Lua)

Redis的慢查询 许多存储系统(例如 MySQL)提供慢查询日志帮助开发和运维人员定位系统存在的慢操作。所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(例如:发生时间,耗时,命令的详细信息)记录下来,Redis也提供了类似…

Huggy Lingo: 利用机器学习改进 Hugging Face Hub 上的语言元数据

太长不看版: Hub 上有不少数据集没有语言元数据&#xff0c;我们用机器学习来检测其语言&#xff0c;并使用 librarian-bots 自动向这些数据集提 PR 以添加其语言元数据。 Hugging Face Hub 已成为社区共享机器学习模型、数据集以及应用的存储库。随着 Hub 上的数据集越来越多&…

[概率论]四小时不挂猴博士

贝叶斯公式是什么 贝叶斯公式是概率论中的一个重要定理&#xff0c;用于计算在已知一些先验信息的情况下&#xff0c;更新对事件发生概率的估计。贝叶斯公式的表达式如下&#xff1a; P(A|B) P(B|A) * P(A) / P(B) 其中&#xff0c;P(A|B)表示在事件B发生的条件下事件A发生的概…

基于sumo实现交通灯控制算法的模板

基于sumo实现交通灯控制算法的模板 目录 在windows安装run hello world networkroutesviewsettings & configurationsimulation 交通灯控制系统 介绍文件生成器类&#xff08;FileGenerator&#xff09;道路网络&#xff08;Network&#xff09;辅助函数生成道路网络&am…

php 数组中的元素进行排列组合

需求背景&#xff1a;计算出数组[A,B,C,D]各种排列组合&#xff0c;希望得到的是数据如下图 直接上代码&#xff1a; private function finish_combination($array, &$groupResult [], $splite ,){$result [];$finish_result [];$this->diffArrayItems($array, $…