Spring framework Day13:注解结合Java配置类
前言
前面我们管理 bean 都是在 xml 文件中去管理,本次我们将介绍如何在 Java 配置类中去管理 bean。
注解结合 Java 配置类是一种常见的 Spring 注入 Bean 的方式。通常情况下,开发人员会使用 Java Config 来定义应用程序的配置信息,而在 Java Config 中使用注解来声明和注入 Bean。
@Configuration、@ComponentScan 和 @Bean 是 Spring Framework 中的常用注解,用于配置和创建 Bean。
@Configuration注解标识一个类为配置类,相当于以前的 XML 配置文件。通常在该类中定义了一些用于创建和组装 Bean 的方法。
@ComponentScan注解用于自动扫描指定包及其子包中的组件(包括注解为@Component、@Service、@Repository、@Controller等的类),并注册为 Spring 上下文中的 Bean。
@Bean注解用于声明一个方法,该方法将返回一个对象,该对象将被注册为 Spring 上下文中的 Bean。@Bean注解可以用在@Configuration类中的方法上,也可以用在普通的@Component类中的方法上。
一、开始学习
1、新建项目,结构如下

2、添加 spring 依赖
<!-- spring 的核心依赖 --><dependencies><!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.23</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.4.5</version></dependency></dependencies>
3、在 service 包下新建一个 UserService 接口,在 impl 包下新建一个 UserServiceImpl 实现类
UserService 接口
public interface UserService {void add();}
UserServiceImpl 实现类
@Slf4j
public class UserServiceImpl implements UserService {@Overridepublic void add() {log.info("添加用户");}
}
4、在 controller 包下新建一个 UserController 类
@RequiredArgsConstructor
public class UserController {/*** 通过构造方法注入 UserService*/private final UserService userService;public void add() {userService.add();}}
5、在 config 包下新建一个 AppConfig 配置类
/*** @Date 2023-10-07* @Author qiu* <p>* spring 提倡使用注解和配置类来完成 bean 的装配,* 而配置类就是全面取代 xml 配置文件的一种方式*/@Configuration
@ComponentScan(basePackages = "edu.nf.ch13")
public class AppConfig {/*** * @Configuration注解:标识一个类为合法的配置类* ** * @ComponentScan注解:用于扫描指定的包,装配相关的 bean* * 等价于 xml 中的扫描* ** * @Respository注解来装配 bean 以外,还可以使用* ** * @Bean 注解在配置类中装配 Bean,这种方式很类似* * 在 xml 中配置一个个的 <bean id="xxx"/>* * 用了 @Bean 注解后默认标注的方法名就是 Bean 的 id* <p>* 还可以通过 name 属性指定 bean 的别名** @return*/@Beanpublic UserService userService() {return new UserServiceImpl();}/*** 当需要注入其他 bean 的时候,有两种方式* 方式一:通过参数实现注入* 方式二:通过调用 bean 方法来实现注入** @Scope:还可以声明在 Bean 方法上来设置 Bean 的作用域* @return*/@Bean@Scope("prototype")public UserController userController() {return new UserController(userService());}}
这是一个使用 Java 配置类来装配 Spring Bean 的示例代码。
在这个示例中,
@Configuration注解表示AppConfig类是一个合法的配置类。@ComponentScan注解用于扫描指定包中的组件,并将其装配为 Spring Bean。
userService()方法使用@Bean注解来声明一个名为 "userService" 的 Spring Bean,并将其返回。可以看到,在这里我们不需要编写 XML 配置文件,仅仅通过 Java 代码就可以完成 Bean 的装配。userController()方法也使用@Bean注解来声明一个名为 "userController" 的 Spring Bean,并注入 "userService" Bean。在这个方法中,我们可以使用参数来实现依赖注入,也可以通过调用其他 Bean 方法来实现依赖注入。- 此外,我们还使用
@Scope注解来设置UserControllerBean 的作用域为原型(prototype),以确保每次调用userController()方法都会创建一个新的实例。总体来说,使用 Java 配置类来装配 Spring Bean 比起 XML 配置文件更加直观、方便,也更利于代码维护和易读性。
注意了!!!这个配置类就已经代替了 xml 文件,所以就不需要再去写 xml 文件了。还有我们之前都是通过使用特定注解(@Seivice、@Controller)去声明一个 Bena,现在也不需要写了,因为在配置文件中使用了 @Bean 去声明,大家自行选择使用。
6、测试
public class Main {public static void main(String[] args) {// 创建基于注解和配置类的容器工厂// 取代 ClassPathXmlApplicationContext// 构造方法指定配置类的 Class 对象ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);UserController bean = context.getBean(UserController.class);bean.add();}}
这段代码展示了如何使用基于注解和配置类的 Spring 容器工厂。具体来说,主要包含以下几个步骤:
- 创建基于注解和配置类的容器工厂
使用
AnnotationConfigApplicationContext类来创建一个基于注解和配置类的 Spring 容器工厂。通过将AppConfig.class作为参数传入构造方法,指定了配置类的 Class 对象。
- 获取 Bean
通过调用容器工厂的
getBean()方法,传入需要获取的 Bean 的类型UserController.class,从而获取到名为 "userController" 的 Spring Bean。
- 使用 Bean
得到 Bean 之后,即可进行相关操作,这里调用了
add()方法。
相比于传统的 XML 配置方式,在基于注解和配置类的方式下,上述三个步骤都荟萃在 Main 类中,更加简单明了。同时,由于使用注解,在代码中对 Bean 及其依赖关系进行了直接定义和维护,因此可以更加灵活地进行配置和管理。
运行结果
二、使用注解结合Java配置类的好处
使用注解结合Java配置类的好处有以下几点:
清晰明了:使用注解和Java配置类可以将配置信息直接写在代码中,使得配置与逻辑代码更加紧密,易于理解和维护。不再需要繁琐的XML配置文件,整个配置过程集中在一个类中,便于查找和管理。
类型安全:注解和Java配置类提供了类型安全的配置方式。通过使用注解,可以在编译时检查类型错误,减少运行时异常。同时,Java配置类使用Java代码进行配置,可以利用IDE的自动补全和编译时检查,提高开发效率。
灵活性:使用注解和Java配置类可以更方便地进行配置的修改和扩展。在Java配置类中,可以轻松地添加、删除或修改Bean的配置,而不需要修改XML文件并重新部署应用程序。此外,通过使用条件注解、属性注解等高级特性,可以根据不同的条件和环境进行动态的配置。
更好的测试支持:使用注解和Java配置类可以更方便地进行单元测试和集成测试。在测试时,可以轻松地创建和配置需要的Bean,重写特定的Bean定义,以模拟不同的场景和条件。
注解丰富:Spring Framework提供了丰富的注解,如
@Autowired、@Component、@Value等,可以用于自动装配依赖、声明Bean、注入属性等。这些注解使得配置和开发更加简洁和便捷。
综上所述,使用注解结合Java配置类能够提高代码的可读性、可维护性和灵活性,减少了配置的复杂性,并支持更好的测试和开发体验。因此,注解和Java配置类已成为Spring框架中推荐的配置方式。
那么对比于 xml 大家更喜欢哪一种方式呢?
三、gitee 案例
案例完整地址:https://gitee.com/qiu-feng1/spring-framework.git
相关文章:
Spring framework Day13:注解结合Java配置类
前言 前面我们管理 bean 都是在 xml 文件中去管理,本次我们将介绍如何在 Java 配置类中去管理 bean。 注解结合 Java 配置类是一种常见的 Spring 注入 Bean 的方式。通常情况下,开发人员会使用 Java Config 来定义应用程序的配置信息,而在 …...
彻底卸载自己安装的python
一.彻底卸载自己安装的python Python3 安装完后,在系统中不同目录下存在各种依赖关系,若需卸载,需要一步步无残留完全卸载干净。 删除Python 3.7 框架,打开终端,输入 sudo rm -rf /Library/Frameworks/Python.frame…...
ES相关面试问题整理
索引模板了解么 索引模板,一种复用机制,就像一些项目的开发框架如 Laravel 一样,省去了大量的重复,体力劳动。当新建一个 Elasticsearch 索引时,自动匹配模板,完成索引的基础部分搭建。 模板定义…...
MytatisP详解
MP详解 一、基础使用1.引入2.Entry中的常用注解3.BaseMapper 、IService、ServiceImpl3.1BaseMapper 3.2IService、ServiceImpl 4.常用配置4.1 application.yml配置4.2 configuration 配置 5.Wrapper6.分页6.1使用分页方式一 7.自定义分页:查询指定列7.1 先用MP的分…...
设计符合REST原则的API可以遵循以下步骤
设计符合REST原则的API可以遵循以下步骤: 定义资源:首先需要将需要交换的数据抽象成资源,即可以将数据看作是一种资源,并且为每种资源定义一个唯一的标识符。 设计URL:使用短的、有意义的方式来表示资源的状态。例如&…...
编程助手成为编程高手,帮您正则调试
官方下载地址:安果移动 视频演示地址:编程助手-正则调试与面试题,升职加薪不是梦_哔哩哔哩_bilibili 编程助手成为编程高手,帮您正则调试 软件介绍版本号 1.0.2更新日期 2023-10-11 找工作不敢谈薪资?总觉得公司欠我…...
opencv 双目立体视觉
单目标定 1.先单目标定每个相机,获得单个相机内参,外参,畸变参数。 双目标定 2.然后双面标定 2.1 stereoCalibrate (标定函数): double stereoCalibrate(InputArrayOfArrays objectPoints, //世界坐标系 InputArrayOfArrays imagePoints1, //左图像点 InputArrayOfA…...
如何将jpg转化为png?
如何将jpg转化为png?可能有的小伙伴就会疑惑了,jpg和png都是图片常用的一种格式,为什么要进行格式的更改呢?那是因为PNG格式具有更好的图片质量和更少的失真。JPG(或JPEG)格式的图片通常是压缩过的…...
查看 SSH 登录失败日志
查看日志文件 cat /var/log/auth.log查看 SSH 登录失败的记录 grep "Failed password\|authentication failure" /var/log/auth.log...
竞赛选题 深度学习+opencv+python实现车道线检测 - 自动驾驶
文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 &am…...
MR混合现实模拟消防安全演练场景实训
混合现实(MR)是一种将虚拟世界与真实世界相结合的技术。它允许教师将数字元素融入实际场景,使学生在亲身体验中学习消防安全知识。这种方式不仅可以激发学生的学习兴趣,还能增强学生的记忆效果。 在MR的助力下,消防安全…...
geecg-uniapp 同源策略 数据请求 获取后台数据 进行页面渲染 ui库安装 冲突解决(3)
一,同源策略 (1)首先找到env 要是没有env 需要创建一个替换成后端接口 (2)因为他封装了 先找到 http 请求位置一级一级找 然后进行接口修改 (3)appUpdata 修改接口 运行即可 &#x…...
Krypton控件组使用之KryptonRibbon
1.去掉File按钮 2.去掉 Cutomize 菜单...
低压配电系统中浪涌保护器的作用,安装位置和接线方法
低压配电系统是指在变压器低压侧或用户侧的电气装置,主要用于向用户提供安全、可靠和经济的电能。低压配电系统中常见的电气设备有低压配电柜、分支箱、开关箱、插座、照明等。这些设备都需要防止因外部或内部原因产生的过电压对其造成损坏或影响其正常工作。过电压…...
OpenCV实现答题卡自动打分!
目录 1,主要原理以及函数介绍 全部代码,以 2 , 实现过程 3,结果展示 1,主要原理以及函数介绍 ap argparse.ArgumentParser() 创建一个ArgumentParser对象,并将其赋值给变量ap。这个对象可以接受我们的脚…...
Python编程必备:掌握列表遍历的6种神级技巧!
更多资料获取 📚 个人网站:涛哥聊Python 遍历列表是Python中最常见的任务之一,因为列表是一种非常常用的数据结构,它用于存储一组项目。 在编程中,经常需要对这些项目进行操作,例如查找特定元素ÿ…...
nodejs+vue校园失物招领平台
失物人可以在该平台中发布自己的拾物信息,本毕业设计题目将设计与实现一个基于校园的非商业行为的网上校园失物招领平台。并给出自己附加的各项条件, 失物招领管理系统主要分为两个部分,涉及前台和后台,然后由失主通过校园失物招…...
leetcode做题笔记171. Excel 表列序号
给你一个字符串 columnTitle ,表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 例如: A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ... 示例 1: 输入: columnTitle "A" 输出: 1示例 2: 输入: colu…...
SW曲面实体导出工程图
...
Docker的私有仓库部署——Harbor
Harbor 简介 一、什么是Harbor Harbor 是 VMware 公司开源的企业级 Docker Registry 项目, 其目标是帮助用户迅速搭建一个企业级的 Docker Registry 服务。 Harbor以 Docker 公司开源的 Registry 为基础, 提供了图形管理 UI 、基于角色的访问控制(Role…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...
goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...
Linux操作系统共享Windows操作系统的文件
目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项,设置文件夹共享为总是启用,点击添加,可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download(这是我共享的文件夹)&…...
