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;

    @Autowired
    public 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 {

    @Bean
    public 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 {

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }

    @Bean
    public 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 {

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }

    @Bean
    public AnotherBean anotherBean() {
        return new AnotherBean();
    }

    @Bean
    public 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 {

    @Override
    public 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 {

    @Override
    public 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.properties

my.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;

    @Autowired
    public 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.properties

spring.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.java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DatabaseConfig {

    @Bean
    public DataSource dataSource() {
        // 配置数据源
        return new DataSource();
    }
}

2. 创建另一个配置类:

// ServiceConfig.java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ServiceConfig {

    @Bean
    public MyService myService() {
        // 配置业务服务
        return new MyService();
    }
}

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

// AppConfig.java

import 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.java

import org.springframework.beans.factory.annotation.Autowired;

public class MyService {

    private final DataSource dataSource;

    @Autowired
    public MyService(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    // 使用 dataSource 进行业务逻辑
}

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue2 - computed 和 method 的原理区别

目录 1&#xff0c;简单对比2&#xff0c;原理的不同1&#xff0c;method 的处理2&#xff0c;computed 的处理实现缓存触发更新 3&#xff0c;触发更新时的问题 1&#xff0c;简单对比 computed 当做属性使用&#xff0c;method 当做方法使用。computed 可以提供 getter 和 s…

spring模块(二)IOC容器之BeanFactory

在Spring中实现控制反转的是IoC容器 &#xff08;1&#xff09;IoC 不是一种技术&#xff0c;只是一种思想&#xff0c;一个重要的面向对象编程的法则&#xff0c;它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象&#xff0c;从…

Spring Boot Admin健康检查引起的Spring Boot服务假死

问题现象 最近在spring boot项目中引入了 spring-boot-starter-actuator 后&#xff0c;测试环境开始出现服务假死的现象&#xff0c; 且这个问题十分怪异&#xff0c;只在多个微服务中的简称A的这个服务中出现&#xff0c;其他服务都没有出现这个问题&#xff0c; 之所以说…

爬取彼案壁纸

代码展现&#xff1a; 具体代码&#xff1a; import requests import re import os filename 壁纸\\ if not os.path.exists(filename): os.mkdir(filename) for i in range(2,11): url fhttp://www.netbian.com/index_{i}.htm headers {User-Agent: …

iOS实时查看App运行日志

目录 一、设备连接 二、使用克魔助手查看日志 三、过滤我们自己App的日志 &#x1f4dd; 摘要&#xff1a; 本文介绍了如何在iOS iPhone设备上实时查看输出在console控制台的日志。通过克魔助手工具&#xff0c;我们可以连接手机并方便地筛选我们自己App的日志。 &#x1f4…

CMake支持的编译平台和IDE

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「本文的内容」&#xff1a;CMake入门教程 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 简介支持的IDEVisual…

vue3 鲜为人知的知识点

该篇文章是个人觉得在平常开发过程中没怎么注意到&#xff08;新增加&#xff09;的知识点&#xff0c;每个章节的内容在官网中不只文章提到的这些。 &#x1f495; 模板语法 ✔ 动态参数 <script setup> import { ref } from vueconst attributeName ref(msg) const …

[JavaWeb玩耍日记] 数据库

mysql版本&#xff1a;5.7.24 使用Navicat for MySQL辅助学习(2015年版)&#xff0c;这个在粘贴本博客的块引用内容时会有额外的不可见内容导致sql运行出问题&#xff0c;不过有影响的地方笔者已排除 目录 一.数据库创建 二.使用数据库与创建表 三.表内列的数据类型 四.修…

解决Android Studio The path ‘X:\XXX‘ does not belong to a directory.

目录 前言 一、问题描述 二、解决方法 前言 在移动应用开发领域&#xff0c;Android Studio作为一款功能强大的集成开发环境&#xff0c;为开发人员提供了丰富的工具和功能。然而&#xff0c;在使用Android Studio的过程中&#xff0c;有时也会遇到各种各样的问题和错误。 &…

SpringCloud微服务

微服务技术对比 DubboSpringCloudSpringCloudAlibaba注册中心zookeeper,RedisEureka、ConsulNacos、Eureka服务远程调用Dubbo协议Feign(http协议)Dubbo、Feign配置中心无SpringCloudConfigSpringCloudConfig,Nacos服务网关无SpringCloudGateway、ZuulSpringCloudGateway、Zuul…

西门子PLC联网数据采集:借助HiWoo Box实现高效监控与管理

在工业自动化领域&#xff0c;西门子PLC作为一种广泛应用的控制器&#xff0c;对于工厂的生产线具有至关重要的作用。如何实现西门子PLC的联网数据采集&#xff0c;提高生产效率和管理水平&#xff0c;成为了许多企业的关注焦点。而HiWoo Box作为一款功能强大的工业网关&#x…

STM32-03-STM32HAL库

文章目录 STM32HAL库1. HAL库介绍2. STM32Cube固件包3. HAL库框架结构4. 新建HAL版本MDK工程 STM32HAL库 1. HAL库介绍 HAL库 HAL&#xff0c;英文全称 Hardware Abstraction Layer&#xff0c;即硬件抽象层。HAL库是ST公司提供的外设驱动代码的驱动库&#xff0c;用户只需要调…

数字孪生在增强现实(AR)中的应用

数字孪生在增强现实&#xff08;Augmented Reality&#xff0c;AR&#xff09;中的应用可以提供更丰富、交互性更强的现实世界增强体验。以下是数字孪生在AR中的一些应用&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff…

性能优化-OpenMP概述(一)-宏观全面理解OpenMP

本文旨在从宏观角度来介绍OpenMP的原理、编程模型、以及在各个领域的应用、使用、希望读者能够从本文整体上了解OpenMP。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础…

添加jdk 11到环境变量的一种方法

添加jdk 11到环境变量的一种方法 1.jdk11可以直接在android studio 中下载&#xff0c; File --> Settings --> Build, Execution, Deployment --> Build Tools --> Gradle 下载jdk 11 &#xff0c;确认好下载路径 2.jdk11 添加到环境变量添加到环境变量 多个…

【AI视野·今日NLP 自然语言处理论文速览 第六十六期】Tue, 31 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Tue, 31 Oct 2023 (showing first 100 of 141 entries) Totally 100 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers The Eval4NLP 2023 Shared Task on Prompting Large Language Models a…

日程安排小程序实战教程

日常中我们经常有一些事情需要提醒自己&#xff0c;使用日历的形式比较符合实际的使用习惯。本篇我们就利用微搭低代码工具带着大家开发一款日程安排的小程序。 1 创建数据源 登录微搭低代码控制台&#xff0c;打开数据模型&#xff0c;点击创建 输入数据源的名称日程安排 …

Erupt即开即用的后台管理系统【告别前端代码】

一、引子 【零前端代码&#xff0c;几行Java注解&#xff0c;搞定后台管理系统】 如果只是自己内部公司使用的话&#xff0c;大多数功能都可以满足&#xff0c;剩下的就是自己添砖加瓦了。 我用这个主要是简单快捷&#xff0c;10分钟搭建一个简易的后台管理系统。 二、基本…

【精通C语言】:深入解析C语言中的while循环

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; C语言详解 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、while循环1.1语法1.2 执行过程解析1.3 break1.4 continue &#x1f324;️全篇总结 &…

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

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