当前位置: 首页 > news >正文

Spring注解开发

目录

1、简介

2、原始注解

2.1、注解种类

2.2、组件扫描

2.3、具体使用

2.3.1、xml配置

2.3.2、注解配置

3、⭐新注解

3.1、新注解种类

3.2、实践

3.3、运行结果

3.4、警告信息


1、简介

Spring框架提供了许多注解,用于在Java类中进行配置和标记,以实现依赖注入、AOP、Web MVC和其他功能。这些注解可以使配置更加简洁,代码更易读,减少了传统XML配置的繁琐性。

以下是一些常用的Spring注解及其功能:

①组件注解:@Component、@Controller、@Service、@Repository

②依赖注入注解:@Autowired、@Qualifier、@Value

③Web MVC注解:@RequestMapping、@RequestParam、@PathVariable、@ResponseBody

④AOP注解:@Aspect

⑤事务注解:@Transactional

⑥配置类注解:@Configuration、@Bean

⑦作用域注解:@Scope

⑧生命周期注解:@PostConstruct、@PreDestroy

2、原始注解

Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势。

注解代替xml配置文件可以简化配置,提高开发效率。

Spring原始注解主要是替代<Bean>的配置。

2.1、注解种类

注解名

描述

@Component

将一个标记为Spring组件,表示它会被自动扫描并注册为一个Bean。

@Controller

将一个类标记为Spring MVC的控制器,用于处理请求和响应。

@Service

将一个类标记为业务逻辑的服务层组件,通常用于Service层的类。

@Repository

将一个类标记为数据访问层组件,通常用于DAO层的类。

@Autowired

自动注入依赖对象。Spring会自动查找匹配类型的Bean,并注入到对应的字段、构造函数或方法中。

@Qualifier

与@Autowired一起使用,用于指定具体的Bean名称,解决多个匹配类型的Bean自动注入的问题。

@Value

注入一个常量值或表达式(普通属性),可以用于字段、方法或构造函数参数。

@Scope

标注Bean的作用范围

@PostConstruct

使用在方法上标注该方法是Bean的初始化方法

@PreDestroy

使用在方法上标注该方法是Bean的销毁方法

@RequestMapping

将请求URL映射到控制器的处理方法上,指定处理请求的URL路径。

@Aspect

定义一个切面,结合其他注解,可以实现切面的功能,如AOP。

@Transactional

标记一个方法或类需要事务支持,Spring将在方法执行时开启事务,支持回滚等操作。

@Configuration

定义配置类,通常与@Bean一起使用,用于替代XML配置文件。

@Resource相当于@Autowired+@Qualifier,按照名称进行注入。

这是Java EE规范提供的一个注解,功能与spring的@Autowired+@Qualifier相同。

2.2、组件扫描

使用注解进行开发时,需要在applicationContext.xml中配置组件扫描,作用是指定哪个包及其子包下的Bean

需要进行扫描以便识别使用注解配置的类、字段和方法:

2.3、具体使用

2.3.1、xml配置

先回顾一下三重架构:

首先在dao包下定义一个接口类UserDao,定义实现类UserDaoImpl_xmlConfig;

然后在Service包下定义一个接口类UserService,定义实现类UserServiceImpl_xmlConfig;

最后在spring的配置文件配置bean。

java代码如下:

2.3.2、注解配置

注解开发注入对象的时候,不需要提供set方法。

首先在dao包下定义一个接口类UserDao,定义实现类UserDaoImpl_annotation

然后在Service包下定义一个接口类UserService,定义实现类UserServiceImpl_annotation

最后在配置文件applicationContext-annotation.xml中开启包扫描,然后导入applicationContext.xml:

dao层:

使用@Repository标记类UserDaoImpl_annotation:

value的默认值是"",在注解这里配置的value就是相当于xml配置文件中的id。

service层:

①使用@Service标记类UserServiceImpl_annotation:

这里的value依旧相当于xml配置中的id。

②使用(@Autowired@Qualifier)或@Resource注解标记需要注入的对象,这里是UserDao对象(实际上是它的实现类):

