【Spring】——1、使用@Configuration和@Bean给容器中注册组件

news2024/11/19 13:24:21

在这里插入图片描述

📫作者简介:zhz小白
公众号:小白的Java进阶之路
专业技能:
1、Java基础,并精通多线程的开发,熟悉JVM原理
2、熟悉Java基础,并精通多线程的开发,熟悉JVM原理,具备⼀定的线上调优经验
3、熟悉MySQL数据库调优,索引原理等,⽇志原理等,并且有出过⼀篇专栏
4、了解计算机⽹络,对TCP协议,滑动窗⼝原理等有⼀定了解
5、熟悉Spring,Spring MVC,Mybatis,阅读过部分Spring源码
6、熟悉SpringCloud Alibaba体系,阅读过Nacos,Sentinel,Seata,Dubbo,Feign,Gateway核⼼源码与设计,⼆次开发能⼒
7、熟悉消息队列(Kafka,RocketMQ)的原理与设计
8、熟悉分库分表ShardingSphere,具有真实⽣产的数据迁移经验
9、熟悉分布式缓存中间件Redis,对其的核⼼数据结构,部署架构,⾼并发问题解决⽅案有⼀定的积累
10、熟悉常⽤设计模式,并运⽤于实践⼯作中
11、了解ElasticSearch,对其核⼼的原理有⼀定的了解
12、了解K8s,Jekins,GitLab
13、了解VUE,GO
14、⽬前有正在利⽤闲暇时间做互游游戏,开发、运维、运营、推销等

本人著作git项目:https://gitee.com/zhouzhz/star-jersey-platform,有兴趣的可以私聊博主一起编写,或者给颗star
领域:对支付(FMS,FUND,PAY),订单(OMS),出行行业等有相关的开发领域
🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~

文章目录

  • Spring IOC和DI
  • 通过XML配置文件注入JavaBean
  • 通过注解注入JavaBean
  • 总结

Spring IOC和DI

在Spring容器的底层,最重要的功能就是IOC和DI,也就是控制反转和依赖注入。
在这里插入图片描述
DI和IOC它俩之间的关系是DI不能单独存在,DI需要在IOC的基础上来完成。
在Spring内部,所有的组件都会放到IOC容器中,组件之间的关系通过IOC容器来自动装配,也就是我们所说的依赖注入。接下来,我们就使用注解的方式来完成容器中组件的注册、管理及依赖、注入等功能。

在介绍使用注解完成容器中组件的注册、管理及依赖、注入等功能之前,我们先来看看使用XML配置文件是如何注入bean的。

通过XML配置文件注入JavaBean

首先,新建一个maven项目,例如spring-annotation-learn,注意其打包方式是jar。
在maven依赖中添加:

<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.3.23</version>
  </dependency>
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
  </dependency>

在这里插入图片描述

接着,在工程的com.zhz.bean包下创建一个Person类,作为测试的JavaBean,代码如下所示。

package com.zhz.bean;

import lombok.*;

/**
 * @author zhouhengzhe
 * @description: 实体类
 * @date 2022/11/4 10:12
 * @since v1
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ToString
public class Person {
    private String name;
    private Integer age;
}

紧接着,在工程的src/main/resources目录下创建Spring的配置文件,例如beans.xml,通过该配置文件将Person类注入到Spring的IOC容器中,该配置文件中的内容如下所示。(我这里一次性全部导入,后面就不需要导入了)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>spring-annotation-learn</artifactId>
  <version>1.0-SNAPSHOT</version>

  <properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <spring.version>5.3.23</spring.version>
  </properties>
  <dependencies>
    <!-- Spring 容器包 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!-- Spring核心依赖 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.24</version>
    </dependency>
    <!-- Spring beans包-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!-- Spring aop依赖 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!-- Spring aspects依赖 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!-- aspectj依赖 -->
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>1.9.9.1</version>
    </dependency>
    <!--        &lt;!&ndash; Spring jdbc依赖 &ndash;&gt;-->
    <!--        <dependency>-->
    <!--            <groupId>org.springframework</groupId>-->
    <!--            <artifactId>spring-jdbc</artifactId>-->
    <!--            <version>${spring.version}</version>-->
    <!--        </dependency>-->
    <!--Spring事物依赖 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!-- Spring web依赖 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>${spring.version}</version>
            </dependency>
    <!--Spring webmvc依赖 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>${spring.version}</version>
            </dependency>
    <!-- Spring test依赖 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
    </dependency>
      <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>transmittable-thread-local</artifactId>
            <version>2.14.2</version>
        </dependency>
  </dependencies>
</project>

至此,我们使用XML配置文件的方式注入JavaBean就完成了。
接下来,我们在工程的com.zhz包下创建一个MainTest类来进行测试,该类的代码如下所示。

package com.zhz;

import com.zhz.bean.Person;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author zhouhengzhe
 * @description: 测试类
 * @date 2022/11/4 10:15
 * @since v1
 */
