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

简介: DI和IOC它俩之间的关系是DI不能单独存在,DI需要在IOC的基础上来完成。在Spring内部,所有的组件都会放到IOC容器中,组件之间的关系通过IOC容器来自动装配,也就是我们所说的依赖注入。接下来,我们就使用注解的方式来完成容器中组件的注册、管理及依赖、注入等功能。

image.png

📫作者简介: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项目:star-jersey-platform,有兴趣的可以私聊博主一起编写,或者给颗star

领域:对支付(FMS,FUND,PAY),订单(OMS),出行行业等有相关的开发领域

🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~

Spring IOC和DI

在Spring容器的底层,最重要的功能就是IOC和DI,也就是控制反转和依赖注入。

DI和IOC它俩之间的关系是DI不能单独存在,DI需要在IOC的基础上来完成。

在Spring内部,所有的组件都会放到IOC容器中,组件之间的关系通过IOC容器来自动装配,也就是我们所说的依赖注入。接下来,我们就使用注解的方式来完成容器中组件的注册、管理及依赖、注入等功能。

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

通过XML配置文件注入JavaBean

首先,新建一个maven项目,例如spring-annotation-learn,注意其打包方式是jar。

在maven依赖中添加:

<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,代码如下所示。

packagecom.zhz.bean;
importlombok.*;
/*** @author zhouhengzhe* @description: 实体类* @date 2022/11/4 10:12* @since v1*/@Data@AllArgsConstructor@NoArgsConstructor@Builder@ToStringpublicclassPerson {
privateStringname;
privateIntegerage;
}

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

<?xmlversion="1.0" encoding="UTF-8"?><projectxmlns="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类来进行测试,该类的代码如下所示。