③使用@Value注入普通对象,这里注入spring容器中加载的jdbc配置文件的内容:

④使用@PostConstruct标记初始化方法(程序开始运行后执行):

⑤使用@PreDestroy标记销毁方法(程序结束之前执行):

3、⭐新注解

可以看到,spring的原始注解还无法完全替代applicationContext.xml,现在的applicationContext.xml中还存在的内容有:

所以,新注解需要解决的问题有:

  1. 加载properties文件的配置:<context:property-placeholder>
  2. 引入其他文件:<import>
  3. 组件扫描的配置:<context:component-scan>
  4. 非自定义的Bean的配置:<bean>

3.1、新注解种类

注解

用途

@Configuration

用于指定当前类是一个 Spring 配置类,当创建容器时会从该类上加载注解

@PropertySource

用于加载 properties 文件中的配置

@Import

用于导入其他配置类

@ComponentScan

用于指定 Spring 在初始化容器时要扫描的包

@Bean

使用在方法上,标注将该方法的返回值存储到 Spring 容器中

3.2、实践

代码:

package com.xzl.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;/*** @author 逐梦苍穹* @date 2023/7/21 16:21*/
@Configuration
@Import(value = {jdbcConfiguration.class,SpringConfiguration_ComponentScan.class})
//@Import({jdbcConfiguration.class})
//@ComponentScan("com.xzl")
public class SpringConfiguration {
}
package com.xzl.config;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;import javax.sql.DataSource;/*** @author 逐梦苍穹* @date 2023/7/21 16:22*/
@PropertySource("classpath:jdbc.properties")
public class jdbcConfiguration {@Value("${jdbc.driver}")private String driver;@Value("${jdbc.url}")private String url;@Value("${jdbc.username}")private String username;@Value("${jdbc.password}")private String password;//容器获取非自定义Bean对象@Bean("dataSource_druid")public DataSource getDataSourceJDBC(){DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName(driver);dataSource.setUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}
}
package com.xzl.config;/*** @author 逐梦苍穹* @date 2023/7/21 16:38*/import org.springframework.context.annotation.ComponentScan;@ComponentScan("com.xzl")
public class SpringConfiguration_ComponentScan {
}

3.3、运行结果

web测试代码:

3.4、警告信息

这里运行的时候会出现警告信息:

这些警告信息与使用的 JDK 版本相关。从 JDK 9 开始,Java 引入了新的访问控制机制,限制了对 Java 核心类的反射访问。这个限制主要是为了增强 Java 的安全性和稳定性。在 JDK 9 及更高版本中,默认情况下,对于某些敏感的、不稳定的 API,JVM 会输出警告信息,提醒开发者尽量避免使用这些 API。

在警告信息中,是因为 Spring 框架中的 CGLIB 库使用了一些在 JDK 9 中被认为是不稳定的 API,所以会触发这些警告。这些警告并不是错误,不会影响 Spring 框架的正常运行,但是可能在未来的 JDK 版本中导致一些不兼容性问题。

要解决这些警告,可以尝试以下方法之一:

  1. 使用 JDK 8 或更低版本:如果你的项目没有特别需要使用 JDK 9 及更高版本的功能,可以考虑切换回 JDK 8 或更低版本,这样就不会触发这些警告。
  2. 使用 --illegal-access=warn 参数:在启动应用程序时,可以添加 --illegal-access=warn JVM 参数,将这些警告设置为警告级别,从而让你在启动时看到警告信息。这样的设置可以帮助你识别潜在的问题。
  3. 使用 JDK 9+ 的 --add-opens 参数:如果你的项目必须使用 JDK 9 及更高版本,你可以尝试使用 --add-opens JVM 参数,来显式地为某些包或模块打开访问权限。例如,你可以尝试使用 --add-opens java.base/java.lang=ALL-UNNAMED 来为 java.lang 包打开权限。

无论选择哪种方法,都应该考虑将项目升级到更新版本的 Spring 和 JDK,以便与最新的 Java 特性和安全性保持一致。

相关文章:

Spring注解开发