public class MainTest {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-bean.xml");
        Person person = (Person) applicationContext.getBean("person");
        System.out.println(person);
    }
}

在这里插入图片描述

通过注解注入JavaBean

通过XML配置文件的方式,我们可以将JavaBean注入到Spring的IOC容器中。那使用注解又该如何实现呢?别急,其实使用注解比使用XML配置文件要简单的多,我们在项目的com.meimeixia.config包下创建一个MainConfig类,并在该类上添加@Configuration注解来标注该类是一个Spring的配置类,也就是告诉Spring它是一个配置类,最后通过**@Bean注解将Person类注入到Spring的IOC**容器中。

package com.zhz.config;

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

import com.zhz.bean.Person;
/**
 * 以前配置文件的方式被替换成了配置类,即配置类==配置文件
 * @author zhz
 *
 */
// 这个配置类也是一个组件 
@Configuration // 告诉Spring这是一个配置类
public class MainConfig {

	// @Bean注解是给IOC容器中注册一个bean,类型自然就是返回值的类型,id默认是用方法名作为id
	@Bean
	public Person person() {
		return new Person("zhz", 20);
	}
	
}

没错,通过MainConfig类我们就能够将Person类注入到Spring的IOC容器中,是不是很Nice啊!!主要是我们在类上加上@Configuration注解,并在方法上加上@Bean注解,就能够将方法中创建的JavaBean注入到Spring的IOC容器中。

然后,我们修改MainTest类中的main方法,以测试通过注解注入的Person类,如下所示。

package com.zhz;

import com.zhz.bean.Person;
import com.zhz.config.MainConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author zhouhengzhe
 * @description: 测试类
 * @date 2022/11/4 10:15
 * @since v1
 */
public class MainTest {
    public static void main(String[] args) {
//        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-bean.xml");
//        Person person = (Person) applicationContext.getBean("person");
//        System.out.println(person);
        ApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        Person person = annotationConfigApplicationContext.getBean(Person.class);
        System.out.println(person);
    }
}

在这里插入图片描述

到这里,我们已经明确了,通过XML配置文件和注解这两种方式都可以将JavaBean注入到Spring的IOC容器中。那么,使用注解将JavaBean注入到IOC容器中时,使用的bean的名称又是什么呢?我们可以在MainTest类的main方法中添加如下代码来获取Person这个类型的组件在IOC容器中的名字。

// Person这个类型的组件在IOC容器中的名字是什么呢?
String[] namesForType = applicationContext.getBeanNamesForType(Person.class);
for (String name : namesForType) {
    System.out.println(name);
}

这样,MainTest类的main方法的完整代码如下所示。

package com.zhz;

import com.zhz.bean.Person;
import com.zhz.config.MainConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author zhouhengzhe
 * @description: 测试类
 * @date 2022/11/4 10:15
 * @since v1
 */
public class MainTest {
    public static void main(String[] args) {
//        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-bean.xml");
//        Person person = (Person) applicationContext.getBean("person");
//        System.out.println(person);
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        Person person = applicationContext.getBean(Person.class);
        System.out.println(person);
        String[] beanNamesForType = applicationContext.getBeanNamesForType(Person.class);
        for (String s : beanNamesForType) {
            System.out.println(s);
        }

    }
}

在这里插入图片描述

我们可以思考一下person是什么?我们修改下MainConfig中的person()方法的名字,改成person1,如下:

package com.zhz.config;

import com.zhz.bean.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author zhouhengzhe
 * @description: todo
 * @date 2022/11/4 10:27
 * @since v1
 */
@Configuration
public class MainConfig {

    @Bean
    public Person person1(){
        return new Person("zhz", 20);
    }
}

再次运行MainTest,发现名字变了,所以可以得知,其拿的是方法名做beanName(Bean的名字)
在这里插入图片描述

