Spring Bean装配精解:探索自动化与显式配置之道

news2024/9/24 13:25:20

在这里插入图片描述

作为一名对技术充满热情的学习者,我一直以来都深刻地体会到知识的广度和深度。在这个不断演变的数字时代,我远非专家,而是一位不断追求进步的旅行者。通过这篇博客,我想分享我在某个领域的学习经验,与大家共同探讨、共同成长。请大家以开放的心态阅读,相信你们也会在这段知识之旅中找到启示。

文章目录

  • 前言
  • 一、什么是Bean的装配方式?
  • 二、基于XML的装配
        • 定义Bean
        • 注入依赖
        • 示例
        • XML配置文件
        • 加载和使用ApplicationContext
  • 三、基于Annotation的装配
      • 实现代码示例
  • 四、自动装配
      • 定义两个类
      • 配置自动扫描
      • 运行程序


前言

上节我们介绍了Spring中的Bean,关于Bean的配置和Bean的作用域,今天我们就来聊聊Bean的装配方式。


一、什么是Bean的装配方式?

Bean的装配方式指的是在Spring框架中,将Bean组件连接和组合在一起的过程以及实现这一过程的不同方法。在Spring中,Bean装配主要有三种方式:

  1. 基于XML的配置:最传统的装配方式,开发者在XML配置文件中定义Bean及其依赖关系。通过<bean>元素声明Bean,并通过<property><constructor-arg>元素注入依赖。

    <!-- XML中定义一个bean -->
    <bean id="exampleBean" class="com.example.ExampleBean">
        <!-- 设置属性或依赖 -->
        <property name="beanOne" ref="anotherBean"/>
        <property name="myValue" value="123"/>
    </bean>
    
  2. 基于注解的配置:随着Spring 2.5的引入,原先繁琐的XML配置可以通过注解来简化。开发者可以使用注解(如@Component, @Service, @Repository@Autowired)来标注类和字段,Spring容器会自动探测和装配Bean。

    // 使用@Component注解定义一个bean
    @Component
    public class ExampleBean {
        // 使用@Autowired注解自动装配
        @Autowired
        private AnotherBean beanOne;
    
        // ...更多代码
    }
    
  3. Java基于配置的方式:从Spring 3.0开始,可以使用@Configuration@Bean注解在Java类中进行配置。这样可以完全摆脱XML文件,并以类型安全的方式进行Bean定义和依赖注入。

    @Configuration
    public class AppConfig {
        // 使用@Bean注解定义一个bean
        @Bean
        public ExampleBean exampleBean() {
            ExampleBean exampleBean = new ExampleBean();
            exampleBean.setBeanOne(anotherBean());
            return exampleBean;
        }
    
        @Bean
        public AnotherBean anotherBean() {
            return new AnotherBean();
        }
    
        // ...更多配置代码
    }
    

每种装配方式都有其适用场景和好处:XML配置文件分离了代码和配置,高度灵活但较为繁琐;注解配置紧密与代码结合,提高了开发效率,易于理解;Java配置方式提供了强大的类型安全和易于重构的配置方式,且没有字符串标识符,减少了出错几率。

开发者可以根据具体需求和项目特点,选择适合的装配方式,也可以将这几种方式结合使用,取长补短。

二、基于XML的装配

基于XML的装配是Spring框架中的传统依赖注入方式。它使用一个XML文件来显式地声明Beans以及它们之间的依赖关系。以下步骤及代码将帮助你理解这个过程:

定义Bean

在XML中,你会定义一个或多个<bean>元素。每个<bean>元素通常包含idclass属性,分别代表Bean的唯一标识符和对应的全限定类名。

注入依赖

依赖注入可以通过设置属性(setter注入)或者构造函数(构造器注入)来完成。

  • Setter注入:利用<property>元素对Bean的属性进行赋值,可以引用其他Bean或者直接设置值(如字符串、数字等)。
  • 构造器注入:用<constructor-arg>元素来定义要通过构造器传递的参数。
示例

假设我们有两个简单的类,ExampleBeanAnotherBean

public class AnotherBean {
    // 类实现
}

public class ExampleBean {
    private AnotherBean anotherBean;
    private int number;

    // Setter 方法用于注入依赖
    public void setAnotherBean(AnotherBean anotherBean) {
        this.anotherBean = anotherBean;
    }

    // Setter 方法用于注入简单值
    public void setNumber(int number) {
        this.number = number;
    }
    
    // 类的其他代码
}
XML配置文件

