SpringBoot中定义Bean的几种方式

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 本文介绍了Spring Boot中定义Bean的多种方式,包括使用@Component、@Bean、@Configuration、@Import等注解及Java配置类。每种方式适用于不同的场景,帮助开发者高效管理和组织应用组件。

引言

在Spring Boot应用程序中,定义Bean是非常常见的操作,它是构建应用程序的基础。Spring Boot提供了多种方式来定义Bean,每种方式都有其适用的场景和优势。本文将介绍Spring Boot中定义Bean的几种常见方式,包括使用@Component、@Bean、@Configuration、@Import等注解的方式,Java配置类的方式。通过深入了解这些定义Bean的方式,开发人员可以更好地利用Spring Boot框架来管理和组织应用程序中的组件。

SpingBoot中定义Bean

@Bean

Java

代码解读

复制代码

@Bean
public User getUser(){
    return new User();
}

@Bean是一个注解,用于告诉Spring框架,被注解的方法将返回一个对象,该对象将被注册为Spring应用程序上下文中的bean。在Spring应用程序中,可以使用@Bean注解来创建和配置bean,以便在应用程序中进行依赖注入和管理。被@Bean注解的方法可以包含任意的初始化逻辑和配置,以及返回一个对象实例,这个对象实例将被Spring容器管理和维护。@Bean注解通常用于配置类中的方法,用于创建和配置bean实例。

@Component

Java

代码解读

复制代码

@Component
public class TestBean {
}

@Component是Spring框架中用于标识类为Spring组件的注解。被@Component注解标识的类将被Spring自动扫描并注册为Spring应用程序上下文中的bean。这意味着这些类可以被Spring容器管理,可以进行依赖注入,可以通过@Autowired或@Resources注解进行自动装配等。@Component注解通常用于标识那些通用的**、没有特定角色的类**,例如业务逻辑类、数据访问类、工具类等。当一个类被标识为@Component时,Spring容器会自动创建该类的实例,并将其纳入到容器的管理之中。@Component注解是Spring框架中最常用的注解之一,它是实现Spring依赖注入和管理的基础。

@Controller、@RestController、@Service、@Repository

Java

代码解读

复制代码

@Controller
//@RestController
public class TestController {
    @GetMapping("/test")
    @ResponseBody
    public String test() {
        return "测试";
    }
}

@Service
public class TestService {
}

@Repository
public class TestDao {
}

@Controller是Spring框架中用于标识类为控制器的注解。被@Controller注解标识的类通常用于处理用户请求和返回相应的视图。在Spring MVC框架中,控制器类负责接收用户请求、调用业务逻辑处理、选择合适的视图进行展示等工作。被@Controller注解标识的类通常用于处理Web请求,并且可以结合@RequestMapping注解来指定处理请求的URL路径。

当一个类被标识为@Controller时,Spring框架会将其识别为控制器,并将其纳入到Spring MVC框架的管理之中。这样,该类就可以处理用户请求,并返回相应的视图。@Controller注解是Spring MVC框架中最常用的注解之一,用于标识控制器类,实现Web请求的处理和视图的返回。


@RestController是@Controller和@ResponseBody的组合注解,被@RestController注解标识的类表示该类中的方法返回的数据将直接写入HTTP响应体中,而不会进行视图解析。这意味着被@RestController注解标识的类通常用于编写RESTful风格的控制器,返回的数据可以是JSON、XML等格式的数据,而不是HTML视图。

与@Controller注解不同的是,@RestController注解不需要在每个方法上添加@ResponseBody注解来指示返回的数据写入响应体中,因为@RestController已经默认包含了@ResponseBody的功能。

总之,@RestController注解用于标识一个类为RESTful风格的控制器,用于处理HTTP请求并返回数据,而不是视图。


@Service和@Repository是Spring框架中用于标识类的注解,用于在Spring应用程序中指定类的角色和功能。

@Service注解通常用于标识业务逻辑层(service层)的类,表示该类是业务逻辑处理的组件。被@Service注解标识的类通常包含业务逻辑的处理,例如数据处理、计算、验证等。这些类通常被用于处理业务逻辑,而不是直接与数据库交互。

@Repository注解通常用于标识数据访问层(DAO层)的类,表示该类是用于数据访问和持久化的组件。被@Repository注解标识的类通常包含对数据库的访问操作,例如增删改查等数据库操作。

