Spring常用注解

2023-05-16

Spring 常用注解

Spring的一个核心功能是IOC,就是将Bean初始化加载到容器中,Bean是如何加载到容器的,可以使用Spring注解方式或者Spring XML配置方式。
Spring注解方式减少了配置文件内容,更加便于管理,并且使用注解可以大大提高了开发效率!
下面按照分类讲解Spring中常用的一些注解。

一: 组件类注解

思考:Spring怎么知道应该把哪些Java类当成bean注册到容器中呢?
答案:使用配置文件或者注解的方式进行标识需要处理的java类!

1、注解类介绍
@Component :标准一个普通的spring Bean类。

@Repository:标注一个DAO组件类。

@Service:标注一个业务逻辑组件类。

@Controller:标注一个控制器组件类。 这些都是注解在平时的开发过程中出镜率极高,@Component、@Repository、@Service、@Controller实质上属于同一类注解,用法相同,功能相同,区别在于标识组件的类型。

@Component可以代替@Repository、@Service、@Controller,因为这三个注解是被@Component标注的。如下代码

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
    String value() default "";
}


img

2、举例详解

(1)当一个组件代表数据访问层(DAO)的时候,我们使用@Repository进行注解,如下

@Repository
public class HappyDaoImpl implements HappyDao{
private final static Logger LOGGER = LoggerFactory.getLogger(HappyDaoImpl .class);
public void  club(){
        //do something ,like drinking and singing
    }
}

(2)当一个组件代表业务层时,我们使用@Service进行注解,如下

@Service(value="goodClubService")
//使用@Service注解不加value ,默认名称是clubService
public class ClubServiceImpl implements ClubService {
    @Autowired
    private ClubDao clubDao;
  
    public void doHappy(){
        //do some Happy
    }
 }

(3)当一个组件作为前端交互的控制层,使用@Controller进行注解,如下

@Controller
public class HappyController {
	@Autowired //下面进行讲解
    private ClubService clubService;
    
	// Control the people entering the Club
	// do something
}
/*Controller相关的注解下面进行详细讲解,这里简单引入@Controller*/

3、总结注意点
1、被注解的java类当做Bean实例,Bean实例的名称默认是Bean类的首字母小写,其他部分不变。@Service也可以自定义Bean名称,但是必须是唯一的! 2、尽量使用对应组件注解的类替换@Component注解,在spring未来的版本中,@Controller,@Service,@Repository会携带更多语义。并且便于开发和维护! 3、指定了某些类可作为Spring Bean类使用后,最好还需要让spring搜索指定路径,在Spring配置文件加入如下配置

<!-- 自动扫描指定包及其子包下的所有Bean类 -->
<context:component-scan base-package="org.springframework.*"/>

二:装配bean时常用的注解

1、注解介绍

@Autowired:属于Spring 的org.springframework.beans.factory.annotation包下,可用于为类的属性、构造器、方法进行注值 @Resource:不属于spring的注解,而是来自于JSR-250位于java.annotation包下,使用该annotation为目标bean指定协作者Bean。 @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作

2、举例说明

(1):@Autowired

@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, 
ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
    boolean required() default true;
}

@Controller
public class HappyController {
	@Autowired //默认依赖的ClubDao 对象(Bean)必须存在
	//@Autowired(required = false) 改变默认方式
	@Qualifier("goodClubService")
    private ClubService clubService;
    
	// Control the people entering the Club
	// do something
}


(2):@Resource

@Target({TYPE, FIELD, METHOD})
@Retention(RUNTIME)
public @interface Resource {
 String name() default "";
 Class type() default java.lang.Object.class;


public class AnotationExp {

    @Resource(name = "HappyClient")
    private HappyClient happyClient;
    