创建一个名为applicationContext.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">

    <!-- 定义AnotherBean -->
    <bean id="anotherBean" class="your.package.AnotherBean"/>
    
    <!-- 定义ExampleBean并注入依赖 -->
    <bean id="exampleBean" class="your.package.ExampleBean">
        <property name="anotherBean" ref="anotherBean"/>
        <property name="number" value="42"/>
    </bean>

</beans>
加载和使用ApplicationContext

最后,在你的Java应用程序中,你需要加载Spring的ApplicationContext来访问这些Beans:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        
        ExampleBean exampleBean = (ExampleBean) context.getBean("exampleBean");
        // 此处exampleBean已经具有了依赖对象anotherBean和设置过的number属性
    }
}

这个例子展示了如何通过XML文件装配Spring Beans,并在Java代码中加载和使用这些Beans。这种方式非常适用于那些在编译时无法确定依赖关系,或者希望在不改动代码的情况下调整依赖关系的场景。不过,随着Spring的发展,许多开发者更倾向于使用注解或Java配置类这样更加简洁和现代化的依赖注入方式。

三、基于Annotation的装配

基于注解的装配是一种简化Spring应用程序配置的方式。在这种方法中,你不需要编写大量的XML配置文件,而是通过一系列的注解来自动装配Bean之间的依赖关系。以下是一些关键注解,以及如何在代码中使用它们:

  • @Component: 用于类的级别,标记一个类作为Spring容器管理的Bean。
  • @Autowired: 可以用于变量、setter方法和构造函数上,用于自动注入Bean的依赖。
  • @Service, @Repository, @Controller: 它们分别用于标记服务层、数据访问层和控制层的组件,本质上与@Component注解相同,但可通过这些特定注解提供额外的语义。

实现代码示例

假设我们依然有ExampleBeanAnotherBean两个类,我们将使用注解来自动装配它们之间的关系。

首先,在Java类中使用注解创建Bean:

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

@Component // 标记这个类为Spring管理的Bean
public class ExampleBean {

    private AnotherBean anotherBean;

    @Autowired // 自动注入AnotherBean的实例
    public void setAnotherBean(AnotherBean anotherBean) {
        this.anotherBean = anotherBean;
    }
}

@Component // 同样将AnotherBean标记为Spring管理的Bean
class AnotherBean {
   // 类的实现...
}

接下来,配置Spring以扫描注解:

通常,我们会在一个配置类上使用@ComponentScan注解来告诉Spring在哪个包下扫描@Component及其衍生注解(如@Service, @Repository等)。

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

@Configuration
@ComponentScan(basePackages = "your.package") // 替换成你的包名
public class AppConfig {
    
}

最后,在你的应用程序中,你需要创建一个Spring的ApplicationContext并加载配置类,从而获得自动装配的Bean:

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        ExampleBean exampleBean = context.getBean(ExampleBean.class);

        // 使用exampleBean的其他方法...
    }
}

在这个示例中,ExampleBean将会自动装配一个AnotherBean的实例,因为我们使用了@Autowired注解在ExampleBeansetAnotherBean方法上。Spring容器会在启动时通过@ComponentScan指示的包路径来查找标记有@Component和其他相关注解的类,并自动创建和装配这些对象的实例。

基于注解的装配方式提供了一种便捷且强大的机制来处理Spring Bean的注册和依赖注入,大大简化了Spring应用程序的配置工作。

四、自动装配

自动装配(Autowiring)是Spring框架提供的一种依赖注入的方式,它可以自动地连接相互协作的Bean之间的关系。自动装配省去了需要显式指定每个Bean依赖关系的步骤。基本上,Spring可以自动寻找并连接需要的Bean,前提是有一个与之对应的、Bean注入点(如成员变量、构造器、setter方法)明确的Bean定义。

在Spring中,自动装配可以通过几种方式实现:

  1. ByType: 根据属性的数据类型在Spring容器中查找对应的Bean,并进行自动注入。
  2. ByName: 根据属性的名称在Spring容器中查找对应的Bean,并进行自动注入。
  3. Constructor: 类似于ByType,但是应用于构造器参数。如果容器中有多个相同类型的Bean,则会抛出异常。
  4. Qualifier: 使用@Qualifier注解来消除自动装配过程中的歧义,明确指定要装配的Bean的名称。

接下来,看一个简单的自动装配的实现例子:

定义两个类

import org.springframework.stereotype.Component;

@Component
public class ExampleDependency {
    public void performAction() {
        System.out.println("Dependency action performed!");
    }
}

@Component
public class ExampleBean {
    private final ExampleDependency exampleDependency;

    // 构造器自动装配ExampleDependency
    public ExampleBean(ExampleDependency exampleDependency) {
        this.exampleDependency = exampleDependency;
    }

