Spring常见注解

news2025/1/12 9:46:45

普通CURD框架结构

1@controller 控制器(注入服务)
用于标注控制层,相当于struts中的action

2@service 服务(注入dao
用于标注服务层,主要用来进行业务的逻辑处理

3@repository/@Mapper(实现dao访问)
用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件.

4@component (把普通pojo实例化到spring容器中,相当于配置文件中的 <bean id="" class=""/>
泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller@Services等的时候),我们就可以使用@Component来标注这个类。

Spring注解

1.    组件类注解

思考:Spring怎么知道应该把哪些Java类当成bean注册到容器中呢?

答案:使用配置文件或者注解的方式进行标识需要处理的java类!
 

@Repository、@Service、@Controller,它们分别对应存储层Bean,业务层Bean,和展示层Bean。

Spring 自 2.0 版本开始,陆续引入了一些注解用于简化 Spring 的开发。@Repository注解便属于最先引入的一批,它用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean。具体只需将该注解标注在 DAO类上即可。同时,为了让 Spring 能够扫描类路径中的类并识别出 @Repository 注解,需要在 XML 配置文件中启用Bean 的自动扫描功能,这可以通过<context:component-scan/>实现。如下所示:

// 首先使用 @Repository 将 DAO 类声明为 Bean

 package bookstore.dao;

 @Repository

 public class UserDaoImpl implements UserDao{ …… }

 // 其次,在 XML 配置文件中启动 Spring 的自动扫描功能

 <beans … >

    ……

 <context:component-scan base-package=”bookstore.dao” />

……

 </beans>

如此,我们就不再需要在 XML 中显式使用 <bean/> 进行Bean 的配置。Spring 在容器初始化时将自动扫描 base-package 指定的包及其子包下的所有 class文件,所有标注了 @Repository 的类都将被注册为 Spring Bean。

为什么 @Repository 只能标注在 DAO 类上呢?这是因为该注解的作用不只是将类识别为Bean,同时它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型。 Spring本身提供了一个丰富的并且是与具体的数据访问技术无关的数据访问异常结构,用于封装不同的持久层框架抛出的异常,使得异常独立于底层的框架。

Spring 2.5 在 @Repository的基础上增加了功能类似的额外三个注解:@Component、@Service、@Controller,它们分别用于软件系统的不同层次:

  • @Component 是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次。
  • @Service 通常作用在业务层,但是目前该功能与 @Component 相同。
  • @Controller 通常作用在控制层,但是目前该功能与 @Component 相同。

也就是说,@Component可以代替@Repository、@Service、@Controller,因为这三个注解是被@Component标注的。这四个注解均可将类标识为bean。

通过在类上使用 @Repository、@Component、@Service 和 @Controller 注解,Spring 会自动创建相应的 BeanDefinition 对象,并注册到 ApplicationContext 中。这些类就成了 Spring 受管组件。@Component、@Service 和 @Controller这三个注解除了作用于不同软件层次的类,其使用方式与 @Repository 是完全相同的。
  

 a. @Component
标注一个普通的Spring Bean类
表示一个带注解的类是一个“组件”,成为Spring管理的Bean。当使用基于注解的配置和类路径扫描时,这些类被视为自动检测的候选对象。同时@Component还是一个元注解(注解其他注解)
虽然我们可以通过 @Autowired 或 @Resource 在 Bean 类中使用自动注入功能,但是 Bean 还是在 XML 文件中通过 <bean> 进行定义 —— 也就是说,在 XML 配置文件中定义 Bean,通过@Autowired 或 @Resource 为 Bean 的成员变量、方法入参或构造函数入参提供自动注入的功能。能否也通过注解定义 Bean,从 XML 配置文件中完全移除 Bean 定义的配置呢?答案是肯定的,我们通过 Spring 2.5 提供的@Component 注解就可以达到这个目标了。

 b. @Repository
标注一个DAO组件类。
当一个组件代表数据访问层(DAO)的时候,我们使用@Repository进行注解

为什么 @Repository 只能标注在 DAO 类上呢?
这是因为该注解的作用不只是将类识别为 Bean,同时它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型。 Spring 本身提供了一个丰富的并且是与具体的数据访问技术无关的数据访问异常结构,用于封装不同的持久层框架抛出的异常,使得异常独立于底层的框架。

如下

@Repository

public class HappyDaoImpl implements HappyDao{

private final static Logger LOGGER = LoggerFactory.getLogger(HappyDaoImpl .class);

public void  club(){

        //do something ,like drinking and singing

    }

}

 

 c. @Service
目前该功能与 @Component 相同。
当一个组件代表业务层时,我们使用@Service进行注解,如下

@Service(value="goodClubService")

//使用@Service注解不加value ,默认名称是clubService

public class ClubServiceImpl implements ClubService {

    @Autowired

    private ClubDao clubDao;

    public void doHappy(){

        //do some Happy

    }

 }

 

 d. @Controller
标注一个控制器组件类。
但是目前该功能与 @Component 相同。
当一个组件作为前端交互的控制层,使用@Controller进行注解


 

2.  注意点

a.    被注解的java类当做Bean实例,Bean实例的名称默认是Bean类的首字母小写,其他部分不变。@Service也可以自定义Bean名称,但是必须是唯一的!

b.    指定了某些类可作为Spring Bean类使用后,最好还需要让Spring搜索指定路径,在Spring配置文件加入如下配置:

<!-- 自动扫描指定包及其子包下的所有Bean类 -->

<context:component-scan base-package="org.springframework.*"/>

 

3.    装配bean时常用的注解

1)共同点