packagecom.zhz;
importcom.zhz.bean.Person;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
/*** @author zhouhengzhe* @description: 测试类* @date 2022/11/4 10:15* @since v1*/publicclassMainTest {
publicstaticvoidmain(String[] args) {
ApplicationContextapplicationContext=newClassPathXmlApplicationContext("spring-bean.xml");
Personperson= (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容器中。

packagecom.zhz.config;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importcom.zhz.bean.Person;
/*** 以前配置文件的方式被替换成了配置类,即配置类==配置文件* @author zhz**/// 这个配置类也是一个组件 @Configuration// 告诉Spring这是一个配置类publicclassMainConfig {
// @Bean注解是给IOC容器中注册一个bean,类型自然就是返回值的类型,id默认是用方法名作为id@BeanpublicPersonperson() {
returnnewPerson("zhz", 20);
     }
}

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

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

packagecom.zhz;
importcom.zhz.bean.Person;
importcom.zhz.config.MainConfig;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.annotation.AnnotationConfigApplicationContext;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
/*** @author zhouhengzhe* @description: 测试类* @date 2022/11/4 10:15* @since v1*/publicclassMainTest {
publicstaticvoidmain(String[] args) {
ApplicationContextannotationConfigApplicationContext=newAnnotationConfigApplicationContext(MainConfig.class);
Personperson=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 (Stringname : namesForType) {
System.out.println(name);
}

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

packagecom.zhz;
importcom.zhz.bean.Person;
importcom.zhz.config.MainConfig;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.annotation.AnnotationConfigApplicationContext;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
/*** @author zhouhengzhe* @description: 测试类* @date 2022/11/4 10:15* @since v1*/publicclassMainTest {
publicstaticvoidmain(String[] args) {
ApplicationContextapplicationContext=newAnnotationConfigApplicationContext(MainConfig.class);
Personperson=applicationContext.getBean(Person.class);
System.out.println(person);
String[] beanNamesForType=applicationContext.getBeanNamesForType(Person.class);
for (Strings : beanNamesForType) {
System.out.println(s);
        }
    }
}


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

packagecom.zhz.config;
importcom.zhz.bean.Person;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
/*** @author zhouhengzhe* @description: todo* @date 2022/11/4 10:27* @since v1*/@ConfigurationpublicclassMainConfig {
@BeanpublicPersonperson1(){
returnnewPerson("zhz", 20);
    }
}

再次运行MainTest,发现名字变了,所以可以得知,其拿的是方法名做beanName(Bean的名字)

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

packagecom.zhz.config;
importcom.zhz.bean.Person;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
/*** @author zhouhengzhe* @description: todo* @date 2022/11/4 10:27* @since v1*/@ConfigurationpublicclassMainConfig {
/*** @Bean注解是给IOC容器中注册一个bean,类型自然就是返回值的类型,id默认是用方法名作为id*/@Bean(name="person")
publicPersonperson1(){
returnnewPerson("zhz", 20);
    }
}

运行MainTest可知:确实可以改变。

总结

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

目录
相关文章
|
Web App开发 前端开发 JavaScript
前端新利器:CSS容器查询——让组件真正“自适应
前端新利器:CSS容器查询——让组件真正“自适应
589 83
|
NoSQL 安全 Java
深入理解 RedisConnectionFactory:Spring Data Redis 的核心组件
在 Spring Data Redis 中,`RedisConnectionFactory` 是核心组件,负责创建和管理与 Redis 的连接。它支持单机、集群及哨兵等多种模式,为上层组件(如 `RedisTemplate`)提供连接抽象。Spring 提供了 Lettuce 和 Jedis 两种主要实现,其中 Lettuce 因其线程安全和高性能特性被广泛推荐。通过手动配置或 Spring Boot 自动化配置,开发者可轻松集成 Redis,提升应用性能与扩展性。本文深入解析其作用、实现方式及常见问题解决方法,助你高效使用 Redis。
1502 4
|
负载均衡 Java Nacos
Spring Cloud五大组件
Spring Cloud五大组件
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
546 0
|
存储 Java 数据库
Spring Boot 注册登录系统:问题总结与优化实践
在Spring Boot开发中,注册登录模块常面临数据库设计、密码加密、权限配置及用户体验等问题。本文以便利店销售系统为例,详细解析四大类问题:数据库字段约束(如默认值缺失)、密码加密(明文存储风险)、Spring Security配置(路径权限不当)以及表单交互(数据丢失与提示不足)。通过优化数据库结构、引入BCrypt加密、完善安全配置和改进用户交互,提供了一套全面的解决方案,助力开发者构建更 robust 的系统。
549 0
|
10月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
10月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
803 2
|
前端开发 API 开发者
harmonyOS基础- 快速弄懂HarmonyOS ArkTs基础组件、布局容器(前端视角篇)
本文由黑臂麒麟(6年前端经验)撰写,介绍ArkTS开发中的常用基础组件与布局组件。基础组件包括Text、Image、Button等,支持样式设置如字体颜色、大小和加粗等,并可通过Resource资源引用统一管理样式。布局组件涵盖Column、Row、List、Grid和Tabs等,支持灵活的主轴与交叉轴对齐方式、分割线设置及滚动事件监听。同时,Tabs组件可实现自定义样式与页签切换功能。内容结合代码示例,适合初学者快速上手ArkTS开发。参考华为开发者联盟官网基础课程。
1516 75
harmonyOS基础- 快速弄懂HarmonyOS ArkTs基础组件、布局容器(前端视角篇)
|
XML Java 数据格式
Spring IoC容器的设计与实现
Spring 是一个功能强大且模块化的 Java 开发框架,其核心架构围绕 IoC 容器、AOP、数据访问与集成、Web 层支持等展开。其中,`BeanFactory` 和 `ApplicationContext` 是 Spring 容器的核心组件,分别定位为基础容器和高级容器,前者提供轻量级的 Bean 管理,后者扩展了事件发布、国际化等功能。
428 18
|
JSON 前端开发 Java
Spring MVC 核心组件与请求处理机制详解
本文解析了 Spring MVC 的核心组件及请求流程,核心组件包括 DispatcherServlet(中央调度)、HandlerMapping(URL 匹配处理器)、HandlerAdapter(执行处理器)、Handler(业务方法)、ViewResolver(视图解析),其中仅 Handler 需开发者实现。 详细描述了请求执行的 7 步流程:请求到达 DispatcherServlet 后,经映射器、适配器找到并执行处理器,再通过视图解析器渲染视图(前后端分离下视图解析可省略)。 介绍了拦截器的使用(实现 HandlerInterceptor 接口 + 配置类)及与过滤器的区别
1262 0