目录 1、简介 2、原始注解 2.1、注解种类 2.2、组件扫描 2.3、具体使用 2.3.1、xml配置 2.3.2、注解配置 3、⭐新注解 3.1、新注解种类 3.2、实践 3.3、运行结果 3.4、警告信息 1、简介 Spring框架提供了许多注解&#xff0c;用于在Java类中进行配置和标记&#xf…...

图像处理库(Opencv, Matplotlib, PIL)以及三者之间的转换

文章目录 1. Opencv2. Matplotlib3. PIL4. 三者的区别和相互转换5. Torchvision 中的相关转换库5.1 ToPILImage([mode])5.2 ToTensor5.3 PILToTensor 1. Opencv opencv的基本图像类型可以和numpy数组相互转化&#xff0c;因此可以直接调用torch.from_numpy(img) 将图像转换成t…...

html+Vue+封装axios实现发送请求

在html中使用Vue和Axios时&#xff0c;可以在HTML中引入Vue库和Axios库&#xff0c;然后使用Vue的语法和指令来创建Vue组件和模板。在Vue组件中&#xff0c;你可以使用Axios发送HTTP请求来获取数据&#xff0c;并将数据绑定到Vue模板中进行展示。 <template><div>&…...

GoogLeNet卷积神经网络输出数据形参分析-笔记

GoogLeNet卷积神经网络输出数据形参分析-笔记 分析结果为&#xff1a; 输入数据形状:[10, 3, 224, 224] 最后输出结果&#xff1a;linear_0 [10, 1] [1024, 1] [1] 子空间执行逻辑 def forward_old(self, x):# 支路1只包含一个1x1卷积p1 F.relu(self.p1_1(x))# 支路2包含 1…...

【docker】dockerfile发布springboot项目

目录 一、实现步骤二、示例 一、实现步骤 1.定义父镜像&#xff1a;FROM java:8 2.定义作者信息&#xff1a;MAINTAINER&#xff1a;learn_docker<https://www.docker.com> 3.将jar包添加到容器&#xff1a;ADD jar包名称.jar app.jar 4.定义容器启动执行命令&#xff1a…...

利用docker run -v 命令实现使用宿主机中没有的命令

利用docker run -v 命令实现使用宿主机中没有的命令 使用容器中的jar命令解压jar包&#xff0c;并将解压内容输出到挂载在宿主机中的目录里 使用容器中的jar命令解压jar包&#xff0c;并将解压内容输出到挂载在宿主机中的目录里 docker run -it --name java -v /www/temp/java…...

【小沐学NLP】在线AI绘画网站(百度:文心一格)

文章目录 1、简介2、文心一格2.1 功能简介2.2 操作步骤2.3 使用费用2.4 若干示例2.4.1 女孩2.4.2 昙花2.4.3 山水画2.4.4 夜晚2.4.5 古诗2.4.6 二次元2.4.7 帅哥 结语 1、简介 当下&#xff0c;越来越多AI领域前沿技术争相落地&#xff0c;逐步释放出极大的产业价值&#xff0…...

react经验5:访问子组件内容

应用场景 父级需要调用子组件的某函数 实现步骤 案例&#xff1a;创建自定义按钮 button.tsx import { Ref, forwardRef, useImperativeHandle,ReactNode} from "react" declare type ButtonProps {/**按钮文字 */children?: ReactNode,onClick?: () > voi…...

【LeetCode】647. 回文子串

题目链接 文章目录 1. 思路讲解1.1 方法选择1.2 dp表的创建1.3 状态转移方程1.4 填表顺序 2. 代码实现 1. 思路讲解 1.1 方法选择 这道题我们采用动态规划的解法&#xff0c;倒不是动态规划的解法对于这道题有多好&#xff0c;它并不是最优解。但是&#xff0c;这道题的动态…...

Open3D(C++) 角度制与弧度制的相互转换

目录 一、弧度转角度1、计算公式2、主要函数3、示例代码4、结果展示二、角度转弧度1、计算公式2、主要函数3、示例代码4、结果展示三、归一化到(-PI,PI)1、主要函数<...

【小沐学NLP】在线AI绘画网站(网易云课堂:AI绘画工坊)