    @Resource(type = HappyPlayAno .class)
    private HappyPlayAno happyPlayAno;
}

3、总结
(1):相同点 @Resource的作用相当于@Autowired,均可标注在字段或属性的setter方法上。 (2):不同点
a:提供方 @Autowired是Spring的注解,@Resource是javax.annotation注解,而是来自于JSR-250,J2EE提供,需要JDK1.6及以上。
b :注入方式 @Autowired只按照Type 注入;@Resource默认按Name自动注入,也提供按照Type 注入;
c:属性
@Autowired注解可用于为类的属性、构造器、方法进行注值。默认情况下,其依赖的对象必须存在(bean可用),如果需要改变这种默认方式,可以设置其required属性为false。
还有一个比较重要的点就是,@Autowired注解默认按照类型装配,如果容器中包含多个同一类型的Bean,那么启动容器时会报找不到指定类型bean的异常,解决办法是结合**@Qualifier**注解进行限定,指定注入的bean名称。
@Resource有两个中重要的属性:name和type。name属性指定byName,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。
需要注意的是,@Resource如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。

d:@Resource注解的使用性更为灵活,可指定名称,也可以指定类型 ;@Autowired注解进行装配容易抛出异常,特别是装配的bean类型有多个的时候,而解决的办法是需要在增加@Qualifier进行限定。

Spring中 @Autowired注解与@Resource注解的区别

注意点:使用@Resource也要注意添加配置文件到Spring,如果没有配置component-scan

<context:component-scan> 
<!--<context:component-scan>的使用,是默认激活<context:annotation-config>功能-->

则一定要配置 annotation-config

<context:annotation-config/>

三:@Component vs @Configuration and @Bean

(省略)

四:spring MVC模块注解

1、web模块常用到的注解

  • @Controller :表明该类会作为与前端作交互的控制层组件,通过服务接口定义的提供访问应用程序的一种行为,解释用户的输入,将其转换成一个模型然后将试图呈献给用户。
@Controller
public class HappyController {
	//do something
...
}

Spring MVC 使用 @Controller 定义控制器,它还允许自动检测定义在类路径下的组件(配置文件中配置扫描路径)并自动注册。

  • @RequestMapping : 这个注解用于将url映射到整个处理类或者特定的处理请求的方法。可以只用通配符!
@Controller
@RequestMapping("/happy")
public class HappyController  {

  @Autowired
  private HappyService happyService;
  