这两个注解的作用是告诉Spring框架被标识的类的具体功能,以便在应用程序中进行组件扫描和依赖注入。被@Service和@Repository注解标识的类可以被Spring容器管理,并且可以通过@Autowired注解进行依赖注入。

注意:如果将一个类上加上@Component注解,那它就不会被Spring识别为控制器,启动不会报错,但是访问时会报404,所以@Controller不能单纯的等价于@Component

@ControllerAdvice、@RestControllerAdvice

Java

代码解读

复制代码

@ControllerAdvice
//@RestControllerAdvice
public class TestBeanAdvice implements ResponseBodyAdvice {
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return false;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        return null;
    }
}

@ControllerAdvice是Spring MVC框架中用于全局处理异常的注解。被@ControllerAdvice注解标识的类可以用于定义全局的异常处理器,可以捕获应用程序中所有控制器抛出的异常,并进行统一的处理。


@RestControllerAdvice注解结合@ControllerAdvice和@ResponseBody的功能,用于定义全局的异常处理器,并且返回的数据将直接写入HTTP响应体中。被@RestControllerAdvice注解标识的类可以用于捕获应用程序中所有控制器抛出的异常,并进行统一的处理,同时返回的数据可以是JSON、XML等格式的数据。这样可以使异常处理更加统一和方便,并且返回的数据格式符合RESTful风格。

@Configuration

Java

代码解读

复制代码

@Configuration
public class TestConfig {
}

@Configuration是Spring框架中的注解,用于标识一个类是配置类,通常与@Bean注解一起使用,用于定义Spring应用程序的配置信息。当一个类被@Configuration注解标识时,Spring容器会将其识别为配置类,并在应用程序启动时进行加载和解析。在@Configuration类中,可以使用@Bean注解定义Spring Bean,这些@Bean注解的方法将返回一个对象,并由Spring容器进行管理和注入。

@Configuration类通常用于定义数据源、事务管理器、消息队列等与系统配置相关的内容。通过@Configuration注解,可以将应用程序的配置信息集中在一个类中,便于管理和维护。

@Import

Java

代码解读

复制代码

@SpringBootApplication
@Import(TestService.class)
public class InterviewTestApplication {
    public static void main(String[] args) {
        SpringApplication.run(InterviewTestApplication.class, args);
    }
}

@Import是Spring框架中的注解,用于在配置类中引入其他配置类或者普通的Java类。当一个类被@Import注解标识时,它可以引入其他配置类,从而将其他配置类中定义的Bean引入到当前的配置类中。

这样可以实现配置类的模块化管理,将不同功能的配置分开,提高配置类的可维护性和可读性。@Import注解还可以用于引入普通的Java类,这样可以将一些通用的Java类引入到配置类中,方便在配置类中进行使用。

BeanDefinition

Java

代码解读

复制代码

public class TestBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
        beanDefinition.setBeanClass(User.class);
        registry.registerBeanDefinition("user",beanDefinition);
    }
}

在启动类中引用

Java

代码解读

复制代码

@SpringBootApplication
@Import(TestBeanDefinitionRegister.class)
public class InterviewTestApplication {
    public static void main(String[] args) {
        SpringApplication.run(InterviewTestApplication.class, args);
    }

}

在Spring框架中,BeanDefinition是一个接口,用于描述一个bean的配置元数据。BeanDefinition中包含了bean的类名、作用域、构造函数参数、属性值、初始化方法、销毁方法等配置信息。

BeanDefinition是Spring IoC容器中用于管理bean定义的核心接口,它是Spring框架中bean工厂的基础。在Spring容器启动时,会解析配置文件或注解,将bean的配置信息解析成BeanDefinition对象,并注册到容器中。

通过BeanDefinition,Spring容器可以了解每个bean的配置信息,从而实例化和管理bean。BeanDefinition中的配置信息包括了bean的各种属性和行为,通过这些信息,Spring容器可以实例化bean、进行依赖注入、初始化和销毁bean等操作。

总结

以上就是在Spring Boot中定义Bean的多种方式,每种方式都有其适用的场景和优势。通过使用@Component、@Bean、@Configuration、@Import等注解,Java配置类,开发人员可以根据实际需求来选择合适的方式来定义Bean。了解这些定义Bean的方式有助于开发人员更好地利用Spring Boot框架来管理和组织应用程序中的组件,提高开发效率和代码质量。


