锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. Spring Boot中6种 注入 Bean 的方式

Spring Boot中6种 注入 Bean 的方式

0
  • 软件开发
  • 发布于 2024-08-16
  • 0 次阅读
黄健
黄健

本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net

背景

我们谈到 Spring 的时候一定会提到 IOC 容器、DI 依赖注入,Spring 通过将一个个类标注为 Bean 的方法注入到 IOC 容器中,达到了控制反转的效果。那么我们刚开始接触 Bean 的时候,一定是使用 xml 文件,一个一个的注入,就例如下面这样。

我们的项目一般很大的话,就需要成千上百个 Bean 去使用,这样写起来就很繁琐。那么 Spring 就帮我们实现了一种通过注解来实现注入的方法。只需要在你需要注入的类前面加上相应的注解,Spring 就会帮助我们扫描到他们去实现注入。

xml 扫描包的方式

<context:component-scan base-package=“com.company.beandemo”/>

通过注解注入的一般形式

一般情况下,注入 Bean 有一个最直白,最易懂的方式去实现注入,下面废话先不多说,先贴代码。

  • Bean 类

public class MyBean{

}

  • Configuration 类

// 创建一个 class 配置文件

@Configuration

public class MyConfiguration{

// 将一个 Bean 交由 Spring 进行管理

@Bean

public MyBean myBean(){

return new MyBean();

}

}

  • Test 类

与 xml 有一点不同,这里在 Test 中,实例化的不再是 ClassPathXmlApplicationContext,而是获取的 AnnotationConfigApplicationContext 实例。

ApplicationContext context = new AnnotationConfigApplicationContext(MyConfiguration.class);

MyBean myBean = cotext.getBean(“myBean”,MyBean.class);

System.out.println("myBean =" + myBean);

上面的代码中 MyBean 也就是我们需要 Spring 去管理的一个 Bean,他只是一个简单的类。而 MyConfiguration 中,我们首先用 @Configuration 注解去标记了该类,这样标明该类是一个 Spring 的一个配置类,在加载配置的时候会去加载他。

在 MyConfiguration 中我们可以看到有一个方法返回的是一个 MyBean 的实例,并且该方法上标注着 @Bean 的注解,标明这是一个注入 Bean 的方法,会将下面的返回的 Bean 注入 IOC。

通过构造方法注入 Bean

我们在生成一个 Bean 实例的时候,可以使用 Bean 的构造方法将 Bean 实现注入。直接看代码

  • Bean 类

@Component

public class MyBeanConstructor {

private AnotherBean anotherBeanConstructor;

@Autowired

public MyBeanConstructor(AnotherBean anotherBeanConstructor){

this.anotherBeanConstructor = anotherBeanConstructor;

}

@Override

public String toString() {

return “MyBean{” +

“anotherBeanConstructor=” + anotherBeanConstructor +

‘}’;

}

}

  • AnotherBean 类

@Component(value=“Bean 的 id,默认为类名小驼峰”)

public class AnotherBean {

}

  • Configuration 类

@Configuration

@ComponentScan(“com.company.annotationbean”)

public class MyConfiguration{

}

这里我们可以发现,和一般方式注入的代码不一样了,我们来看看新的注解都是什么意思:

  • @AutoWired

简单粗暴,直接翻译过来的意思就是自动装配🔧,还不理解为什么叫自动装配🔧?看了下一个注解的解释你就知道了。若是在这里注入的时候指定一个 Bean 的 id 就要使用 @Qualifier 注解

  • @Component(默认单例模式)

什么??这翻译过来是零件,怎么感觉像是修汽车??是的,Spring 管理 Bean 的方法就是修汽车的方式。我们在需要将一个类变成一个 Bean 被 Spring 可以注入的时候加上注解零件 @Conmonent,那么我们就可以在加载 Bean 的时候把他像零件一样装配🔧到这个 IOC 汽车上了

在这里我们还有几个其他的注解也可以实现这个功能,也就是细化的 @Component:

  • @Controller 标注在 Controller 层

  • @Service 标注在 Service 层

  • @Repository 标注在 dao 层

  • @ComponentScan(“”)

还是翻译,零件扫描,我们去看看括号里的 “零件仓库” 里面,哪些“零件”(类)需要被装载,Spring 就会去扫描这个包,将里面所有标注了 @Component 的类进行注入。

