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

news2025/2/23 22:47:23

面向注解编程—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 ;
    @Override
    public List<Emp> listEmp() {
    	//具体实现
    }

Dao层:

@Repository
public class EmpDaoA implements EmpDao {
    @Override
    public 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 {
    @Autowired
    private 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 mapper
        PUBLIC "-//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 emp
         where 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();//打印堆栈中的异常信息
        
        //捕获到异常之后,响应一个标准的Result
        return Result.error("对不起,操作失败,请联系管理员");
    }
}

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

@Slf4j
@Service
public class DeptServiceImpl implements DeptService {
    @Autowired
    private DeptMapper deptMapper;
    
    @Autowired
    private 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.coloradmin.cn/o/1286049.html

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

相关文章

记一次使用Java8新特性中的parallelStream⭐️数据流引发的接口异常以及解决方法

目录 前言 正文 代码 分析 问题解决 总结 前言 小伙伴们大家好&#xff0c;分享下开发过程中最近遇到的坑&#xff0c;根据新需求&#xff0c;项目的一处模块需要改动&#xff0c;大致说下该模块的流程。。。好像之前有讲过&#xff0c;翻翻看&#xff0c;…

Linux4.8、环境变量续

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言 如果对环境变量没有基本的理解&#xff0c;那么建议先看完这篇文章&#xff1a;环境变量https://blog.csdn.net/m0_74824254/article/details/134661113?spm1001.2014.3001.5501 环境变量与本地变量区别 使用export设…

response应用

文章目录 [TOC](文章目录) response说明一、response文件下载二、待补充。。。 response说明 response是指HttpServletResponse,该响应有很多的应用&#xff0c;比如像浏览器输出消息&#xff0c;下载文件&#xff0c;实现验证码等。 一、response文件下载 1.创建一个javaw…

跨境代采怎么实现(代采网站)

中国代购作为一种新型的业务形式&#xff0c;此类服务能够帮助消费者购买来自全球的商品&#xff0c;同时也为商家提供了在线销售机会。代购行业的兴起&#xff0c;有助于打破传统的地域和跨境限制&#xff0c;促进了国际贸易和经济发展。 一、中国代购的定义和特点 代购可以被…

基于SpringBoot实现的电影院售票系统

一、 系统架构 前端&#xff1a;html | jquery | bootstrap 后端&#xff1a;springboot | thymeleaf | spring-data-jpa 环境&#xff1a;jdk1.8 | mysql | maven 二、代码及数据库 三、功能介绍 01. 首页 02. 登录页 03. 管理端-电影列表 04. 管理端-添加电影 05. 管…

【EI会议征稿中】第五届人工智能与机电自动化国际学术会议(AIEA 2024)

第五届人工智能与机电自动化国际学术会议&#xff08;AIEA 2024&#xff09; 2024 5th International Conference on Artificial Intelligence and Electromechanical Automation 第五届人工智能与机电自动化国际学术会议&#xff08;AIEA 2024&#xff09;将于2024年3月8-10…

3 数据库

目录 一、数据库的基本信息 1.1 数据库的定义 1.2数据库的分类 1.2.1 关系型数据库 1.2.2 非关系型数据库 1.3 SQL介绍 1.3.1 概念 1.3.2 SQl语言分类 1.3.3 SQL注释 1.3.4 数据库操作命令DDL 1.3.5 数据表操作命令DDL 1.3.6 数据表操作命令DML 1.3.7 数据表中内容…

2023跳槽最新面试题整理:软件测试面试题(附带答案)备战面试...

混迹于软件测试行业十几年了&#xff0c;在面试经验方面也是比较有经验&#xff0c;那么也整理过很多面试题&#xff0c;今天暴露给大家看看&#xff0c;学习学习&#xff01; 测试面试一般从以下三大方向蹂躏面试者&#xff1a; 1、基本素养–比如沟通方向的考察&#xff0c…

同城上门洗鞋店小程序,打破传统洗鞋店新模式

同城洗鞋&#xff0c;一种把传统洗鞋和互联网结合的新兴服务&#xff0c;它让洗鞋更便捷、品质更高。你不用再为排队等待而烦恼&#xff0c;只需在家预约&#xff0c;我们的服务人员就会按时上门取鞋&#xff0c;进行初步清洗和检查。根据鞋子材质和污渍程度&#xff0c;选择合…

Java网络编程——基础入门

1、进程间的通信 进程指运行中的程序&#xff0c;进程的任务就是执行程序中的代码。EchoPlayer类是一个独立的Java程序&#xff0c;它可以在任意一台安装了JDK的主机上运行&#xff1a; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr…

【EI会议征稿中|航空航天领域】第二届航空航天与控制工程国际学术会议(ICoACE 2023)

第二届航空航天与控制工程国际学术会议&#xff08;ICoACE 2023&#xff09; 2023 2nd International Conference on Aerospace and Control Engineering 2023年第二届航空航天与控制工程国际学术会议&#xff08;ICoACE 2023&#xff09;将于2023年12月15-17日在江苏南京召开…

性能测试计划怎么编写

一&#xff0e;简介 简介部分就不用过多描述了&#xff0c;无非项目的背景&#xff0c;进行此次性能测试的原因&#xff0c;以及性能测试覆盖的范围等等&#xff0c;几乎所有项目文档都在开端对项目进行简单的阐述。 二&#xff0e;性能测试需求 寻找的被测试对象和压力点 …

蓝桥杯算法心得——想吃冰淇淋和蛋糕(dp)

大家好&#xff0c;我是晴天学长&#xff0c;dp题&#xff0c;怎么设计状态很重要&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .想吃冰淇淋和蛋糕 想吃冰淇淋与蛋糕 输入格式 第一行输入一个整数n。…

python文件操作知识

【一】操作流程&#xff1a; 打开文件&#xff0c;得到一个文件句柄&#xff08;对象&#xff09;&#xff0c;赋给一个对象。通过文件句柄对文件进行操作。关闭文件。 【 二 】 使用方法 open&#xff08;路径 文件名&#xff0c;读写模式&#xff09; 如下&#xff1a; …

Netty02-基础概念

什么是netty ​ Netty是一个基于Java NIO的异步事件驱动网络应用程序框架。它提供了简单易用的API&#xff0c;用于快速开发可维护的高性能网络应用程序。Netty的设计目标是提供一种高度可扩展的、高性能的网络应用程序框架&#xff0c;使得开发人员能够轻松地构建各种类型的网…

unity | 动画模块之循环滚动选项框

一、作者的话 评论区有人问&#xff0c;有没有竖排循环轮播选项框&#xff0c;我就写了一个 二、效果动画 如果不是你们想要的&#xff0c;就省的你们继续往下看了 三、制作思路 把移动分成里面的方块&#xff0c;还有背景&#xff08;父物体&#xff09;&#xff0c;方块自…

基于 springboot + vue 健身房管理系统 毕业设计-附源码

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

AI交互数字人如何成为古镇文化传播者?

近日&#xff0c;南浔古镇出现了5位数字人&#xff0c;将古镇文化与数字人相结合&#xff0c;实现旅游营销的创新尝试。数字人不仅可以作为南浔古镇的品牌形象&#xff0c;还可以作为南浔古镇的文化传播者&#xff0c;化身AI交互数字人与游客互动交流&#xff0c;讲述南浔古镇的…

安全AI系统开发指南

执行摘要 本文件建议为使用人工智能&#xff08;AI&#xff09;的任何系统的提供商提供指导方针&#xff0c;无论这些系统是从头开始创建的&#xff0c;还是建立在他人提供的工具和服务之上的。实施这些指导方针将有助于提供商构建按预期运行、在需要时可用的人工智能系统&…

基因组注释流程

一边学习&#xff0c;一边总结&#xff0c;一边分享&#xff01; 详细教程请访问&#xff1a; 组学分析流程 本期分析流程 Hisat2-SamtoolsTrinity_GG_denovoPASA … 本期教程文章 题目&#xff1a;Genomic insights into local adaptation and future climate-induced vu…