面向注解编程—Spring 注解看这一篇就够了

面向注解编程—Spring 注解大全之IOC篇

Spring的一个核心功能是IOC,就是将Bean初始化加载到容器中,调用的时候直接注入即可,使用注解可以大大提高了开发效率!。

Bean英文意为 豆子 理解起来就是豆荚里的豌豆,豆荚就是Spring 容器。

声明为组件 的注解

以如下开发结构为例:
在这里插入图片描述

@Component :标准一个普通的spring Bean类,可以自己写的😎。

@Repository:标注一个DAO组件类,即对数据操作的组件。

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

@Controller:标注一个控制器组件类。

@Repository,@Service,@Controller 分别对应Spring 框架的 mapper包、service包和controller包,同时这三个注解也可以被@Component替代,因为这三个的源码都是被@Component标注的。如下:

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

Controller层:

@RestController //@RestController = @Controller + @ResponseBody
public class EmpController {@Autowired //运行时,从IOC容器中获取该类型对象,赋值给该变量private EmpService empService ;@RequestMapping("/listEmp")public Result list(){//1. 调用service, 获取数据List<Emp> empList = empService.listEmp();//3. 响应数据return Result.success(empList);}
}

Service层:

@Service
public class EmpServiceA implements EmpService {@Autowired //运行时,从IOC容器中获取该类型对象,赋值给该变量private EmpDao empDao ;@Overridepublic List<Emp> listEmp() {//具体实现}

Dao层:

@Repository
public class EmpDaoA implements EmpDao {@Overridepublic List<Emp> listEmp() {List<Emp> empList = empDao.listEmp();//具体实现}
}

同时要使用四大注解声明的bean,还需要被组件扫描注解**@ComponentScan**扫描,@ComponentScan注解虽然没有显式配置,但是实际上已经包含在了引导类声明注解 @SpringBootApplication 中, 默认扫描的范围是SpringBoot启动类所在包及其子包 。

@Bean:导入第三方包里面的注解,通常会单独定义一个配置类

Bean保持一个原则:

  • 如果是在项目当中我们自己定义的类,想将这些类交给IOC容器管理,直接使用@Component 以及它的衍生注解来声明就可以。
  • 如果这个类它不是我们自己定义的,而是引入的第三方依赖当中提供的类,而且我们还想将这个类 交给IOC容器管理。此时我们就需要在配置类中定义一个方法,在方法上加上一个@Bean注解,通 过这种方式来声明第三方的bean对象。

@Import:@Import(要导入到容器中的组件) ,通常使用第三方依赖提供的 @EnableXxxxx注解

@Import(HeaderConfig.class) //导入配置类
@SpringBootApplication
public class SpringbootWebConfig2Application {public static void main(String[] args) {SpringApplication.run(SpringbootWebConfig2Application.class,args);}
}

实现Bean的注入

@Autowired:实现程序运行时IOC容器自动注入需要的依赖对 象
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

@Resource:是按照名称匹配的

@Service
public class DemoService {@Bean(name = "userDemo"){实现}
}@RestController
public class UserController {@Resource(name = "userDemo")User user;
}

@Primary:让spring进行自动装配的时候,默认使用首选的bean,和@Qualifier一个效果。

Spring Web模块注解

@RestController:(常用)加在Controller类上边 相当于-> @RestController = @Controller + @ResponseBody

@RequestMapping : 这个注解用于将url映射到整个处理类或者特定的处理请求的方法。可以只用通配符!

@ResponseBody:将方法返回值直接响应给浏览器

@RestController //@RestController = @Controller + @ResponseBody
@RequestMapping("/emp")
public class EmpController {@Autowired //运行时,从IOC容器中获取该类型对象,赋值给该变量private EmpService empService ;@RequestMapping("/listEmp")public Result list(){//1. 调用service, 获取数据List<Emp> empList = empService.listEmp();//3. 响应数据return Result.success(empList);}
}

@RequestBody:将JSON数据映射到形参的实体类对象中(JSON中的key和实体类中的属性 名保持一致)

在这里插入图片描述

@PathVariable:获取路径参数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

@RequestParam(defaultValue=“默认值”) :设置请求参数默认值

在这里插入图片描述

@GetMapping
public Result page(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer pageSize) {//记录日志log.info("分页查询,参数:{},{}", page, pageSize);//调用业务层分页查询功能PageBean pageBean = empService.page(page, pageSize);//响应return Result.success(pageBean);
}

通常面对不同的请求方式 Controller要有相对应的Mapping

@GetMapping(“/url”) :前端请求方式:GET 等同于@RequestMapping(value = “/url” , method = RequestMethod.GET)

@DeleteMapping(“/url”) :前端请求方式:DELETE

@PostMapping(“/url”):前端请求方式:POST

@PutMapping:前端请求方式:PUT

@Slf4j
@RestController
public class DeptController {@Autowiredprivate DeptService deptService;@PostMapping("/depts")public Result add(@RequestBody Dept dept){//记录日志log.info("新增部门:{}",dept);//调用service层添加功能deptService.add(dept);//响应return Result.success();}//省略...
}

过滤器Filter

@WebFilter:指定属性urlPatterns,通过这个属性指 定过滤器要拦截哪些请求

@WebFilter(urlPatterns = "/*") //配置过滤器要拦截的请求路径( /* 表示拦
截浏览器的所有请求 )
public class DemoFilter implements Filter {@Override //初始化方法, 只调用一次public void init(FilterConfig filterConfig) throws ServletException {System.out.println("init 初始化方法执行了");}@Override //拦截到请求之后调用, 调用多次public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("Demo 拦截到了请求...放行前逻辑");//放行chain.doFilter(request,response);}@Override //销毁方法, 只调用一次public void destroy() {System.out.println("destroy 销毁方法执行了");}
}

@ServletComponentScan:开启SpringBoot项目对于 Servlet组件的支持。当存在@WebFilter时需要在启动类上面加上

Lombok

Lombok是一个实用的Java类库,可以通过简单的注解来简化和消除一些必须有但显得很臃肿的Java代 码。

介绍最常见的三个:

@Data 提供了更综合的生成代码功能(@Getter + @Setter + @ToString + @EqualsAndHashCode)

@NoArgsConstructor 为实体类生成无参的构造器方法

@AllArgsConstructor 为实体类生成除了static修饰的字段之外带有各参数的构造器方 法。

import lombok.Data;@Data //getter方法、setter方法、toString方法、hashCode方法、equals方法
@NoArgsConstructor //无参构造
@AllArgsConstructor//全参构造
public class User {private Integer id;private String name;private Short age;private Short gender;private String phone;
}

Mabatis

@Mapper:表示是mybatis中的Mapper接口

@Select:代表的就是select查询,用于书写select查询语句

@Delete:用于编写delete操作的SQL语句

@Insert:编写insert更新操作的SQL语句

@Update:编写update更新操作的SQL语句

@Mapper
public interface EmpMapper {@Select("select * from emp " +"where name like concat('%',#{name},'%') " +"and gender = #{gender} " +"and entrydate between #{begin} and #{end} " +"order by update_time desc")public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);
}

Mybatis的XML配置文件

?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.EmpMapper">
<!--查询操作--><select id="list" resultType="com.itheima.pojo.Emp">select * from empwhere name like concat('%',#{name},'%')and gender = #{gender}and entrydate between #{begin} and #{end}order by update_time desc</select>
</mapper>

动态SQL-if

<select id="list" resultType="com.itheima.pojo.Emp">select * from emp<where><!-- if做为where标签的子元素 --><if test="name != null">and name like concat('%',#{name},'%')</if><if test="gender != null">and gender = #{gender}</if><if test="begin != null and end != null">and entrydate between #{begin} and #{end}</if></where>order by update_time desc
</select>

动态SQL-foreach

<mapper namespace="com.itheima.mapper.EmpMapper"><!--删除操作--><delete id="deleteByIds">delete from emp where id in<foreach collection="ids" item="id" separator="," open="(", close=")">#{id}</foreach></delete>
</mapper>

动态SQL-sql&include

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其他

@Slf4j:控制台输出 log.info(“”)

@Value:注解通常用于外部配置(.yml文件)的属性注入,具体用法为: @Value(“${配置文件中的key}”)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

@ConfigurationProperties :当配置过多 简化上面代码,可以批量的将外部的属性配置注入到bean对象的属性中

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

@RestControllerAdvice :表示当前类为全局异常处理器

@ExceptionHandler :指定可以捕获哪种类型的异常进行处理

@RestControllerAdvice
public class GlobalExceptionHandler {//处理异常@ExceptionHandler(Exception.class) //指定能够处理的异常类型public Result ex(Exception e){e.printStackTrace();//打印堆栈中的异常信息//捕获到异常之后,响应一个标准的Resultreturn Result.error("对不起,操作失败,请联系管理员");}
}

@Transactional:在当前这个方法执行开始之前来开启事务,方法执行完毕之后提交事务。如果在方法执行的过程当中出现了异常,就会进行事务的回滚操作。

@Slf4j
@Service
public class DeptServiceImpl implements DeptService {@Autowiredprivate DeptMapper deptMapper;@Autowiredprivate EmpMapper empMapper;@Override@Transactional //当前方法添加了事务管理public void delete(Integer id){//根据部门id删除部门信息deptMapper.deleteById(id);//模拟:异常发生int i = 1/0;//删除部门下的所有员工信息empMapper.deleteByDeptId(id); }
}

@Transactional包含:rollbackFor属性 和 propagation属性,如下:

//在Spring的事务管理中,默认只有运行时异常 RuntimeException才会回滚。
//如果还需要回滚指定类型的异常,可以通过rollbackFor属性来指定
@Transactional(rollbackFor=Exception.class)//propagation 属性来指定传播行为。REQUIRES_NEW:不论是否有事务,都创建新事务 ,运行在一个独立的事务中。
@Transactional(propagation = Propagation.REQUIRES_NEW)//模拟:异常发生int i = 1/0;//删除部门下的所有员工信息empMapper.deleteByDeptId(id); }
}

@Transactional包含:rollbackFor属性 和 propagation属性,如下:

//在Spring的事务管理中,默认只有运行时异常 RuntimeException才会回滚。
//如果还需要回滚指定类型的异常,可以通过rollbackFor属性来指定
@Transactional(rollbackFor=Exception.class)
//propagation 属性来指定传播行为。REQUIRES_NEW:不论是否有事务,都创建新事务 ,运行在一个独立的事务中。
@Transactional(propagation = Propagation.REQUIRES_NEW)

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

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

相关文章

.Net core 6.0 升8.0

1 Update Visual Studio 2 3 用Nutget 更新不同套件版本 更新后结果如下&#xff1a;

第四期丨酷雷曼无人机技能培训

第4期无人机技能培训 2023年10月25日&#xff0c;酷雷曼无人机技能培训及执照考试第四期成功举办&#xff0c;自7月份首期开办以来&#xff0c;已按照每月一期的惯例连续举办四期&#xff0c;取得了极为热烈的反响。 随着无人机培训的重要性及影响力逐渐扩大&#xff0c;参加培…

UE4/UE5 材质实现带框环形进度条

UE4/UE5 材质实现带框环形进度条 此处使用版本&#xff1a;UE4.27 原理&#xff1a;大圆减小圆可以得到圆环&#xff0c;大圆环减小圆环&#xff0c;可以得到圆环外围线框 实现效果&#xff1a; 实现&#xff08;为了给大家放进一张面前能看的图&#xff0c;我费劲了心思&…

从 MQTT、InfluxDB 将数据无缝接入 TDengine,接入功能与 Logstash 类似

利用 TDengine Enterprise 和 TDengine Cloud 的数据接入功能&#xff0c;我们现在能够将 MQTT、InfluxDB 中的数据通过规则无缝转换至 TDengine 中&#xff0c;在降低成本的同时&#xff0c;也为用户的数据转换工作提供了极大的便捷性。由于该功能在实现及使用上与 Logstash 类…

自动化巡检实现方法 (一)------- 思路概述

一、自动化巡检需要会的技能 1、因为巡检要求一天24小时全天在线&#xff0c;因此巡检程序程序一定会放在服务器上跑&#xff0c;所以要对linux操作熟悉哦 2、巡检的代码要在git上管理&#xff0c;所以git的基本操作要熟悉 3、为了更方便不会代码的同学操作&#xff0c;所以整个…

GAN:WGAN-GP-带有梯度惩罚的WGAN

论文&#xff1a;https://arxiv.org/pdf/1704.00028.pdf 代码&#xff1a;GitHub - igul222/improved_wgan_training: Code for reproducing experiments in "Improved Training of Wasserstein GANs" 发表&#xff1a;2017 WGAN三部曲的终章-WGAN-GP 摘要 WGAN在…

123456前端调AES加密方法变为YehdBPev

使用密码加密服务: pig4cloud 加密服务

【每日易题】Leetcode上Hard难度的动态规划题目——地下城游戏的实现

君兮_的个人主页 即使走的再远&#xff0c;也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;博主最近一直在钻研动态规划算法&#xff0c;最近在Leetcode上刷题的时候遇到一个Hard难度的动态规划题&#xff0c;今天就借此机会来给大家分享…

品牌保护与知识产权:跨境电商中的法律挑战与解决方案

随着跨境电商的蓬勃发展&#xff0c;品牌保护和知识产权问题日益成为业界关注的焦点。在全球范围内进行电商业务&#xff0c;涉及到多国法律法规的复杂性&#xff0c;品牌所有者需要面对一系列法律挑战&#xff0c;保护其品牌和知识产权不受侵害。本文将深入探讨跨境电商中面临…

L1-016:查验身份证

题目描述 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下&#xff1a; 首先对前17位数字加权求和&#xff0c;权重分配为&#xff1a;{7&#xff0c;9&#xff0c;10&#xff0c;5&#xff0c;8&#xff0c;4&#xff0c;2&#xf…

P1 Orange Pi Zero2镜像烧录和环境搭建(换源)

目录 前言 01 镜像下载 02 镜像烧录 03 SD卡启动 04 SSH登录开发板 05 基于官方外设开发 方法1 方法2 前言 此专栏为智能家居项目&#xff0c;使用的开发板一共有三块&#xff0c;分别为 主控&#xff1a;Orange Pi Zero2触摸屏控制面板&#xff1a;i.MX 6ULL子系统&…

字符指针变量数组指针变量

字符指针变量 在指针的类型中&#xff0c;我们知道有一种指针叫做字符指针 一般的使用情况如下&#xff1a; #include<stdio.h> int main() {char ch w;char* pa &ch;*pa h;printf("%c", *pa);return 0; } 还有一种使用方法如下&#xff1a; #incl…

国内 AI 成图第一案!你来你会怎么判?

我国目前并未出台专门针对网络爬虫技术的法律规范&#xff0c;但在司法实践中&#xff0c;相关判决已屡见不鲜&#xff0c;K 哥特设了“K哥爬虫普法”专栏&#xff0c;本栏目通过对真实案例的分析&#xff0c;旨在提高广大爬虫工程师的法律意识&#xff0c;知晓如何合法合规利用…

室内外融合便携式定位终端5G+UWB+RTK

一、介绍 便携式定位终端主要用于提供高精度的位置数据&#xff0c;支持室内UWB定位和室外北斗系统定位功能&#xff0c;支持5G公网和5G专网通信功能&#xff0c;便携式定位终端中超宽带(UWB)和实时动态(RTK)技术的集成代表了精确位置跟踪方面的重大进步。这款UWBRTK便携式定位…

git 本地改动无法删除

1. 问题 记录下git遇到奇怪的问题&#xff0c;本地有些改动不知道什么原因无法删除 git stash&#xff0c; git reset --hard HEAD 等都无法生效&#xff0c;最终通过强制拉取线上解决 如下图&#xff1a; 2. 解决 git fetch --all git reset --hard origin/master执行这两…

Android RatingBar实现五星好评

属性 isIndicatorRatingBar 是否为指示器&#xff0c;为true时&#xff0c;用户将无法交互操作&#xff0c;默认为false。 numStars 显示的星型数量&#xff0c;必须是一个整形值&#xff0c;像“50”&#xff0c;虽然可以设置很大&#xff0c;但一般…

STM32-新建工程(标准库)

目录 STM32F10x新建工程&#xff08;标准库&#xff09; 移植文件夹 新建工程 添加启动文件和必需文件 在工程中加载新添加的文件 在工程中添加文件路径 在工程中添加main函数 添加lib库 添加必需文件 添加宏定义 STM32F10x新建工程&#xff08;标准库&#xff09; …

【Python】创建简单的Python微服务Demo与FastAPI

创建简单的Python微服务Demo与FastAPI 在微服务架构中&#xff0c;通过FastAPI框架创建一个简单的Python微服务Demo涉及多个步骤&#xff0c;包括定义服务、使用框架、进行通信等。在这篇文章中&#xff0c;我们将使用FastAPI框架创建两个简单的微服务&#xff0c;它们通过RES…

HBase安装配置:一键自动安装配置

使用shell脚本一键下载、安装、配置HBase&#xff08;单机版&#xff09; 1. 把下面的脚本复制保存为/tmp/install_hbase.sh文件 #!/bin/bash# 安装之前确保安装目录有写入权限&#xff0c;若没有&#xff0c;自行增加 # 安装版本 zk_version"2.4.8" # 安装目录 zk…

【WxPusher】消息推送小案例

提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 WxPusher后台 WxPusher文档 一、注册WxPusher 进入后台获取你的token 二、使用步骤 1.编写脚本 参数如下&#xff08;示例&#xff09;&#xff1a; {"appToken": "AT_AnXubGNGCe7OVN…