我们可以想一想@Bean里面是不是也可以命名呢,如下

package com.zhz.config;

import com.zhz.bean.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author zhouhengzhe
 * @description: todo
 * @date 2022/11/4 10:27
 * @since v1
 */
@Configuration
public class MainConfig {

    /**
     * @Bean注解是给IOC容器中注册一个bean,类型自然就是返回值的类型,id默认是用方法名作为id
      */
    @Bean(name = "person")
    public Person person1(){
        return new Person("zhz", 20);
    }
}

运行MainTest可知:确实可以改变。
在这里插入图片描述

总结

我们在使用注解方式向Spring的IOC容器中注入JavaBean时,如果没有在**@Bean注解中明确指定bean的名称**,那么就会使用当前方法的名称来作为bean的名称;如果在**@Bean注解中明确指定了bean的名称**,那么就会使用**@Bean注解中指定的名称来作为bean的名称**。

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

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

相关文章

ArrayList详解

ArrayList是什么? ArrayList就是动态数组&#xff0c;是List接口的可调整大小的数组实现&#xff1b;除了实现List接口之外&#xff0c;该类还提供了一些方法来操纵内部使用的存储列表的数组大小。它的主要底层实现是数组Object[] elementData。 为什么要设计ArrayList&…

【C++】mapset利用红黑树进行简单封装

前言 大家好~~~~呀&#xff01;很荣幸你能点击这篇文章。本篇也是我的一份学习笔记&#xff0c;让我们一起共同成长吧~ing...... C红黑树的简单插入实现博客~ 【C】红黑树的插入实现_柒海啦的博客-CSDN博客 二叉搜索树的基本结构和实现博客~ 【C】二叉搜索树_柒海啦的博客-CSDN…

java 实现一个最小栈

文章目录最小栈1.实现思路2.实现过程演示3.代码实现思路3.1 压入思路3.2 弹出思路3.3 如何返回栈顶元素的下标3.4 如何返回栈的最小值4.整体代码实现最小栈 1.实现思路 实现一个stack栈 和 minStack栈。先将数据一个一个压入到 stack 中。找到 stack 中的最小值。minStack中始…

简单介绍动态链接过程

文章目录gotgot[0] link_map结构体地址got[1] _dl_runtime_resolvegot[2]之后pltplt[0] 调用libc解析函数plt后面的plt.sec随便拿ida打开一个程序可以看到这是got的内容gdb一下查看内容&#xff0c;可以看到地址是从0开始的大家也知道 got是个独立的section&#xff0c;所以最开…

MySQL数据库(Java的数据库编程:JDBC)

作者&#xff1a;渴望力量的土狗 博客主页&#xff1a;渴望力量的土狗的博客主页 专栏&#xff1a;MySQL数据库 目录 什么是数据库编程&#xff1a; 什么是JDBC? JDBC工作原理&#xff1a; JDBC的使用及相关操作&#xff1a; JDBC开发案例&#xff1a; JDBC常用接口…

关于电影的HTML网页设计-威海影视网站首页-电影主题HTM5网页设计作业成品

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

5分钟教你如何设计一个安全web架构

今天就给大家聊聊web安全&#xff0c;web安全占比还是比较大的&#xff0c;基础的从一些html标签&#xff0c;到js 然后到接口&#xff0c;数据库&#xff0c;以及流量攻击&#xff0c;模拟请求。当然这也谈到了一个概念&#xff0c;全新的架构设计模式&#xff0c;前后端分离&…

一文讲解如何学习 Linux 内核网络协议栈

协议栈的细节 下面将介绍一些内核网络协议栈中常常涉及到的概念。 sk_buff 内核显然需要一个数据结构来表示报文&#xff0c;这个结构就是 sk_buff ( socket buffer 的简称)&#xff0c;它等同于在<TCP/IP详解 卷2>中描述的 BSD 内核中的 mbuf。 sk_buff 结构自身并不…

【毕业设计】深度学习人脸性别年龄识别系统 - python

文章目录0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程4 具体实现4.1 预训练数据格式4.2 部分实现代码5 最后0 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff0…

【案例分享】华为防火墙出接口方式的单服务器智能DNS配置

