深入理解Spring中的核心注解:@Controller、@Component、@Service、@Repository、@Configuration及其扩展

在现代Java开发中,Spring框架以其强大的依赖注入(DI)和面向切面编程(AOP)功能深受开发者喜爱。Spring提供了一系列注解来简化配置和管理Bean。本文将详细探讨Spring中的核心注解,包括@Controller@Component@Service@Repository@Configuration,以及一些扩展注解,帮助您深入理解它们的作用、用途、实例、适用场景及其背后的原理。

@Component:通用组件注解

作用@Component 是一个通用注解,用于将类标识为Spring管理的Bean。

用途:适用于任何需要被Spring容器管理的组件。

实例

@Component
public class MyComponent {// 业务逻辑
}

适用场景:当类不属于特定层(例如服务层、数据访问层)时,可以使用@Component

原理:Spring容器在启动时会扫描带有@Component注解的类,并将其实例化、配置并加入到应用上下文中。这一过程由ClassPathBeanDefinitionScanner类实现,扫描路径由@ComponentScan注解或XML配置指定。

@Service:服务层组件注解

作用@Service 用于标识服务层组件,通常包含业务逻辑。

用途:表示这是一个服务类,有助于团队协作和代码维护。

实例

@Service
public class MyService {// 业务逻辑
}

适用场景:业务逻辑处理类使用@Service注解,以明确其在应用层中的角色。

原理@Service@Component的特殊化形式,Spring扫描时将其识别为服务层组件,便于管理和维护。

@Repository:数据访问层组件注解

作用@Repository 用于标识数据访问层组件,通常用于数据库操作。

用途:提供数据访问层的异常转换机制。

实例

@Repository
public class MyRepository {// 数据库操作
}

适用场景:与数据库交互的类使用@Repository注解,以便Spring能够识别并处理数据访问层的异常。

原理@Repository@Component的特殊化形式,Spring在扫描到此注解时,会为该组件提供特定的数据访问异常处理机制。

@Controller:控制器层组件注解

作用@Controller 用于标识Spring MVC的控制器。

用途:处理HTTP请求,返回视图或数据。

实例

@Controller
public class MyController {@RequestMapping("/home")public String home() {return "home";}
}

适用场景:处理Web请求的类使用@Controller注解,以标识其为控制器组件。

原理@Controller@Component的特殊化形式,Spring MVC扫描此注解以识别控制器类,并通过HandlerMappingHandlerAdapter将请求映射到相应的方法。

@Configuration:配置类注解

作用@Configuration 用于定义配置类,包含Bean定义和配置。

用途:替代传统的XML配置文件,提供更灵活的配置方式。

实例

@Configuration
public class MyConfiguration {@Beanpublic MyBean myBean() {return new MyBean();}
}

适用场景:定义Spring配置类时使用@Configuration注解,将配置和Bean定义集中在一个类中。

原理@Configuration注解的类在Spring容器启动时会被处理,内部的@Bean注解的方法返回值会被注册为Spring容器中的Bean。这一过程由ConfigurationClassPostProcessor类实现,处理配置类中的方法并将其作为Bean定义注册到容器中。

其他扩展注解

@RestController:RESTful Web服务控制器注解

作用@RestController 组合了 @Controller@ResponseBody

用途:用于创建RESTful Web服务,方法返回值直接作为HTTP响应体。

实例

@RestController
public class MyRestController {@GetMapping("/api/data")public MyData getData() {return new MyData();}
}

适用场景:创建RESTful API的控制器使用@RestController注解,以简化响应数据的返回。

原理@RestController继承了@Controller的功能,并自动将方法返回值作为HTTP响应体返回,通过MappingJackson2HttpMessageConverter将对象转换为JSON格式。

@Bean:Bean定义注解

作用@Bean 用于方法上,声明一个Spring管理的Bean。

用途:在 @Configuration 类中定义Bean对象。

实例

@Configuration
public class AppConfig {@Beanpublic MyService myService() {return new MyService();}
}

适用场景:在配置类中定义Bean时使用@Bean注解。

原理@Bean注解的方法会被Spring容器调用,其返回值会被注册为Spring中的Bean,方法名默认为Bean的ID。Spring通过BeanDefinition对象管理这些Bean。

@ComponentScan:自动扫描组件注解

作用@ComponentScan 用于自动扫描指定包下的Spring组件。

用途:配置类或XML中使用,扫描指定包及其子包下的组件。

实例

@Configuration
@ComponentScan("com.example")
public class AppConfig {// ...
}

适用场景:自动扫描和注册组件时使用@ComponentScan注解。