    public void execute() {
        exampleDependency.performAction();
    }
}

配置自动扫描

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

@Configuration
@ComponentScan(basePackages = "the.package.where.your.classes.are")
public class AppConfig {
    // AppConfig不需要其他代码,因为自动装配不需要显式的Bean定义
}

运行程序

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {
    public static void main(String[] args) {
        // 加载配置类,初始化Spring容器
        ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);

        // 获取ExampleBean并调用它的execute方法
        ExampleBean exampleBean = ctx.getBean(ExampleBean.class);
        exampleBean.execute(); // 将输出"Dependency action performed!"
    }
}

在上面的代码示例中,我们定义了ExampleBeanExampleDependency两个类,并使用@Component注解来标记它们为Spring管理的Bean。ExampleBean通过构造函数依赖于ExampleDependency

AppConfig配置类中,我们使用@ComponentScan告诉Spring在指定的包路径查找@Component这样的注解,并自动构建Bean及其依赖。之后,当我们运行程序时,Spring会通过在ExampleBean的构造函数上使用@Autowired注解(即使我们没有显式地添加它,当构造方法只有一个参数时,Spring会默认添加@Autowired),自动装配上ExampleDependency的实例。

这个简单的例子展示了如何使用Spring的自动装配功能来减少配置工作,并有效地管理Bean之间的依赖关系。


感谢大家抽出宝贵的时间来阅读博主的博客,新人博主,感谢大家关注点赞,祝大家未来的学习工作生活一帆风顺,加油!!!
在这里插入图片描述

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

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

相关文章

GEE入门篇|图像分类(一):监督分类

在遥感中&#xff0c;图像分类是尝试将图像中的所有像素分类为有限数量的标记土地覆盖和/或土地利用类别。 生成的分类图像是从原始图像导出的简化专题图&#xff08;图 1&#xff09;&#xff0c; 土地覆盖和土地利用信息对于许多环境和社会经济应用至关重要&#xff0c;包括自…

boss app sig及sp参数,魔改base64(下)

本章所有样本及资料均上传123云盘,需要复刻的自行下载. boss官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 boss app sig及sp参数,魔改base64(上)_app 魔改base64-CSDN博客 上篇boss分析sig的地址在上面了,把这个sp分析完后再把响应解密分析完就可以对boss的招聘数据…

雷卯推荐电磁兼容保护器件-MOV压敏电阻

一&#xff0e;雷卯MOV产品表格部分展示 一&#xff0e;雷卯MOV产品表格部分展示 三、MOV概述 MOV是金属氧化物压敏电阻器&#xff08;Metal Oxide Varistor&#xff09;的缩写。它是一种电子元器件&#xff0c;通常用于保护电路中的电子设备不受过电压的损害。当电路中电压超…

SwiftUI中的边框、圆角、阴影与渐变色的应用

在SwiftUI中&#xff0c;可以使用边框、圆角、阴影和渐变色来增强视图的外观和风格。 边框&#xff1a; 可以通过在视图上应用边框样式来创建边框效果。使用border()修饰符&#xff0c;并指定边框的颜色、线条宽度和圆角半径&#xff0c;例如&#xff1a; Text("Hello, …

【中国算力大会主办】2024算法、高性能计算与人工智能国际学术会议(AHPCAI 2024)

【中国算力大会主办】2024算法、高性能计算与人工智能国际学术会议&#xff08;AHPCAI 2024&#xff09; 2024 International Conference on Algorithms, High Performance Computing and Artificial Intelligence 2024算法、高性能计算与人工智能国际学术会议&#xff08;AH…

【千字总结】爬虫学习指南-2024最新版

介绍 如何自学爬虫&#xff1f;今天有一个兄弟这样问我&#xff0c;可以看到打了很多字&#xff0c;诚意肯定是很足的&#xff0c;也是对我的内容给予了肯定&#xff0c;让我非常的开心。既然难得有人问我&#xff0c;那我一定要好好做一个回答。 我下面将要说的内容没有任何话…

Unity 刚体组件的碰撞与触发器

添加刚体组件 给球体添加刚体组件&#xff0c;将脚本挂载到上面。 以下效果为&#xff1a;当球体落到平面上会消失。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class c1 : MonoBehaviour {void Start(){}void Update(){}// 开…

基于遗传优化的协同过滤推荐算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 最后得到推荐的商品ID号&#xff1a; 推荐商品的ID号&#xff1a;ans 9838175822191114902149021235224732230712349911790154716550165501655011…

游泳耳机品牌排行榜前十名:10大口碑产品力荐!