两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。

2)不同点

@Autowired

@AutowiredSpring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作。只按照byType注入。

@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。

如果容器中包含多个同一类型Bean,那么启动容器时会报找不到指定类型bean的异常,解决办法是结合@Qualified注解进行限定,指定注入的bean名称。如下:

   @Controller

public class HappyController {

    @Autowired //默认依赖的ClubDao 对象(Bean)必须存在

    //@Autowired(required = false) 改变默认方式,允许null值,即依赖的ClubDao 对象(Bean)可以不存在

    @Qualifier("goodClubService")

    private ClubService clubService; 

    // Control the people entering the Club

    // do something

}
         @Resource

@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource@Resource有两个重要的属性:nametype,而Spring@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。

所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。

注:最好是将@Resource放在setter方法上,因为这样更符合面向对象的思想,通过setget去操作属性,而不是直接去操作属性。

@Resource装配顺序:

  • 如果同时指定了nametype,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
  • 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
  • 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
  • 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
  • name属性指定byName,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。
  • @Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。

    3)注意点

                              @Resource要注意添加配置文件到Spring

<context:component-scan>

<!--<context:component-scan>的使用,是默认激活<context:annotation-config>功能-->
如果没有配置component-scan,则一定要配置 annotation-config
<context:annotation-config/>

推荐使用:@Resource注解在字段上,且这个注解是属于J2EE的,减少了与spring的耦合。最重要的这样代码看起就比较优雅。

4.    java配置

            a.  @Bean

主要用于方法上,有点类似于工厂方法,当使用了@Bean注解,我们可以连续使用多种定义bean时用到的注解,譬如用@Qualifier注解定义工厂方法的名称。

 

b. @Scope
注解在类上

   
 

c. 使用@Configuration 来注解类表示类可以被 Spring 的 IoC 容器所使用,作为 bean 定义的资源。
@Configuration

public class AppConfig {

    @Bean

    public MyService myService() {

        return new MyServiceImpl();

    }

}

 

d. @Component & @Configuration

@Configuration Indicates that a class declares one or more @Bean methods and may be processed by the Spring container to generate bean definitions and service requests for those beans at runtime

 

@Component Indicates that an annotated class is a "component". Such classes are considered as candidates for auto-detection when using annotation-based configuration and classpath scanning.

 

@Configuration is meta-annotated with @Component, therefore @Configuration classes are candidates for component scanning

 

e.  举例
 

 

第一个代码正常工作,正如预期的那样,SimpleBeanConsumer将会得到一个单例SimpleBean的链接。第二个配置是完全错误的,因为Spring会创建一个SimpleBean的单例bean,但是SimpleBeanConsumer将获得另一个SimpleBean实例(也就是相当于直接调用new SimpleBean() ,这个bean是不归Spring管理的),既new SimpleBean() 实例是Spring上下文控件之外的。

 

main difference is that when annotated class with @Configuration @Bean annotated methods are proxy using CGLIB which made in code calls after the first one to return bean from context instead of execute method again and create another instance as happens when using @Component with @Bean

 

使用@configuration,所有标记为@bean的方法将被包装成一个CGLIB包装器,如果第一次调用该方法,那么原始方法的主体将被执行,最终的对象将在spring上下文中注册。所有进一步的调用只返回从上下文检索的bean。

