@Bean`注解的使用方法及其作用

简介: 本文介绍了Spring框架中`@Bean`注解的使用方法及其作用,包括如何将第三方类库加入Spring容器,配置类与`@Configuration`的配合使用,以及通过`@ConditionalOnClass`、`@ConditionalOnMissingBean`等条件注解控制Bean的加载。同时讲解了Maven父子模块间的依赖关系及配置方式,帮助开发者更好地管理项目结构与依赖注入。

@bean的理解(实质也是将第三方类库加入当前项目下的spring容器中)(使用@comment注解无法扫描因为不在同一包下)

1.作用与方法上

2.返回值是方法名(加入容器中的),可以修改

3.一般与@Configuration一起使用

@Configuration
public class OSSConfig {
    /*
    * @Bean的作用
    *    1.可以将返回值对象加入spring容器,对象别名默认就是方法名,还可以自定义别名@Bean("别名")
    *    2.方法参数对象可以从spring容器中获取对象注入
    * */
    @Bean
    public AliyunOSSOperator aliyunOSSOperator(AliyunOSSProperties aliyunOSSProperties){
        return new AliyunOSSOperator(aliyunOSSProperties);
    }
}
类名:AliyunOSSOperator
private AliyunOSSProperties aliyunOSSProperties;   //1
publicAliyunOSSOperator(){};
publicAliyunOSSOperator(AliyunOSSProperties aliyunOSSProperties)
{this.aliyunOSSProperties = aliyunOSSProperties; }
模拟第三方类库调用
理解:1.首先AliyunOSSProperties已经加入容器中了
2.通过调用AliyunOSSOperator类的有参构造器,参数因为已经加入容器,会隐式的调用注入,
3.通过返回值new出aliyunOSSOperator,加入spring boot容器,同时会给1中的aliyunOSSProperties赋值为传递过来的参数(即是容器中的aliyunOSSProperties对象)因此
    1中aliyunOSSProperties相当于已经实例化定义了一个对象



扫描第三方类库

1. @ComponentScan({"com.itheima","com.example"}) 要写全,启动类所在的包也要写,因为未写扫描路径时默认扫描启动类及其子包,写了路径按指定的扫描

2.@EnableHeaderConfig 实际上时自定义注解,通过把@Import(MyImportSelector.class)等导入类聚合在一起了,然后添加注解(B包中要使用A包自定义的依赖要把A包的jar包导入B包的pom文件不同项目下的注解


package com.itheima;
import com.example.EnableHeaderConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//加载扫描Bean方案1:
// @ComponentScan({"com.itheima","com.example"})
//加载扫描Bean方案2:@Import导入普通类
// @Import(HeaderParser.class)
//加载扫描Bean方案2:@Import导入配置类
// @Import(HeaderConfig.class)
//加载扫描Bean方案2:@Import导入 ImportSelector实现类
// @Import(MyImportSelector.class)
@EnableHeaderConfig
@SpringBootApplication
public class SpringbootWebConfigApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootWebConfigApplication.class, args);
    }
}

package com.example;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class HeaderConfig {
    //@ConditionalonClass:判断环境中是否有对应字节码文件,才注册bean到Ioc容器。
    //@ConditionalOnClass(name="com.abc.Demo")
    //@ConditionalOnMissingBean 判断环境中没有对应的bean(类型 或 名称),才注册bean到Ioc容器。
    // @ConditionalOnMissingBean
    //@ConditionalonProperty:判断配置文件中有对应属性和值,才注册bean到Ioc容器。
    @ConditionalOnProperty(name="demo",havingValue = "abc")
    @Bean
    public HeaderParser headerParser1(){
        return new HeaderParser();
    }
    // @ConditionalOnMissingBean
    // @Bean
    // public HeaderParser headerParser2(){
    //     return new HeaderParser();
    // }
    @Bean
    public HeaderGenerator headerGenerator(){
        return new HeaderGenerator();
    }
}

@ConditionalOnClass 的核心作用是确保 Bean 注册的前提是 "依赖的类存在 所以对应的条件判断应该是所依赖的类

@ConditionalOnMissingBean未显式指定typevaluename属性时,Spring 会默认以当前方法的返回类型作为匹配条件(类:类名,类名小驼峰 方法: 返回值类型,方法名)

同时指定type和那么name也不会存在重复,因为type判断返回值的类名,而name判断的则是类名的小驼峰

参数

指向目标

示例

type

指定的 Class 类型(或其实现类、子类)

@ConditionalOnMissingBean(type = DataSource.class)


检查容器中是否存在 DataSource

类型的 Bean

name

指定名称的 Bean(无论其类型)

@ConditionalOnMissingBean(name = "dataSource")


检查容器中是否存在名称为 dataSource

的 Bean

无参数

默认检查 当前方法返回类型

@ConditionalOnMissingBean


等价于 @ConditionalOnMissingBean(type = 方法返回类型.class)

参数

指向目标

示例

type

指定的 Class 类型(或其实现类、子类)

@ConditionalOnMissingBean(type = DataSource.class)


检查容器中是否存在 DataSource

类型的 Bean

name

指定名称的 Bean(无论其类型)

@ConditionalOnMissingBean(name = "dataSource")


检查容器中是否存在名称为 dataSource

的 Bean

无参数

默认检查 类中所有 @Bean

方法的返回类型

若类中有 DataSource

JdbcTemplate

两个 Bean 方法,则检查这两种类型是否存在


xml

<parent>
    <groupId>com.itheima</groupId>
    <artifactId>tlias-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <relativePath>../tlias-parent/pom.xml</relativePath>
</parent>

配置目的
当本地项目结构里存在父子模块关系时,就需要借助相对路径来定位父模块的 POM 文件。就像这里的../tlias-parent/pom.xml,意味着父模块的 POM 文件处于当前模块的上一级目录下的tlias-parent目录中。

'

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.8</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

配置目的
当使用像 Spring Boot Starter Parent 这类公共依赖时,就把<relativePath>留空或者写成<relativePath/>。这样做的意思是让 Maven 直接从本地仓库或者远程中央仓库去查找父 POM,而不是在本地项目结构里找。


针对依赖关系理解

继承关系(限定依赖的不用写版本号,可由父类指明)  (子工程3 要使用1,2工程,直接导入工程依赖即可,调用方法不用在工程3中导入依赖)

 1中的依赖,针对的是部分子类需要的,如果需要使用,就要显式的调用(即是:写出依赖)

 2中的依赖,是针对所有的子类,不用显示表明直接从父类中继承(不用写)

子工程导入依赖是 “让代码能访问第三方库”(构建层面);

第三方 Bean 导入是 “让第三方类变成 Spring 组件”(框架层面),二者是 **“先用 Maven 引入代码依赖,再用 Spring 配置 Bean”** 的递进关系。

相关文章
|
1月前
|
存储 前端开发 测试技术
IDEA 用户惊叹:API 文档还能这样一键生成?
在日常开发中,API 文档编写和维护耗时繁琐。本文介绍如何通过 Apifox IDEA 插件,一键实现接口文档的自动生成与同步,提升开发效率,优化团队协作。
|
1月前
|
负载均衡 Java Nacos
微服务架构中的服务注册与发现流程
本内容介绍了微服务架构中的服务注册与发现流程,包括服务注册中心(如Nacos)、服务提供者和调用者的角色分工。服务启动时自动注册信息至注册中心,调用者通过客户端负载均衡(如Spring Cloud Loadbalancer)选取服务实例进行远程调用。同时,内容还讲解了OpenFeign的工作原理,其作为HTTP客户端集成负载均衡,通过接口定义、代理生成、请求发送与结果解析,实现服务间的高效通信。
|
1月前
|
文字识别 算法 语音技术
基于模型蒸馏的大模型文案生成最佳实践
本文介绍了基于模型蒸馏技术优化大语言模型在文案生成中的应用。针对大模型资源消耗高、部署困难的问题,采用EasyDistill算法框架与PAI产品,通过SFT和DPO算法将知识从大型教师模型迁移至轻量级学生模型,在保证生成质量的同时显著降低计算成本。内容涵盖教师模型部署、训练数据构建及学生模型蒸馏优化全过程,助力企业在资源受限场景下实现高效文案生成,提升用户体验与业务增长。
346 23
|
1月前
|
安全 Java 应用服务中间件
spring基础
本文介绍了 Spring 与 SpringMVC 常用注解、RESTful 风格、IOC/DI 原理、Bean 作用域、自动装配流程及事务失效场景,帮助开发者深入理解 Spring 框架核心机制与常见问题。
spring基础
|
1月前
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。
|
1月前
|
SQL Java 数据库连接
事务的七种传播行为及其应用场景
本文介绍了事务的七种传播行为及其应用场景,包括 PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS、PROPAGATION_REQUIRES_NEW 等,帮助开发者理解事务管理机制。同时讲解了 Java 中 SQL 操作与对象数据不同步的问题,强调重新查询与手动管理的必要性,并说明 MyBatis 批量操作的最佳实践。
|
1月前
|
人工智能 缓存 JavaScript
Function AI 助力用户自主开发 MCP 服务,一键上云高效部署
在 AI 与云原生融合的趋势下,开发者面临模型协同与云端扩展的挑战。MCP(模型上下文协议)提供统一的交互规范,简化模型集成与服务开发。Function AI 支持 MCP 代码一键上云,提供绑定代码仓库、OSS 上传、本地交付物部署及镜像部署等多种构建方式,助力开发者高效部署智能服务,实现快速迭代与云端协同。
286 22
|
1月前
|
SQL JSON 监控
JSON 日志分析的“正确姿势”:阿里云 SLS 高效实践指南
JSON 日志因灵活易扩展而广泛应用,但其海量数据也带来分析挑战。本文系统介绍阿里云日志服务(SLS)中处理 JSON 日志的最佳实践,涵盖数据预处理、索引配置、JSON 函数使用及 SQL 智能生成,助你高效挖掘日志价值。
325 23
|
1月前
|
消息中间件 存储 安全
初始kafka
Kafka因高吞吐量被广泛使用,适合处理大量用户行为数据,支持实时推荐和数据展示。其优势包括提升响应速度、故障隔离、低耦合、流量削峰等。但也有架构复杂、依赖Broker等缺点。为避免消息丢失,可通过同步/异步发送、重试机制、设置ACK确认级别、副本机制及手动提交offset等方式保障消息可靠性。