Spring纯注解开发

在我的另一篇文章中(初识Spring-CSDN博客),讲述了Bean,以及通过xml方式定义Bean。接下来将讲解通过注解的方法管理Bean。

我们在创建具体的类的时候,可以直接在类的上面标明“注解”,以此来声明类。

1. 常用的Spring注解

Spring提供了多种注解来声明和管理Bean。以下是一些常用的注解:

  • @Component:通用注解,用于标记一个类为Spring的组件,表示该类是一个Bean。
  • @Controller:用于标记控制器类,通常用于Spring MVC中。
  • @Service:用于标记服务层类,表示该类是业务逻辑的实现。
  • @Repository:用于标记数据访问层类,通常用于DAO(数据访问对象)实现。
  • @Autowired:用于自动装配Bean,Spring会自动寻找匹配的Bean并注入到目标类中。
  • @Qualifier:当有多个匹配的Bean时,用于指定具体的Bean。
  • @Value:用于注入配置文件中的属性值。

2. 使用注解声明Bean

在使用注解声明Bean之前,首先需要在Spring配置文件中启用注解支持。通常可以通过以下方式实现:

<context:component-scan base-package="com.example"/>

上述配置表示Spring会扫描com.example包及其子包下的所有类,并根据注解将这些类注册为Spring的Bean。

3. 示例代码

假设我们有一个服务类UserService,我们希望将其声明为一个Spring的Bean。可以通过以下方式实现:

package com.example.service;import org.springframework.stereotype.Service;@Service
public class UserService {public void doSomething() {System.out.println("UserService is doing something!");}
}

在上述代码中,我们使用了@Service注解来声明UserService类为一个Bean。这样,Spring在启动时会自动扫描并注册这个Bean。

4. 自动装配Bean

假设我们有一个控制器类UserController,我们希望在其中自动装配UserService。可以通过以下方式实现:

package com.example.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;@Controller
public class UserController {@Autowiredprivate UserService userService;public void handleRequest() {userService.doSomething();}
}

在上述代码中,我们使用了@Autowired注解来实现自动装配。这样,Spring会自动将UserService的实例注入到UserController中。

在Spring中,通过注解定义Bean时,默认情况下Bean的ID是根据类名自动生成的,通常是将类名的首字母小写作为Bean的ID。然而,在某些场景下,我们可能需要显式地指定Bean的ID,以便更好地管理和引用这些Bean。Spring提供了@Component@Service@Repository@Controller等注解的属性来实现这一点。

5. 使用注解指定Bean的ID

使用@Component注解

@Component注解有一个属性value,可以用来指定Bean的ID。例如:

import org.springframework.stereotype.Component;@Component("customBeanId")
public class MyComponent {public void doSomething() {System.out.println("MyComponent is doing something!");}
}

在上面的代码中,MyComponent类的Bean ID被显式地指定为customBeanId

使用@Service@Repository@Controller注解

这些注解实际上是@Component的特化版本,因此它们也支持通过value属性来指定Bean的ID。例如:

import org.springframework.stereotype.Service;@Service("customServiceId")
public class MyService {public void doSomething() {System.out.println("MyService is doing something!");}
}

import org.springframework.stereotype.Repository;@Repository("customRepositoryId")
public class MyRepository {// 数据访问逻辑
}

import org.springframework.stereotype.Controller;@Controller("customControllerId")
public class MyController {// 控制器逻辑
}

6.配置类的引入

注意:虽然我们上面已经用注解简化了对Bean的管理。但是我们还有一个xml配置文件,这样注解里面夹杂这xml让人很不舒服。因此,我们可以引入配置类。

在Spring应用中,使用注解来管理Bean确实可以简化配置,但仍然保留XML配置文件可能会让整个配置显得杂乱无章。为了进一步简化配置,Spring引入了配置类(Configuration Class)的概念。配置类允许我们使用Java代码来定义和管理Bean,从而完全摆脱XML配置文件的束缚。

6.1. 使用配置类管理Bean

配置类是一个普通的Java类,通过使用@Configuration注解来标识。这个类中的方法可以使用@Bean注解来定义Bean,方法的返回值就是Bean的实例。

假设我们有一个UserService类,我们希望将其定义为一个Bean。可以通过配置类来实现:

package com.example.config;import com.example.service.UserService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic UserService userService() {return new UserService();}
}

在上面的代码中,AppConfig类被标记为配置类(@Configuration),userService方法上使用了@Bean注解,表示这个方法返回的UserService实例是一个Spring Bean。

6.2. 使用配置类替换XML配置

通过配置类,我们可以完全替代XML配置文件。为了使用配置类,我们不再需要<context:component-scan>标签,而是直接在Spring应用的启动类(通常是主类)上使用@ComponentScan注解来指定扫描的包。