在现代快节奏的生活中&#xff0c;游泳已经成为许多人放松身心、保持健康的重要方式。而伴随着游泳&#xff0c;一款优秀的游泳耳机则成为了许多游泳爱好者不可或缺的装备之一。它不仅能让你在游泳时享受音乐、广播或是专注训练&#xff0c;还能让整个游泳过程更加愉悦、充满动…

宠物的异味,用空气净化器可以解决吗?宠物空气净化器品牌推荐

养猫的人都了解&#xff0c;一个养猫家庭的环境卫生和气味问题与主人的关系密切相关。主人的勤劳程度和对卫生的重视程度直接影响着家中的气味。尽管主人通常会经常更换猫砂&#xff0c;但有时候仍然会存在一些难闻的气味。事实上&#xff0c;忙碌的猫主人可能会因为没有足够的…

总结zy_不定长数据帧的收发

1、接收部分 身份证模块串口接收解析&#xff1a; #define CRC_16_CCITT 0x1021 unsigned short CRC16_CCITT(unsigned char* pchMsg, unsigned short wDataLen) // 1. MSB { unsigned char i, chChar; unsigned short wCRC 0; while (wDataLen–) { chChar *pchMsg; wCRC ^…

符号函数Sign(博途PLC SCL代码)

符号函数在ADRC自抗扰算法里会有涉及,同时在滑膜控制里也会用到,这篇博客我们介绍符号函数在博途PLC里的实现。 1、ADRC自抗扰算法: https://rxxw-control.blog.csdn.net/article/details/126547180https://rxxw-control.blog.csdn.net/article/details/1265471802、模拟量…

虚拟机内存不够用了?全流程操作Look一下?

虚拟机信息&#xff1a;操作系统&#xff1a;CentOS Linux 7 (Core)&#xff0c;用的是VMware Workstation 16 Pro 版本16.2.3 build-19376536&#xff1b;我的主机 Windows 10 Education, 64-bit (Build 22000.1817) 10.0.22000 前言&#xff1a;虚拟机用久了就会出现内存不足…

Java知识点总结(二)

ID生成策略 主键自增id 主键自动增长&#xff0c;不用手工设值、数字型&#xff0c;占用空间小、检索非常有利、有顺序&#xff0c;不会重复&#xff0c;但在迁移旧数据是会出现id冲突 UUID 基于时间&#xff0c;计数器和地址生成32位的id redis生成id 原子性自增&#xff0c;并…

Python 关于函数的使用

一、学习目标 1&#xff0e;掌握函数定义和调用。 2&#xff0e;掌握函数形参与实参的使用。 3&#xff0e;熟练掌握lambda表达式使用。 二、相关练习 1.建立自定义函数实现计算圆的面积和球的体积。 def Count(radius):area 3.14*radius**2volume (4/3)*3.14*radius*…

C 判断

判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。 C 语言把任何非零和非空的值假定为 true&#xff0c;把零或 null 假定为 false。 下面…

C语言快速入门之指针详解

一.指针基础 1.指针定义的理解 就像我们住房子划分房间一样&#xff0c;在系统中&#xff0c;内存会被划分为多个内存单元&#xff0c;一个内存单元大小是一个字节&#xff0c;我们在搜索房间时有门牌号&#xff0c;与之类似&#xff0c;每个内存单元都会有一个编号 地址 指…

UCSF DOCK 分子对接详细案例(05)- 遗传算法用于分子生成 DOCK_GA

欢迎浏览我的CSND博客&#xff01; Blockbuater_drug …点击进入 文章目录 前言一、软件及操作环境二、遗传算法三、结构文件准备四、 DOCK_GA4.1 Fragment Library Generation4.2 运行 GA没有RDKit编译的情况RDKit编译的情况在服务器上运行 总结参考资料 前言 本文是UCSF DOC…

能源大数据采集,为您提供专业数据采集服务

随着经济的不断发展&#xff0c;能源产业也逐渐成为国民经济的支柱产业之一。而对于能源行业来说&#xff0c;数据采集是一项至关重要的工作。以往&#xff0c;能源企业采集数据主要依靠人工收集、整理&#xff0c;但是这种方式不仅效率低下&#xff0c;而且容易出现数据不准确…

Spring——Bean的作用域

bean的作用域 Bean Scope Scope说明singleton&#xff08;默认情况下&#xff09;为每个Spring IoC容器将单个Bean定义的Scope扩大到单个对象实例。prototype将单个Bean定义的Scope扩大到任何数量的对象实例。session将单个Bean定义的Scope扩大到一个HTTP Session 的生命周期…