文章目录 1、简介1.1 参与方式1.2 模型简介 2、使用费用3、操作步骤3.1 选择模型3.2 输入提示词3.3 调整参数3.4 图片生成 4、测试例子4.1 小狗4.2 蜘蛛侠4.3 人物4.4 龙猫 结语 1、简介 Stable Diffusion是一种强大的图像生成AI&#xff0c;它可以根据输入的文字描述词&#…...

GNN code Tips

1. 重置label取值范围 problem: otherwise occurs IndexError: target out of bounds # reset labels value range, otherwise occurs IndexError: target out of bounds uni_set torch.unique(labels) to_set torch.tensor(list(range(len(uni_set)))) labels_reset label…...

物联网|按键实验---学习I/O的输入及中断的编程|函数说明的格式|如何使用CMSIS的延时|读取通过外部中断实现按键捕获代码的实现及分析-学习笔记(14)

文章目录 通过外部中断实现按键捕获代码的实现及分析Tip1:函数说明的格式Tip2:如何使用CMSIS的延时GetTick函数原型stm32f407_intr_handle.c解析中断处理函数&#xff1a;void EXTI4_IRQHandler 调试流程软件模拟调试 两种代码的比较课后作业: 通过外部中断实现按键捕获代码的实…...

Java对象的前世今生

文章目录 一、创建对象的步骤二、类加载机制三、内存分配指针碰撞 (内存连续)空闲列表 (内存不连续) 四、创建对象的5种方法五、浅拷贝与深拷贝 以下一行代码内部发生了什么&#xff1f; Person person new Person();一、创建对象的步骤 根据JLS中的规定&#xff0c;Java对象…...

Qt中JSON的使用

一.前言&#xff1a; JSON是一种轻量级数据交换格式&#xff0c;常用于客户端和服务端的数据交互&#xff0c;不依赖于编程语言&#xff0c;在很多编程语言中都可以使用JSON&#xff0c;比如C&#xff0c;C&#xff0c;Java&#xff0c;Android&#xff0c;Qt。除了JSON&#x…...

linux安装Tomcat部署jpress教程

yum在线安装&#xff1a; 查看tomcat相关的安装包&#xff1a; [rootRHCE ~]# yum list | grep -i tomcat tomcat.noarch 7.0.76-16.el7_9 updates tomcat-el-2.2-api.noarch 7.0.76-16.el7_9 updat…...

高并发负载均衡---LVS

目录 前言 一&#xff1a;负载均衡概述 二&#xff1a;为啥负载均衡服务器这么快呢&#xff1f; ​编辑 2.1 七层应用程序慢的原因 2.2 四层负载均衡器LVS快的原因 三&#xff1a;LVS负载均衡器的三种模式 3.1 NAT模式 3.1.1 什么是NAT模式 3.1.2 NAT模式实现LVS的缺点…...

微前端中的 CSS

本文为翻译 本文译者为 360 奇舞团前端开发工程师原文标题&#xff1a;CSS in Micro Frontends 原文作者&#xff1a;Florian Rappl 原文地址&#xff1a;https://dev.to/florianrappl/css-in-micro-frontends-4jai 我被问得最多的问题之一是如何在微前端中处理 CSS。毕竟&…...

在CSDN学Golang场景化解决方案(分布式日志系统)

一&#xff0c;传统 elk 解决方案及其弊端 传统ELK&#xff08;Elasticsearch Logstash Kibana&#xff09;方案是一种流行的分布式日志系统解决方案&#xff0c;但也存在一些弊端&#xff1a; 依赖性&#xff1a;ELK使用Java编写&#xff0c;需要安装JVM&#xff0c;并且还…...

电脑第一次使用屏幕键盘

操作流程 1.在键盘上同时按WinR打开运行; 2.输入control 3.找到设置中心 4.点击屏幕键盘 效果 具体怎么使用 我不咋清除 简单 测试了一下 可以用鼠标点击屏幕键盘的按键 用键盘 按字母键和数字键 是和屏幕键盘不同步的 其他 tab、shift、后退、enter好像同步...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...