在上面的第二个代码块中,新的SimpleBeanConsumer(simpleBean())只调用一个纯java方法。为了纠正第二个代码块,我们可以这样做
 

 

 5.    Spring IoC

    spring ioc的实现原理,实际上就是简单工厂+sax解析xml+反射获取类对象

     

    对于BeanFactory中,我们如下做:

    public class BeanFactory{

        public Object getBean(String beanName){

            // 反射 + 解析配置文件

            return Class.forName("类名").new Instance();

        }

    }

通过id,我们通过解析spring配置文件解析到id所对应的类,然后获取全名,通过反射创建类。这样,我们    想获得bean,不需要修改代码,只需要新增类,然后再在配置文件中配置一下。

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

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

相关文章

25.前端笔记-CSS-溢出的文字省略号展示

1、单行文本溢出显示省略号 满足条件&#xff1a; &#xff08;1&#xff09;先强制一行内显示文本 white-space:nowrap;/*默认不写&#xff0c;或值是normal自动换行*/) &#xff08;2&#xff09;超出的部分隐藏 overflow:hidden; &#xff08;3&#xff09;文字用省略号代…

ESPnet-SE 开源工具介绍

下面是我们整理的钱彦旻教授、张王优、李晨达在第二届SH语音技术研讨会和第七届Kaldi技术交流会的报告内容&#xff0c;如果有误&#xff0c;欢迎指正。 基本情况 今天我们主要是围绕ESPnet-SE这个工具做一个简单的介绍&#xff0c;我会大概讲一下ESPnet-SE的情况&#xff0c;…

一文了解宏内核和微内核

【推荐阅读】 纯干货&#xff0c;linux内存管理——内存管理架构&#xff08;建议收藏&#xff09; 轻松学会linux下查看内存频率,内核函数,cpu频率 一文了解Linux内核的Oops 一篇长文叙述Linux内核虚拟地址空间的基本概括 需要多久才能看完linux内核源码&#xff1f; 内核是操…

微信小程序第五篇:页面弹出效果及共享元素动画

系列文章传送门&#xff1a; 微信小程序第一篇&#xff1a;自定义组件详解 微信小程序第二篇&#xff1a;七种主流通信方法详解 微信小程序第三篇&#xff1a;获取页面节点信息 微信小程序第四篇&#xff1a;生成图片并保存到手机相册 目录 一、page-caontainer 实现假页弹出 …

LDP协议介绍

LDP介绍 1.LDP协议概述 LDP&#xff08;Label Distribution Protocol&#xff09;规定了标签分发过程中的各种消息以及相关的处理过程。LSR之间将依据本地转发表中对应于一个特定FEC的入标签、下一跳节点、出标签等信息联系在一起&#xff0c;从而形成标签交换路径LSP。 2.L…

【Python恶搞】Python实现祝福单身狗的恶搞项目,快发给你的怨种大兄弟 | 附源码

前言 halo&#xff0c;包子们上午好 咱就说&#xff0c;谁还没有一个单身的小伙伴呢 今天这个代码主要是为了祝福咱们单身的小伙伴 咱就说废话不多说&#xff0c;直接上才艺 相关文件 关注小编&#xff0c;私信小编领取哟&#xff01; 当然别忘了一件三连哟~~ 公众号&#x…

Kali Linux 又更新了!202.4新版本有哪些变化?

Kali Linux在今年最后一个月迎来了新版本&#xff0c;即2022.4&#xff0c;上次更新是在8月份&#xff0c;时隔4个月&#xff0c;Kali linux 又有哪些新变化呢&#xff1f; 更新内容&#xff1a; Microsoft Azure - Kali 已添加到 Microsoft Azure&#xff0c;但目前没有图形…

阿里云效 ssh公钥配置

准备工作 通过 SSH 协议在 Git 命令行访问 Codeup&#xff0c;需要具备以下几点&#xff1a; 本机已安装Git&#xff08;安装教程参见安装Git&#xff09;并保证版本大于1.9&#xff08;通过git --version可获取本地的版本&#xff09;&#xff1b; 本机需要安装OpenSSH客户端…

智能学习 | MATLAB实现Bee-CNN蜜蜂算法优化卷积神经网络图像分类预测

