当前位置: 首页 > 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好像同步...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...