介绍出接口方式的单服务器智能DNS的配置举例。 组网需求 如图1所示&#xff0c;企业部署了一台ISP1服务器对外提供Web服务&#xff0c;域名为www.example.com。ISP1服务器的私网IP地址为10.1.1.10&#xff0c;服务器映射后的公网IP地址为1.1.1.10。企业的DNS服务器上存在域名w…

为什么你的用户转化率不高?-- 新媒体运营转化效果渠道归因分析

新媒体运营人最关注的就是流量和用户转化问题。公司发布了新APP、上线了新网站项目&#xff0c;进行用户定位、策划、数据分析和内容营销&#xff0c;花重钱做产品推广&#xff0c;但最后用户转化率却不高&#xff0c;大批用户流失了......这种现象是运营人最不愿意看到的&…

老杨说运维|今年这个会议非比寻常

前言&#xff1a; 人民银行印发的《金融科技(FinTech)发展规划(2022-2025年)》中&#xff0c;重点围绕数字化转型建设&#xff0c;强调上云、数据基础建设以及数智应用的重要性&#xff0c;明确了金融科技的长期重点建设方向。 由金科创新社主办的“2022金融业新一代数据中心发…

kwebio/kweb-core:面向后端的轻量级 Kotlin Web 框架

现代网站至少由两个紧密耦合 的组件组成&#xff0c;一个在浏览器中运行&#xff0c;另一个在服务器上。它们通常用不同的编程语言编写&#xff0c;并且必须通过 HTTP(S) 连接相互通信。 Kweb 的目标是消除这种服务器/浏览器分离&#xff0c;这样您就可以专注于构建您的网站或用…

react多组件出错其他正常显示

问题&#xff1a;一个组件内部有很多个子组件&#xff0c;其中一个出错&#xff0c;怎么实现其他组件可以正常显示&#xff0c;而不是页面挂掉&#xff1f; 一、错误边界 可以捕获发生在其子组件树任何位置的 JavaScript 错误&#xff0c;并打印这些错误&#xff0c;同时展示…

CC攻击和DDOS攻击哪个对服务器影响更大

互联网企业&#xff0c;不管是小企业&#xff0c;还是大企业&#xff0c;大多数企业网站都遭受过攻击&#xff0c;而我们时不时的也能在网上看见某大型企业网站被攻击&#xff0c;崩溃的新闻&#xff0c;网络攻击可以说是屡见不鲜了。攻击力最常见的就是DDOS攻击和CC攻击&#…

使用HTML+CSS技术制作篮球明星介绍网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

2022年数维杯国际数模赛浅评

今日数维杯国际大学生数学建模挑战赛将要开赛&#xff0c;为了更好的帮助大家整理了以下注意事项&#xff0c; 竞赛开始时间&#xff1a;北京时间2022年11月17日08:00&#xff08;周四&#xff09; 竞赛结束时间&#xff1a;北京时间2022年11月21日08&#xff1a;00&#xff…

ffmpeg视频编解码 demo初探(二)(包含下载指定windows版本ffmpeg)将YUV图片序列作为流读入,编码封装成x264 MP4视频

参考文章&#xff1a;【FFmpeg编码实战】&#xff08;1&#xff09;将YUV420P图片集编码成H.264视频文件 文章目录第二个项目&#xff1a;将YUV图片序列作为流读入&#xff0c;编码封装成x264 MP4视频将YUV图片序列编码成.h264文件将YUV图片序列编码成mp4文件第二个项目&#x…

艾美捷测序级 II,纯化胰蛋白酶化验程序文献参考

胰蛋白酶是一种基于带正电荷的赖氨酸和精氨酸侧链的底物特异性胰丝氨酸蛋白酶&#xff08;Brown and Wold 1973&#xff09;。这种酶由胰腺排出&#xff0c;参与食物蛋白质的消化和其他生物过程。胰蛋白酶是一种中等大小的球状蛋白&#xff0c;作为一种无活性的胰蛋白酶原产生&…

甘露糖-顺铂mannose-cisplatin|甘露糖-聚乙二醇-顺铂cisplatin-PEG-mannose

甘露糖-顺铂mannose-cisplatin|甘露糖-聚乙二醇-顺铂cisplatin-PEG-mannose 顺铂&#xff0c;又名顺式-二氯二氨合铂&#xff0c;是一种含铂的药物&#xff0c;呈橙黄色或黄色结晶性粉末&#xff0c;微溶于水、易溶于二甲基甲酰胺&#xff0c;在水溶液中可逐渐转化成反式和水解…