假设我们有一个Spring Boot应用,启动类如下:

package com.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;@SpringBootApplication
@ComponentScan(basePackages = "com.example")
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

在上述代码中,@SpringBootApplication注解包含了@Configuration@EnableAutoConfiguration@ComponentScan注解的功能,因此我们不再需要显式地使用@Configuration@ComponentScan

扫描多个包的配置类示例

假设我们有三个包需要扫描:com.example.servicecom.example.repositorycom.example.controller,我们可以在配置类中这样配置:

package com.example.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan(basePackages = {"com.example.service", "com.example.repository", "com.example.controller"})
public class SpringConfig {
}
6.3. 在配置类中自动装配Bean

在配置类中,我们同样可以使用@Autowired注解来自动装配Bean。例如,假设我们有一个UserRepository类,我们希望在UserService中使用它:

package com.example.service;import com.example.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;public class UserService {@Autowiredprivate UserRepository userRepository;public void doSomething() {userRepository.doSomething();System.out.println("UserService is doing something!");}
}

配置类AppConfig可以调整为如下:

package com.example.config;import com.example.repository.UserRepository;
import com.example.service.UserService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic UserRepository userRepository() {return new UserRepository();}@Beanpublic UserService userService(UserRepository userRepository) {UserService userService = new UserService();userService.setUserRepository(userRepository); // 手动装配return userService;}
}

注意,我们有以下结构:

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

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

相关文章

git push时报错! [rejected] master -> master (fetch first)error: ...

错误描述&#xff1a;在我向远程仓库push代码时&#xff0c;即执行 git push origin master命令时发生的错误。直接上错误截图。 错误截图 错误原因&#xff1a; 在网上查了许多资料&#xff0c;是因为Git仓库中已经有一部分代码&#xff0c;它不允许你直接把你的代码覆盖上去…

java常用工具包介绍

Java 作为一种广泛使用的编程语言&#xff0c;提供了丰富的标准库和工具包来帮助开发者高效地进行开发。这些工具包涵盖了从基础的数据类型操作到高级的网络编程、数据库连接等各个方面。下面是一些 Java 中常用的工具包&#xff08;Package&#xff09;及其简要介绍&#xff1…

latex中,两个相邻的表格,怎样留一定的空白

目录 问题描述 问题解决 问题描述 在使用latex写论文时&#xff0c;经常表格需要置顶写&#xff0c;则会出现两个表格连在一起的情况。下一个表名容易与上面的横线相连&#xff0c;如何通过明令&#xff0c;留出一定的空白。 问题解决 在第二个表格的 \centering命令之后…

react中如何在一张图片上加一个灰色蒙层,并添加事件?

最终效果&#xff1a; 实现原理&#xff1a; 移动到图片上的时候&#xff0c;给img加一个伪类 &#xff01;&#xff01;此时就要地方要注意了&#xff0c;因为img标签是闭合的标签&#xff0c;无法直接添加 伪类&#xff08;::after&#xff09;&#xff0c;所以 我是在img外…

C++builder中的人工智能(27):如何将 GPT-3 API 集成到 C++ 中

人工智能软件和硬件技术正在迅速发展。我们每天都能看到新的进步。其中一个巨大的飞跃是我们拥有更多基于自然语言处理&#xff08;NLP&#xff09;和深度学习&#xff08;DL&#xff09;机制的逻辑性更强的AI聊天应用。有许多AI工具可以用来开发由C、C、Delphi、Python等编程语…

