@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”** 的递进关系。

相关文章
|
存储 算法 NoSQL
还分不清 Cookie、Session、Token、JWT?看这一篇就够了
Cookie、Session、Token 和 JWT(JSON Web Token)都是用于在网络应用中进行身份验证和状态管理的机制。虽然它们有一些相似之处,但在实际应用中有着不同的作用和特点,接下来就让我们一起看看吧,本文转载至http://juejin.im/post/5e055d9ef265da33997a42cc
52156 16
|
移动开发 Android开发 iOS开发
uniapp开发H5及app监听返回事件(以及监听不到的处理方法)
uniapp开发H5及app监听返回事件(以及监听不到的处理方法)
3582 0
|
Java
http访问springboot接口出现401 、403、 Forbidden 错误解决方法
http访问springboot接口出现401 、403、 Forbidden 错误解决方法
4042 0
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。
|
7月前
|
算法 NoSQL Java
拒绝服务雪崩!4种经典限流算法图文详解(附Java实战代码)
限流是保护系统的“保险丝”,防止突发流量导致服务雪崩。常见算法有:固定窗口(简单但有突刺)、滑动窗口(精准平滑)、漏桶(恒定处理速率)和令牌桶(允许突发,最常用)。单机限流可用计数器或Guava,分布式场景则依赖Redis实现全局控制。
1278 9
|
存储 前端开发 测试技术
IDEA 用户惊叹:API 文档还能这样一键生成?
在日常开发中,API 文档编写和维护耗时繁琐。本文介绍如何通过 Apifox IDEA 插件,一键实现接口文档的自动生成与同步,提升开发效率,优化团队协作。
|
JSON Java 数据格式
一文彻底搞懂 @RequestBody 和 @RequestParam 的区别(附实战示例)
本文深入解析Spring Boot中@RequestBody和@RequestParam的区别,通过实战示例详解两者在数据来源、格式、使用场景及验证处理上的差异,帮助开发者正确选择参数绑定方式,提升开发效率与系统安全性。
1673 0
|
负载均衡 Java Nacos
微服务架构中的服务注册与发现流程
本内容介绍了微服务架构中的服务注册与发现流程,包括服务注册中心(如Nacos)、服务提供者和调用者的角色分工。服务启动时自动注册信息至注册中心,调用者通过客户端负载均衡(如Spring Cloud Loadbalancer)选取服务实例进行远程调用。同时,内容还讲解了OpenFeign的工作原理,其作为HTTP客户端集成负载均衡,通过接口定义、代理生成、请求发送与结果解析,实现服务间的高效通信。
|
Java Shell C++
Springboot加载注入bean的方式
本文详细介绍了Spring Boot中Bean的装配方法。首先讲解了使用@Component、@Service、@Controller、@Repository等注解声明Bean的方式,并解释了这些注解之间的关系及各自适用的层次。接着介绍了通过@Configuration和@Bean注解定义Bean的方法,展示了其灵活性和定制能力。最后讨论了@Component与@Bean的区别,并提供了在Spring Boot应用中装配依赖包中Bean的三种方法:使用@ComponentScan注解扫描指定包、使用@Import注解导入特定Bean以及在spring.factories文件中配置Bean。
1298 0