原理@ComponentScan配置Spring容器扫描指定的包路径,寻找带有@Component@Service@Repository@Controller等注解的类,并自动注册为Spring Bean。由ClassPathBeanDefinitionScanner类实现扫描和注册。

@Conditional:条件注解

作用@Conditional 用于根据某些条件进行Bean的注册。

用途:有条件地创建Bean。

实例

@Configuration
public class AppConfig {@Bean@Conditional(DatabaseTypeCondition.class)public DataSource dataSource() {// 返回适合数据库类型的数据源}
}

适用场景:根据不同的条件创建特定的Bean,例如根据不同的数据库类型选择不同的数据源。

原理@Conditional注解的条件类需要实现Condition接口,定义条件逻辑。在Spring容器启动时,会根据条件类的评估结果决定是否创建并注册对应的Bean。

@Scope:Bean作用域注解

作用@Scope 用于定义Bean的作用域。

用途:指定Spring Bean的作用域,例如单例、原型等。

实例

@Component
@Scope("prototype")
public class MyPrototypeBean {// ...
}

适用场景:需要指定Bean作用域时使用@Scope注解。

原理@Scope注解定义Bean的生命周期范围。常见的作用域有单例(singleton,默认)和原型(prototype)。Spring通过ScopeMetadataScopeMetadataResolver类处理Bean作用域,根据配置的作用域类型创建和管理Bean实例。

@Lazy:懒加载注解

作用@Lazy 用于标识Bean懒加载。

用途:在第一次需要时才创建Bean。

实例

@Service
@Lazy
public class MyService {// ...
}

适用场景:需要延迟初始化Bean时使用@Lazy注解。

原理@Lazy注解在Bean定义时不会立即创建实例,只有在第一次访问该Bean时才进行实例化。Spring通过LazyInitializationExcludeFilterLazyInitializationPostProcessor类实现懒加载功能。

选择合适的注解

选择合适的注解取决于类的角色和功能:

  • 通用组件:使用@Component
  • 业务逻辑:使用@Service
  • 数据访问:使用@Repository
  • Web控制器:使用@Controller@RestController(RESTful API)。
  • 配置类:使用@Configuration

总结

Spring框架提供的这些注解极大地简化了Bean的管理和配置,使得代码更加模块化和易于维护。每个注解都有其特定的作用和原理,开发者可以根据应用需求选择合适的注解来标识和管理组件。通过深入理解这些核心注解及其扩展,可以更好地利用Spring框架的功能,提升项目的可维护性和扩展性。希望本文能帮助您更加深入地掌握Spring框架中注解的应用和原理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/36551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【智能算法应用】麻雀搜索算法在物流配送中心选址的应用(无待选配送中心)

目录 1.算法原理2.数学模型3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】麻雀搜索算法(SSA)原理及实现 2.数学模型 模型假设 待定物流配送中心的库存总能满足需求点的需求不考虑从工厂到待定物流配送中心的运输成本不考虑选定区域内待确定…

Vue 解决报错 VM6290:1 Uncaught SyntaxError: Unexpected identifier ‘Promise‘

Vue 报错 VM6290:1 Uncaught SyntaxError: Unexpected identifier ‘Promise’ 排查 控制台报了一个错误 , Uncaught SyntaxError: Unexpected identifier ‘Promise’,网上查到的方法是 缺少符号,语法写法错误,但这些都没有解决我的问题&am…

RTDETR更换优化器——Lion

RTDETR更换Lion优化器 论文:https://arxiv.org/abs/2302.06675 代码:https://github.com/google/automl/blob/master/lion/lion_pytorch.py 简介: Lion优化器是一种基于梯度的优化算法,旨在提高梯度下降法在深度学习中的优化效果…

MyBatis~配置解析, 属性(properties)、设置(settings)

注意, 对应的名称一定要相同, 比如username就要对应username, 而且如果同时使用外部配置文件和property, 优先级是外部配置文件优先级更高 设置(settings) 这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 下表描述了…

prompt:我是晚餐盲盒,只要你问出“今晚吃什么”我就将为你生成美妙的食物推荐。

使用方法:在ChatGP粘贴下面提示词模型,点击输出。然后再问“晚餐有什么好吃的?”,AI输出丰种食物供你选择。抽到什么吃什么,极大的解决选择困难的问题。 客户需要生成1000条俏皮灵动,趣味盎然,比…

基于机器学习的网页摘要生成算法的研究与实现

摘要:随着互联网的迅猛发展,网页信息量呈爆炸式增长,用户往往难以在海量信息中快速获取所需内容。因此,开发一种能够自动生成网页摘要的算法,对于提高信息检索效率具有重要意义。本文将对基于机器学习的网页摘要生成算…

pytest测试框架pytest-order插件自定义用例执行顺序

pytest提供了丰富的插件来扩展其功能,本章介绍插件pytest-order,用于自定义pytest测试用例的执行顺序。pytest-order是插件pytest-ordering的一个分支,但是pytest-ordering已经不再维护了,建议大家直接使用pytest-order。 官方文…

华为云安全防护,九河云综合分解优劣势分析

随着全球化的发展,越来越多的企业开始寻求在国际市场上扩展业务,这一趋势被称为企业出海。然而,企业在海外扩张面临诸多隐患与安全挑战,其中因为地域的不同,在安全性方面与国内相比会变得薄弱,从而导致被黑…

如何在浏览器中查看网页的HTML源代码?

如何在浏览器中查看网页的HTML源代码? 浏览html网页,查看其源代码,可以帮助我们了解该版网页的信息以及架构,每个浏览器都是允许用户查看他们访问的任何网页的HTML源代码的。以下编程狮小师妹就介绍几个常见浏览器的查看网页 HTM…

mysql安装创建数据库防止踩坑

为了安装MySQL的家人们走弯路,稍微有些啰嗦,讲述我安装的时遇到的问题,如何解决。仔细看看离成功不远。 mysql下载链接 MySQL :: Download MySQL Community Server windows下安装mysql-8.0.29-winx64,下载安装包后解压到文件夹中…

C语言 | Leetcode C语言题解之第191题位1的个数

题目: 题解: int hammingWeight(uint32_t n) {int ret 0;while (n) {n & n - 1;ret;}return ret; }

基于深度学习的文本检索

基于深度学习的文本检索 文本检索(Text Retrieval)是指在大量文本数据中,根据用户的查询文本找到相关文档。基于深度学习的方法通过提取文本的高层次语义特征,实现了高效和准确的文本检索。 深度学习在文本检索中的优势 语义理…

Windows安装jdk配置环境变量(基础)

一、下载安装JDK 下载地址:https://www.oracle.com/java/technologies/downloads/?er221886#java8-windows 因为JDK8比较稳定,所以建议选择这个。电脑32位的下载jdk-8u411-windows-i586.exe;电脑是64位的下载jdk-8u411-windows-x64.exe 1、…

链动2+1模型:驱动用户增长与业务提升的新引擎

大家好,我是吴军,来自一家业界领先的科技创新公司。在今天,我想与大家分享一个在我们业务中取得显著成果的运营策略——链动21模型,以及它是如何助力我们优化用户满意度,提高用户粘性和促进复购率的。 尽管链动模式在业…

安装Flask

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 大多数Python包都使用pip实用工具安装,使用Virtualenv创建虚拟环境时会自动安装pip。激活虚拟环境后,pip 所在的路径会被添加…

计算机组成原理——系统总线

题目:计算机使用总线结构便于增减外设,同时__C____。 A.减少了信息传送量 B.提高了信息传输速度 C.减少了信息传输线的条数 1. 总线的分类 1.1. 片内总线 芯片内部的总线 在CPU芯片内部,寄存器与寄存器之间、寄存器与逻辑单元ALU之间 1.1.1. 数据总线 双向传输总线 数…

深入解析B树:节点子节点数量的奥秘

在计算机科学中,B树是一种自平衡的树形数据结构,它能够保持数据有序,并且允许进行高效的搜索、顺序访问、插入和删除操作。B树广泛应用于数据库和文件系统的索引结构中,因为它可以有效地减少磁盘I/O操作次数。本文将深入探讨B树的…

VUE----通过nvm管理node版本

使用 NVM(Node Version Manager)来管理和切换 Node.js 版本是一个很好的选择。以下是在 苹果电脑macos系统 上使用 NVM 安装和切换 Node.js 版本的步骤: 1. 安装 NVM 如果你还没有安装 NVM,可以按照以下步骤进行安装: 打开终端,运行以下命令以下载并安装 NVM: curl …

c语言中的for循环

在C语言中,for循环是控制结构之一,用于多次执行一段代码。其具体用法如下: 语法 for (初始化表达式; 条件表达式; 更新表达式) {// 循环体 }参数说明 初始化表达式:在循环开始前执行一次,用于初始化循环控制变量。条…

BeautifulSoup解析HTML

需要解析HTML源码里面的内容&#xff0c;包含特定标签和属性 <div class"file-source"><table><tr><th align"right">Line</th><th align"right">Branch</th><th align"right">Exec…