  @RequestMapping(/hello/*)
  public void sayHello(){
		//请求为 /happy/hello/* 都会进入这个方法!
		//例如:/happy/hello/123   /happy/hello/adb
		//可以通过get/post 请求
  }
  @RequestMapping(value="/haha",method=RequestMethod.GET)
  public void sayHaHa(){
  //只能通过get请求
  }
...
}

@RequestMapping 既可以作用在类级别,也可以作用在方法级别。当它定义在类级别时,标明该控制器处理所有的请求都被映射到 /favsoft 路径下。@RequestMapping中可以使用 method 属性标记其所接受的方法类型,如果不指定方法类型的话,可以使用 HTTP GET/POST 方法请求数据,但是一旦指定方法类型,就只能使用该类型获取数据。

@RequestParam :将请求的参数绑定到方法中的参数上,有required参数,默认情况下,required=true,也就是改参数必须要传。如果改参数可以传可不传,可以配置required=false。

 @RequestMapping("/happy")
  public String sayHappy(
  @RequestParam(value = "name", required = false) String name,
  @RequestParam(value = "age", required = true) String age) {
  //age参数必须传 ,name可传可不传
  ...
  }

  • @PathVariable : 该注解用于方法修饰方法参数,会将修饰的方法参数变为可供使用的uri变量(可用于动态绑定)。
@RequestMapping(value="/happy/{dayid}",method=RequestMethod.GET)
public String findPet(@PathVariable String dayid, Model mode) {
//使用@PathVariable注解绑定 {dayid} 到String dayid
}

@PathVariable中的参数可以是任意的简单类型,如int, long, Date等等。Spring会自动将其转换成合适的类型或者抛出 TypeMismatchException异常。当然,我们也可以注册支持额外的数据类型。
@PathVariable支持使用正则表达式,这就决定了它的超强大属性,它能在路径模板中使用占位符,可以设定特定的前缀匹配,后缀匹配等自定义格式。

  • @RequestBody : @RequestBody是指方法参数应该被绑定到HTTP请求Body上。
@RequestMapping(value = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body,@RequestBody User user){
   //可以绑定自定义的对象类型
}

  • @ResponseBody : @ResponseBody与@RequestBody类似,它的作用是将返回类型直接输入到HTTP response body中。
    @ResponseBody在输出JSON格式的数据时,会经常用到。
@RequestMapping(value = "/happy", method =RequestMethod.POST)
@ResponseBody
public String helloWorld() {    
return "Hello World";//返回String类型
}

@RestController :控制器实现了REST的API,只为服务于JSON,XML或其它自定义的类型内容,@RestController用来创建REST类型的控制器,与@Controller类型。@RestController就是这样一种类型,它避免了你重复的写@RequestMapping与@ResponseBody。

@ModelAttribute :@ModelAttribute可以作用在方法或方法参数上,当它作用在方法上时,标明该方法的目的是添加一个或多个模型属性(model attributes)。
该方法支持与@RequestMapping一样的参数类型,但并不能直接映射成请求。控制器中的@ModelAttribute方法会在@RequestMapping方法调用之前而调用。

@ModelAttribute方法有两种风格:一种是添加隐形属性并返回它。另一种是该方法接受一个模型并添加任意数量的模型属性。用户可以根据自己的需要选择对应的风格。

五:Spring事务模块注解

1、常用到的注解

在处理dao层或service层的事务操作时,譬如删除失败时的回滚操作。使用**@Transactional** 作为注解,但是需要在配置文件激活

<!-- 开启注解方式声明事务 -->
    <tx:annotation-driven transaction-manager="transactionManager" />

2、举例

@Service
public class CompanyServiceImpl implements CompanyService {
  @Autowired
  private CompanyDAO companyDAO;

  @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = Exception.class)
  public int deleteByName(String name) {

    int result = companyDAO.deleteByName(name);
    return result;
  }
  ...
}

————————————————
版权声明:本文为CSDN博主「阿飞云」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010648555/article/details/76299467

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring常用注解 的相关文章

  • Python库的安装问题

    Python库的安装问题 所遇问题与解决方式安装版本 1 Pycharm安装gdal库失败1 1 错误一 xff1a 缺少VC 43 43 14环境1 2 错误二 xff1a 安装VC 43 43 14 0后 xff0c 再在pycharm
  • 转JSON时去除指定属性、JSONArray和JSONObject的顺序变化问题

    一 转JSON时去除指定属性 span class token comment 方法一 xff1a 遍历循环 xff0c 使用remove去除JSON属性 span JSONArray jsonList span class token o
  • java书城登录注册查询 原生servlet实现

    java书城登录注册查询 原生servlet实现 前言一 项目功能二 项目实现方法1 项目结构 总结图片展示结语另外 文章目录 前言一 项目功能二 项目实现方法1 项目结构 总结图片展示结语另外 前言 本人是一位破烂专科的大二学生 xff0
  • shell 美化工具(oh my posh)

    Chat 最近放寒假了 xff0c 这几天在学习小程序与go xff0c 然后经常逛github xff0c 看一些go的项目 xff0c 然后发现一个由go写的项目 xff0c 非常的不错 xff0c 它叫oh my posh xff0c
  • linux twm_回到TWM Linux桌面基础知识

    linux twm TWM是最不起眼的窗口管理器 xff0c 类似于您购买相框时获得的那些样本照片 Xorg随X11 Windows系统一起提供的基本的 xff0c 几乎是最低限度的概念证明 xff0c 可以证明确实可以为图形用户界面 xf
  • sequelize 爬坑【2】 Op 相关操作合集【转】

    const Op span class token operator 61 span Sequelize span class token punctuation span Op span class token punctuation s
  • Spring框架入门

    文章目录 Spring第1章 简介 61 61 1 1 Spring概述 61 61 Spring的下载地址1 3 Spring模块 61 61 Spring框架分为五大模块 xff1a 61 61 1 4 HelloWorld 61 61
  • 小米笔试真题一

    小米笔试真题一 第一题第二题第三题第四题第五题第六题第七题第八题第九题第十题第十一题第十二题第十三题总结 第一题 下述算法的时间复杂度为 xff08 xff09 A O log2n B O n C O nlog2n D O n 2 span
  • C语言数组专题训练

    C语言数组专题训练 第一题第二题第三题第四题第五题第六题第七题第八题第九题第十题第十一题 第一题 若有语句char s1 10 s2 10 61 books xff1b 则能将字符串 books 存放到数组 s1 的正确语句是 A strc
  • 逻辑结构与物理结构

    逻辑结构与物理结构 逻辑结构集合结构线性结构树形结构图形结构 物理结构 逻辑结构 简单的来说 xff0c 逻辑结构就是数据之间的关系 逻辑结构常见有四种类型 xff1a 集合结构 xff0c 线性结构 xff0c 树形结构 xff0c 图形
  • 乐鑫面试流程

    乐鑫面试流程 面试岗位笔试技术面试HR面电话聊天发offer 面试岗位 嵌入式软件实习生 笔试 题目分为选择题和编程题 xff0c 选择题二十题 xff0c 编程题两题 xff1b 选择题基本是一些计算机相关基础知识 xff0c 比较简单
  • 全局变量和静态变量的初始化

    全局变量和静态变量的初始化 全局变量 static变量初始化时间静态局部变量全局变量 不要写出和编译顺序相关的程序总结 全局变量 static变量初始化时间 静态局部变量 首先 xff0c 静态局部变量和全局变量一样 xff0c 数据都存放
  • 不同操作系统及CPU字长、寻址能力、指针宽度的理解

    不同操作系统及CPU字长 寻址能力 指针宽度的理解 字长CPU位宽CPU的寻址能力操作系统32bit 64bit指针大小 字长 64位CPU和32位CPU中64和32的含义 xff1a 64和32指的是CPU中的寄存器 通用 的字长 xff
  • new和malloc的区别

    new和malloc的区别 1 new从自由存储区上分配内存 xff0c malloc从堆上分配内存 自由存储区是C 43 43 基于new操作符的一个抽象概念 xff0c 凡是通过new操作符进行内存申请 xff0c 该内存即为自由存储区
  • 程序中的负数存储及类型转换

    程序中的负数存储及类型转换 负数在计算机中怎样存储什么是原码 反码 补码为什么要设置反码 xff0c 补码剖析本质 C语言数据类型转换 xff08 自动类型转换 43 强制类型转换 xff09 自动类型转换强制类型转换类型转换只是临时性的自
  • Java Collections singleton()方法与示例

    集合类singleton 方法 Collections Class singleton method singleton method is available in java util package singleton 方法在java
  • 找素数问题

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • 嵌入式面试题

    面试题 字符串能直接比较大小吗typedef定义数组类型用法 字符串能直接比较大小吗 C 43 43 中字符串分两种 xff0c 一种是C语言的字符串 xff0c 一种是string字符串 C语言字符串是不可以直接比较大小的 xff0c s
  • 解决Endnote插入参考文献时导致word闪退问题

    问题描述 xff1a 通过endnote插入参考文献时 xff0c 会使得word闪退 原因分析 有像域代码之类的交互 xff0c 与endnote冲突 解决方法把word文档clean下 xff0c 即将域代码删除 解决方法 Ctrl 4
  • 音视频基础

    音视频基础 写在前面基础概念音视频直播推流和拉流什么是推流什么是拉流推流和拉流的区别 协议层 封装格式层 编解码层 像素层RTP RTCP RTMP RTSP区别RTP Real time Transport Protocol 实时传输协议

随机推荐

  • 回车和换行的区别

    回车和换行的区别 回车和换行的概念不同的系统间传递文件会涉及格式的转换Unix gt WindowsUnix lt Windows 回车和换行的概念 首先介绍一下 回车 xff08 carriage return r xff09 和 换行
  • 强大的PubMed插件Scholarscope

    强大的PubMed插件Scholarscope 学术基础 SCI分区什么是Pubmed什么是ScholarscopeScholarscope在不同浏览器下安装指南插件使用 学术基础 SCI分区 SCI是有两个分区 一个是JCR的划分 一般称
  • 反客STM32F4核心板DAP无法下载程序解决

    反客STM32核心板DAP无法下载程序解决 问题解决 问题 反客STM32F407ZGT6核心板使用反客的DAP下载器下载程序 xff0c 无法识别下载器 xff0c 说明下载器没有正常工作 xff08 这里是已经换过杜邦线了 xff0c
  • 有人物联网485转网口模块网口调试助手1035未知错误

    有人物联网485转网口模块网口调试助手1035未知错误 问题解决 问题 项目使用有人物联网485转网口模块USR TCP232 304 xff0c 将模块接入实验室路由器 xff0c IP地址设置为动态IP xff0c 路由器上查得IP为1
  • 1.半导体基础知识

    1 半导体基础知识 本征半导体什么是半导体 xff1f 什么是本征半导体 xff1f 本征半导体的结构本征半导体中的两种载流子为什么将自然界导电性能中等的半导体材料制成本征半导体 杂质半导体N型半导体P型半导体 PN结PN结中的扩散运动漂移
  • 2.半导体二极管

    2 半导体二极管 二极管的组成二极管和PN结伏安特性的区别二极管的伏安特性及电流方程为什么反向饱和电流越小 xff0c 单向导电性能越强 二极管的等效电路二极管的主要参数稳压二极管 xff08 又称齐纳二极管或反向击穿二极管 xff09 稳
  • Python | 从另一个列表的指定开始到结束索引创建一个列表

    Given a list start and end index we have to create a list from specified index of the list in Python 给定一个列表 xff0c 开始和结束索
  • EDA基础概念

    EDA基础概念 EDA和CADCAD工具EDA工具 EDA技术实现目标可编程逻辑器件简称PLD发展历程CPLD简介FPGA简介FPGA和CPLD区别是否需要同时学习FPGA和CPLDXilinx xff08 赛灵思 xff09 公司介绍 x
  • 半导体存储电路

    半导体存储电路 SR锁存器和触发器寄存器存储器存储器分类RAMSRAMDRAM ROMMROMPROMEPROMEEPROMFLASH原理发现者应用工作原理存储单元 磁盘硬盘机械硬盘 xff08 HDD xff09 固态硬盘 xff08 S
  • python编写简单的EXE启动器

    exe启动器 放假到现在一直憋在家里 xff0c 最近实在无聊 xff0c 就下了两个游戏玩 xff0c 玩的时候 xff0c 因为快捷方式放桌面感觉有点麻烦 xff0c path文件下图标有太多 xff0c 就想起了自己编写一个exe启动
  • mysql的left join和inner join的详细用法

    join用法 1 inner join xff0c 内连接 显示两个表中有联系的所有数据 2 left join xff0c 左链接 以左表为参照 显示所有数据 右表中没有则以null显示 3 right join xff0c 右链接 以右
  • 原来我的Ubuntu20.04桌面假死,按Alt+Ctrl+F1就可以恢复!

    配置 联想Y9000PUbuntu20 04双系统显卡驱动 NVIDIA Linux x86 64 525 89 02 xff08 下载自官网 xff09 浏览器 Edge 问题 双系统使用过一段时间之后 xff0c 偶尔会出现桌面假死的情
  • 如何查看python安装路径

    在使用python的时候 xff0c 有时候会需要找到python包的安装位置 xff0c 来找其他安装的第三方包 下面我们来看看 xff0c 在不同平台上 xff0c 怎么找到python的安装路径 很多运行的系统软件都是建立在pytho
  • ftp文件操作

    FTP中的文件操作 如何对ftp文件系统进行操作 文章目录 FTP中的文件操作前言一 ftp是什么 xff1f 二 使用步骤1 本地创建搭建ftp系统2 操作 总结 前言 公司中运用到了ftp小文件系统 xff0c 自己在本地学习了一下网上
  • 有向图的强联通分量(Tarjan算法)

    连通分量 在一个有向图G中的子图中V xff0c 对于任意两个点 u xff0c v u xff0c v u xff0c v 来说 xff0c 如果 u
  • 关于ResultMapException和SQLException: Invalid value for getInt()的解决方法

    mybatis中的Cause java sql SQLException Invalid value for getInt 39 xx 异常处理 org span class token punctuation span apache sp
  • Linux 终端美化

    Linux 终端美化 文章目录 Linux 终端美化1 安装zsh2 安装oh my zsh3 修改主题 4 配置 powerlevel10k5 插件安装 1 安装zsh span class token function apt span
  • vc++ 二进制文件的查找_在C ++中查找表示二进制数所需的总位数

    vc 43 43 二进制文件的查找 Problem statement 问题陈述 xff1a Find total Number of bits required to represent a number in binary 查找以二进制
  • 微信小程序 onLoad 和 onShow的区别

    onLoad 和 onShow的区别 onLoad 一个页面只会调用一次 接收页面参数 可以获取wx navigateTo和wx redirectTo及中的 query xff08 通俗点就是 你编辑好代码后 点击保存 这时候整个程序加载
  • Spring常用注解

    Spring 常用注解 Spring的一个核心功能是IOC xff0c 就是将Bean初始化加载到容器中 xff0c Bean是如何加载到容器的 xff0c 可以使用Spring注解方式或者Spring XML配置方式 Spring注解方式