智能学习 | MATLAB实现Bee-CNN蜜蜂算法优化卷积神经网络图像分类预测 目录 智能学习 | MATLAB实现Bee-CNN蜜蜂算法优化卷积神经网络图像分类预测分类效果基本介绍模型参数程序设计参考资料分类效果 基本介绍 Bee-CNN蜜蜂算法优化卷积神经网络是一种模糊进化深度学习(优化权重和…

银行测试的优势在哪里?

为什么做金融类软件测试举个栗子&#xff0c;银行里的软件测试工程师。横向跟互联网公司里的测试来说&#xff0c;薪资相对稳定&#xff0c;加班少甚至基本没有&#xff0c;业务稳定。实在是测试类岗位中的香饽饽&#xff01;一、什么是金融行业金融业是指经营金融商品的特殊行…

液晶屏显示IC 可调式三通道TFT、LCD DC/DC升压转换器AAT1118 液晶面板双通道电荷泵电源IC AAT1118

液晶屏显示IC 可调式三通道TFT、LCD DC/DC升压转换器AAT1118 TFT LCD液晶面板双通道电荷泵电源IC AAT1118 概述 AAT1118集成了一个升压调节器&#xff0c;两个调节电荷泵&#xff0c;一个关闭功能&#xff0c;和一个开漏电源良好的输出&#xff0c;使其成为TFT液晶面板供电的…

逆行而上 光照前方 | 记“齐鲁之战”11月第一单签约者—郭群策

白玉兰品牌于2018年正式启航&#xff0c;白玉兰也与上海市花同名&#xff0c;作为国内四大名花之一&#xff0c;更具有品牌的标识性。品牌发展至今四年&#xff0c;三年是疫情期&#xff0c;但白玉兰酒店仍然成为目前锦江酒店&#xff08;中国区&#xff09;体系内发展最快的品…

Linux系统中裸机定时器的基本原理

大家好&#xff0c;今天的话主要和大家聊一聊&#xff0c;如何使用定时器&#xff0c;完成精准的定时功能实现​。 目录 第一​&#xff1a;EPIT定时器基本简介 ​第二&#xff1a;EPIT的基本配置 ​第三&#xff1a;代码的具体实现 第一​&#xff1a;EPIT定时器基本简介 ​…

【UE4】引擎配置文件原理学习笔记

刚好遇到一个ini加载的优化。趁此机会记录学习一下UE引擎的config文件层级结构和读取流程 文章目录两个问题层级结构文件读取流程初始化流程文件读取流程文件的写入配置文件内容和GConfig结构两个问题 在看项目目录结构的时候&#xff0c;有没有这样的疑问&#xff1a; 为什么…

喜报!泛睿云国家版权局颁发的软件著作权证书

近日,泛睿云自主研发的泛睿云计算服务平台V1.0,通过中国人民共和国国家版权局权威授权,获得了计算机软件著作权登记证书,这是对泛睿云实力和研发水平的充分肯定。 软件著作权是企业核心自主知识产权,是企业的“无形资产”,是企业科技的生命力和价值所在,国家权威部门的认证将使…

微信群裂变文案微信群裂变软件

看过前几篇文章的&#xff0c;想必多多少少都清楚微信群裂变以及朋友圈裂变能够带来的巨大能量&#xff1a;低成本获客&#xff0c;高质量传播。那今天就来分享微信群以及微信朋友圈裂变话术&#xff0c;满满都是干货&#xff0c;新手一定要看仔细咯。今天的内容主要讲的有三点…

亲测有效!咳嗽3秒检测新冠的小·程·序;开源啦!超全的AI创作工具网站;谷歌乳腺癌AI筛查进入临床实践;根据文字生成音乐 | ShowMeAI资讯日报

&#x1f440;日报合辑 | &#x1f3a1;AI应用与工具大全 | &#x1f514;公众号资料下载 | &#x1f369;韩信子 &#x1f4e2; 『Thinkit声音识别』亲测有效&#xff01;新冠病毒咳嗽声检测小程序 一款名为“Thinkit声音识别”的微信小程序&#xff0c;实现通过声音识别新冠…

c#入门-可为空的注释上下文

null 一个经典的问题&#xff0c;字符串的“”和null有什么区别。 string s null; string s2 ""; Console.WriteLine(s); Console.WriteLine(s2);虽然看起来&#xff0c;他们都没有储存实际数据。 区别在于&#xff0c;“”相当于买了0个月饼。别人发了个空盒子过…

编译原理:词法分析

参考视频&#xff1a;方舟编译技术入门与实战 以及 西交冯博琴老师的相关视频 编译的过程包括 词法分析&#xff08;分析程序符号&#xff09;、语法分析&#xff08;分析语法单位&#xff09;、中间代码生成、代码优化和目标代码生成。该架构自1960s之后基本未变。 一、编译过…