转载来源:https://juejin.cn/post/7317882649276039220

相关文章
|
16天前
|
存储 人工智能 弹性计算
阿里云弹性计算_加速计算专场精华概览 | 2024云栖大会回顾
2024年9月19-21日,2024云栖大会在杭州云栖小镇举行,阿里云智能集团资深技术专家、异构计算产品技术负责人王超等多位产品、技术专家,共同带来了题为《AI Infra的前沿技术与应用实践》的专场session。本次专场重点介绍了阿里云AI Infra 产品架构与技术能力,及用户如何使用阿里云灵骏产品进行AI大模型开发、训练和应用。围绕当下大模型训练和推理的技术难点,专家们分享了如何在阿里云上实现稳定、高效、经济的大模型训练,并通过多个客户案例展示了云上大模型训练的显著优势。
|
20天前
|
存储 人工智能 调度
阿里云吴结生:高性能计算持续创新,响应数据+AI时代的多元化负载需求
在数字化转型的大潮中,每家公司都在积极探索如何利用数据驱动业务增长,而AI技术的快速发展更是加速了这一进程。
|
11天前
|
并行计算 前端开发 物联网
全网首发!真·从0到1!万字长文带你入门Qwen2.5-Coder——介绍、体验、本地部署及简单微调
2024年11月12日,阿里云通义大模型团队正式开源通义千问代码模型全系列,包括6款Qwen2.5-Coder模型,每个规模包含Base和Instruct两个版本。其中32B尺寸的旗舰代码模型在多项基准评测中取得开源最佳成绩,成为全球最强开源代码模型,多项关键能力超越GPT-4o。Qwen2.5-Coder具备强大、多样和实用等优点,通过持续训练,结合源代码、文本代码混合数据及合成数据,显著提升了代码生成、推理和修复等核心任务的性能。此外,该模型还支持多种编程语言,并在人类偏好对齐方面表现出色。本文为周周的奇妙编程原创,阿里云社区首发,未经同意不得转载。
|
9天前
|
人工智能 自然语言处理 前端开发
什么?!通义千问也可以在线开发应用了?!
阿里巴巴推出的通义千问,是一个超大规模语言模型,旨在高效处理信息和生成创意内容。它不仅能在创意文案、办公助理、学习助手等领域提供丰富交互体验,还支持定制化解决方案。近日,通义千问推出代码模式,基于Qwen2.5-Coder模型,用户即使不懂编程也能用自然语言生成应用,如个人简历、2048小游戏等。该模式通过预置模板和灵活的自定义选项,极大简化了应用开发过程,助力用户快速实现创意。
|
23天前
|
缓存 监控 Linux
Python 实时获取Linux服务器信息
Python 实时获取Linux服务器信息
|
5天前
|
人工智能 自然语言处理 前端开发
100个降噪蓝牙耳机免费领,用通义灵码从 0 开始打造一个完整APP
打开手机,录制下你完成的代码效果,发布到你的社交媒体,前 100 个@玺哥超Carry、@通义灵码的粉丝,可以免费获得一个降噪蓝牙耳机。
1597 9
|
8天前
|
云安全 人工智能 自然语言处理
|
6天前
|
人工智能 C++ iOS开发
ollama + qwen2.5-coder + VS Code + Continue 实现本地AI 辅助写代码
本文介绍在Apple M4 MacOS环境下搭建Ollama和qwen2.5-coder模型的过程。首先通过官网或Brew安装Ollama,然后下载qwen2.5-coder模型,可通过终端命令`ollama run qwen2.5-coder`启动模型进行测试。最后,在VS Code中安装Continue插件,并配置qwen2.5-coder模型用于代码开发辅助。
451 4
|
6天前
|
云安全 存储 弹性计算
|
6天前
|
缓存 Linux Docker
【最新版正确姿势】Docker安装教程(简单几步即可完成)
之前的老版本Docker安装教程已经发生了变化,本文分享了Docker最新版安装教程,其他操作系统版本也可以参考官 方的其他安装版本文档。
【最新版正确姿势】Docker安装教程(简单几步即可完成)