这里的通过构造方法进行注入就很好理解了,我们在装配 MyBean 这个零件的时候,突然发现他必须在 AnotherBean 的基础上才能安装到 IOC 里面,那么我们就在每次装配 MyBean 的时候自动装配🔧一个 AnotherBean 进去。举个🌰吧:

还是以汽车为例,我们在踩油门出发之前,是不是必须发车??这里的 AutoWired 的内容就像发车,你不发车,这个油门你踩断都没有用,他都不会走。

通过 set 方法注入 Bean

我们可以在一个属性的 set 方法中去将 Bean 实现注入,看代码吧

  • MyBean 类

@Component

public class MyBeanSet {

private AnotherBean anotherBeanSet;

@Autowired

public void setAnotherBeanSet(AnotherBean anotherBeanSet) {

this.anotherBeanSet = anotherBeanSet;

}

@Override

public String toString() {

return “MyBeanSet{” +

“anotherBeanSet=” + anotherBeanSet +

‘}’;

}

}

  • Configuration 类 和 Test 类

同上一个,就不贴了

这里我们发现在 setter 方法上我们有一个 @AutoWired, 与上面不同的是,我们不会在实例化该类时就自动装配🔧这个对象,而是在显式调用 setter 的时候去装配。

通过属性去注入 Bean

我们前面两种注入的方式诸如时间不同,并且代码较多,若是通过属性,即就是

@Component

public class MyBeanProperty {

@Autowired

private AnotherBean anotherBeanProperty;

@Override

public String toString() {

return “MyBeanProperty{” +

“anotherBeanProperty=” + anotherBeanProperty +

‘}’;

}

}

这里我们可以看到我们这个类中需要使用 AnotherBean 这个实例对象,我们可以通过 @AutoWired 去自动装配它。

对于有些小伙伴问私有属性,Spring 怎么去加载它到 IOC 的?推荐去看看反射

通过 List 注入 Bean

  • MyBeanList 类

@Component

自我介绍一下,小编 13 年上海交大毕业,曾经在小公司待过,也去过华为、OPPO 等大厂,18 年进入阿里一直到现在。

深知大多数 Java 工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024 年 Java 开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合 3 年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了 95% 以上 Java 开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注 Java 获取)

总结

面试前的 “练手” 还是很重要的,所以开始面试之前一定要准备好啊,不然也是耽搁面试官和自己的时间。

我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

面试题及解析总结

大厂面试场景

知识点总结

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
yle=“zoom: 33%;” />

总结

面试前的 “练手” 还是很重要的,所以开始面试之前一定要准备好啊,不然也是耽搁面试官和自己的时间。

我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

面试题及解析总结

[外链图片转存中…(img-awT9z5xR-1713389633829)]

大厂面试场景

[外链图片转存中…(img-v4DeAoIH-1713389633830)]

知识点总结

[外链图片转存中…(img-QdgeboOj-1713389633830)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

标签: #Spring Boot 173 #软件开发 1171 #JAVA 991
相关文章

万字:支付“核心系统”详解 2024-11-02 15:33

专栏作者:隐墨星辰 \| 主编:陈天宇宙 这篇文章也尝试化繁为简,探寻支付系统的本质,讲清楚在线支付系统最核心的一些概念和设计理念。 虽然支付行业已经过了风头最劲的时光,但跨境支付仍然在蓬勃发展,每年依然有很多新人进入这个行业,这篇文章尝试为这些刚入行的新人提供一点帮助。 文章只介绍一些支付行业十几

资深支付架构师视角:实战从问题定义到代码落地的完整套路 2024-11-02 15:33

前言 今天从一个实际案例入手,介绍站在架构师的角度,如何识别并定义问题,提炼需求,技术方案选型,再到详细设计,最后利用AI的能力协助写出核心的代码,验证与调优。 解决问题存在一定的模式,也可以称之为框架,总结出自己的思考和解题框架,以后再碰到同类型的问题就可以如庖丁解牛一样容易。 很多年前,我写代码

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

设计模式第16讲——迭代器模式(Iterator) 2024-10-08 11:24

一、什么是迭代器模式 迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。 二、角色组成 抽象迭代器(Iterator):定义了遍历聚合对象所需的方法

vue2路由和vue3路由区别及原理 2024-10-08 11:24

一、Vue2 与 Vue3 路由的区别 1. 创建路由实例方式的不同 Vue 2 中,通过 Vue.use() 注册路由插件,并通过 new VueRouter() 来创建路由实例。 import Vue from 'vue';import VueRouter from 'vue-router';i

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.