【项目开发】URL中井号(#)的技术细节

未经许可,不得转载。 文章目录 前言一、# 的基本含义二、# 不参与 HTTP 请求三、# 后的字符处理机制四、# 的变化不会触发网页重新加载五、# 的变化会记录在浏览器历史中六、通过 window.location.hash 操作七、onhashchange 事件八、Google 对 # 的处理机制前言 2023 年 9 月…

AUTOSAR_EXP_ARAComAPI的7章笔记(5)

☞返回总目录 相关总结&#xff1a;典型的 SOME/IP 多绑定用例总结 7.3.3 典型的SOME/IP多绑定用例 在前面的章节中&#xff0c;我们简要提到&#xff0c;在一个典型的SOME/IP 网络协议的部署场景中&#xff0c;AP SWC不太可能自己打开套接字连接来与远程服务通信。为什么不…

Jenkins下载安装、构建部署到linux远程启动运行

Jenkins详细教程 Winodws下载安装Jenkins一、Jenkins配置Plugins插件管理1、汉化插件2、Maven插件3、重启Jenkins&#xff1a;Restart Safely插件4、文件传输&#xff1a;Publish Over SSH5、gitee插件6、清理插件&#xff1a;workspace cleanup system系统配置1、Gitee配置2、…

Flutter:Dio下载文件到本地

import dart:io; import package:dio/dio.dart;main(){// 创建dio对象final dio Dio();// 下载地址var url https://*******.org/files/1.0.0.apk;// 手机端路径String savePath Directory.systemTemp.path/ceshi.apk;print(savePath);downLoad(dio,url,savePath); }downLo…

【C++笔记】C++三大特性之多态

【C笔记】C三大特性之多态 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C笔记 文章目录 【C笔记】C三大特性之多态前言一.多态1.1 多态的概念1.2 虚函数1.3 虚函数的重写/覆盖1.4 多态的定义及实现 二.虚函数重写的⼀些其他问题2.1 协变(…

2.STM32之通信接口《精讲》之USART通信

有关通信详解进我主页观看其他文章&#xff01;【免费】SPIIICUARTRS232/485-详细版_UART、IIC、SPI资源-CSDN文库 通过以上可以看出。根据电频标准&#xff0c;可以分为TTL电平&#xff0c;RS232电平&#xff0c;RS485电平&#xff0c;这些本质上都属于串口通信。有区别的仅是…

麒麟V10,arm64,离线安装docker和docker-compose

文章目录 一、下载1.1 docker1.2 docker-compose1.3 docker.service 二、安装三、验证安装成功3.1 docker3.2 docker-compose 需要在离线环境的系统了里面安装docker。目前国产化主推的是麒麟os和鲲鹏的cpu&#xff0c;这块的教程还比较少&#xff0c;记录一下。 # cat /etc/ky…

云原生之运维监控实践-使用Telegraf、Prometheus与Grafana实现对InfluxDB服务的监测

背景 如果你要为应用程序构建规范或用户故事&#xff0c;那么务必先把应用程序每个组件的监控指标考虑进来&#xff0c;千万不要等到项目结束或部署之前再做这件事情。——《Prometheus监控实战》 去年写了一篇在Docker环境下部署若依微服务ruoyi-cloud项目的文章&#xff0c;当…

三十九、Python(pytest框架-中)

一、执行用例的方式 1.工具执行 2.在终端使用命令行运行 命令&#xff1a;pytest -s 用例代码文件 -s 的作用是输出显示代码中的 print。 3.在主函数main中执行 if __name__ "__main__": # 主函数pytest.main([-s, 用例代码文件]) import pytestclass TestDemo…

丹摩征文活动|丹摩助力selenium实现大麦网抢票

丹摩征文活动&#xff5c;丹摩助力selenium实现大麦网抢票 1.引言 在人工智能飞速发展的今天&#xff0c;丹摩智算平台&#xff08;DAMODEL&#xff09;以其卓越的AI算力服务脱颖而出&#xff0c;为开发者提供了一个简化AI开发流程的强大工具。通过租赁GPU资源&#xff0c;丹…

【计算机网络】协议定制

一、结构化数据传输流程 这里涉及协议定制、序列化/反序列化的知识 对于序列化和反序列化&#xff0c;有现成的解决方案&#xff1a;①json ②probuff ③xml 二、理解发送接收函数 我们调用的所有发送/接收函数&#xff0c;根本就不是把数据发送到网络中&#xff01;本质都是…

大数据-226 离线数仓 - Flume 优化配置 自定义拦截器 拦截原理 拦截器实现 Java

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…

AI行业动态:AGI预测、模型进化与工具革新

本周&#xff0c;人工智能&#xff08;AI&#xff09;领域的新闻层出不穷&#xff0c;从关于通用人工智能&#xff08;AGI&#xff09;何时到来的预测&#xff0c;到模型训练与推理技术的突破&#xff0c;再到各种实用工具的更新迭代&#xff0c;精彩纷呈。让我们一起深入了解这…

vue3 如何调用第三方npm包内部的 pinia 状态管理库方法

抛砖引玉: 如果在开发vue3项目是, 引用了npm第三方包 ,而且这个包内使用了Pinia 状态管理库,那我们如何去调用 npm内部的 Pinia 状态管理库呢? 实际遇到的问题: 今天在制作npm包时遇到的问题,之前Vue2版本的时候状态管理库用的Vuex ,当时调用npm包内的状态管理库很简单,直接引…

AWTK-WIDGET-WEB-VIEW 实现笔记 (4) - Ubuntu

Ubuntu 上实现 AWTK-WIDGET-WEB-VIEW 开始以为很简单&#xff0c;后来发现是最麻烦的。因为 Ubuntu 上的 webview 库是 基于 GTK 的&#xff0c;而 AWTK 是基于 X11 的&#xff0c;两者的窗口系统不同&#xff0c;所以期间踩了几个大坑。 1. 编译 AWTK 在使用 Linux 的输入法时…