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

基于注解管理Bean

一、介绍

从 Java 5 开始,Java 增加了对注解(Annotation)的支持,它是代码中的一种特殊标记,可以在编译、类加载和运行时被读取,执行相应的处理。开发人员可以通过注解在不改变原有代码和逻辑的情况下,在源代码中嵌入补充信息。
Spring 从 2.5 版本开始提供了对注解技术的全面支持,我们可以使用注解来实现自动装配,简化 Spring 的 XML 配置。
Spring 通过注解实现自动装配的步骤如下:
引入依赖
开启组件扫描
使用注解定义 Bean
依赖注入

二、子模块spring6-ioc-annotation

**①搭建模块**搭建方式如:spring6-ioc-xml**②引入配置文件**引入spring-ioc-xml模块日志log4j2.xml**③添加依赖**```xml
<dependencies><!--spring context依赖--><!--当你引入Spring Context依赖之后,表示将Spring的基础依赖引入了--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.0.3</version></dependency><!--junit5测试--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId></dependency><!--log4j2的依赖--><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.19.0</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j2-impl</artifactId><version>2.19.0</version></dependency>
</dependencies>
```

三、开启组件扫描

Spring 默认不使用注解装配 Bean,因此我们需要在 Spring 的 XML 配置中,通过 context:component-scan 元素开启 Spring Beans的自动扫描功能。开启此功能后,Spring 会自动从扫描指定的包(base-package 属性设置)及其子包下的所有类,如果类上使用了 @Component 注解,就将该类装配到容器中。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--开启组件扫描功能--><context:component-scan base-package="com.wsy"></context:component-scan>
</beans
**情况一:最基本的扫描方式**```xml
<context:component-scan base-package="com.wsy">
</context:component-scan>
```**情况二:指定要排除的组件**```xml
<context:component-scan base-package="com.atguigu.spring6"><!-- context:exclude-filter标签:指定排除规则 --><!-- type:设置排除或包含的依据type="annotation",根据注解排除,expression中设置要排除的注解的全类名type="assignable",根据类型排除,expression中设置要排除的类型的全类名--><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/><!--<context:exclude-filter type="assignable" expression="com.wsy.controller.UserController"/>-->
</context:component-scan>
```**情况三:仅扫描指定组件**```xml
<context:component-scan base-package="com.atguigu" use-default-filters="false"><!-- context:include-filter标签:指定在原有扫描规则的基础上追加的规则 --><!-- use-default-filters属性:取值false表示关闭默认扫描规则 --><!-- 此时必须设置use-default-filters="false",因为默认规则即扫描指定包下所有类 --><!-- type:设置排除或包含的依据type="annotation",根据注解排除,expression中设置要排除的注解的全类名type="assignable",根据类型排除,expression中设置要排除的类型的全类名--><context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/><!--<context:include-filter type="assignable" expression="com.wsy.controller.UserController"/>-->
</context:component-scan>
```

四、使用注解定义 Bean

Spring 提供了以下多个注解,这些注解可以直接标注在 Java 类上,将它们定义成 Spring Bean。

注解

说明

@Component

该注解用于描述 Spring 中的 Bean,它是一个泛化的概念,仅仅表示容器中的一个组件(Bean),并且可以作用在应用的任何层次,例如 Service 层、Dao 层等。 使用时只需将该注解标注在相应类上即可。

@Repository

该注解用于将数据访问层(Dao 层)的类标识为 Spring 中的 Bean,其功能与 @Component 相同。

@Service

该注解通常作用在业务层(Service 层),用于将业务层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。

@Controller

该注解通常作用在控制层(如SpringMVC 的 Controller),用于将控制层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。

4.1实验一:@Autowired注入

①场景一:属性注入

创建UserDao接口


​
publicinterfaceUserDao {
​publicvoidprint();
}

创建UserDaoImpl实现

importorg.springframework.stereotype.Repository;
​
@Repository
publicclassUserDaoImplimplementsUserDao {
​@Overridepublicvoidprint() {System.out.println("Dao层执行结束");}
}

创建UserService接口

packagecom.atguigu.spring6.service;
​
publicinterfaceUserService {
​publicvoidout();
}

创建UserServiceImpl实现类

importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Service;
​
@Service
publicclassUserServiceImplimplementsUserService {
​@AutowiredprivateUserDaouserDao;
​@Overridepublicvoidout() {userDao.print();System.out.println("Service层执行结束");}
}

创建UserController类


importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Controller;
​
@Controller
publicclassUserController {
​@AutowiredprivateUserServiceuserService;
​publicvoidout() {userService.out();System.out.println("Controller层执行结束。");}
​
}

测试一

    @Testpublic void testAutowired(){ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");UserController userController = ac.getBean("userController",UserController.class);userController.addController();}

测试结果:

②场景二:set注入
 @Autowiredprivate UserService userService;

改造

 private UserService userService;@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}
③场景三:构造方法注入
 private UserService userService;@Autowiredpublic UserController(UserService userService) {this.userService = userService;}
④场景四:形参上注入
 public UserController(@Autowired UserService userService) {this.userService = userService;}
⑤场景五:只有一个构造函数,无注解
    private UserDao userDao;public UserServiceImpl(UserDao userDao) {this.userDao = userDao;}
⑥场景六:@Autowired注解和@Qualifier注解联合
多个实现类,使用@qualifier进行注入
@Autowired
@Qualifier("userDaoImpl") // 指定bean的名字
private UserDao userDao;

4.2实验二:@Resource注入

@Resource注解也可以完成属性注入。那它和@Autowired注解有什么区别?

  • @Resource注解是JDK扩展包中的,也就是说属于JDK的一部分。所以该注解是标准注解,更加具有通用性。(JSR-250标准中制定的注解类型。JSR是Java规范提案。)

  • @Autowired注解是Spring框架自己的。

  • @Resource注解默认根据名称装配byName,未指定name时,使用属性名作为name。通过name找不到的话会自动启动通过类型byType装配。

  • @Autowired注解默认根据类型装配byType,如果想根据名称装配,需要配合@Qualifier注解一起用。

  • @Resource注解用在属性上、setter方法上。

  • @Autowired注解用在属性上、setter方法上、构造方法上、构造方法参数上。

@Resource注解属于JDK扩展包,所以不在JDK当中,需要额外引入以下依赖:【如果是JDK8的话不需要额外引入依赖。高于JDK11或低于JDK8需要引入以下依赖。

<dependency><groupId>jakarta.annotation</groupId><artifactId>jakarta.annotation-api</artifactId><version>2.1.1</version>
</dependency>
@Resource注解:默认byName注入,没有指定name时把属性名当做name,根据name找不到时,才会byType注入。byType注入时,某种类型的Bean只能有一个

相关文章:

基于注解管理Bean

一、介绍从 Java 5 开始&#xff0c;Java 增加了对注解&#xff08;Annotation&#xff09;的支持&#xff0c;它是代码中的一种特殊标记&#xff0c;可以在编译、类加载和运行时被读取&#xff0c;执行相应的处理。开发人员可以通过注解在不改变原有代码和逻辑的情况下&#x…...

Containerd 的 Bug 导致容器被重建!如何避免?

作者简介邓宇星&#xff0c;SUSE Rancher 中国区软件架构师&#xff0c;6 年云原生领域经验&#xff0c;参与Rancher 1.x 到 Rancher 2.x 版本迭代&#xff0c;目前负责 Rancher For openEuler(RFO) 项目开发。最近我们关注到一个关于 containerd 运行时的 issue(​​https://g…...

win环境安装部署Jenkins

win环境安装部署Jenkins&#xff0c;2022年11月&#xff1a;从2022年 6 月 28 日发布的 Jenkins 2.357 和2022年9 月发布的 LTS 版本开始&#xff0c;Jenkins 需要 Java 11 才能使用&#xff0c;放弃 Java 8&#xff0c;如果用JDK1.8&#xff0c;那么Jenkins版本需要是2.357版本…...

网络变压器与不同芯片之间的匹配原则及POE通讯产品需要注意哪些方面

Hqst盈盛电子导读&#xff1a;网络变压器与不同芯片之间的匹配原则及POE通讯产品需要注意哪些方面网络变压器与不同芯片之间的匹配原则&#xff1a;一&#xff0c;电流型PHY芯片一般要配的网络变压器&#xff1a;1、变压器PHY侧3线共模电感 &#xff08;更适合POE产品&#xff…...

Spring WebFlux

目录 基于注解编程模型 函数式编程模型 传统的基于Servlet的Web框架,如Spring MVC,在本质上都是阻塞和多线程的,每个连接都会使用一个线程。在请求处理的时候,会在线程池中拉取一个工作者( worker )线程来对请求进行处理。同时,请求线程是阻塞的,直到工作者线程提示它已…...

C++基础面试题:new和malloc的区别

面试题&#xff1a;new和malloc的区别或new和malloc的异同 相同点&#xff1a; 1、new/delete和malloc/free它们都是内存申请和释放的函数。 2、new/delete和malloc/free 都要一一对应&#xff0c;调用了多少次new 就需要调用多少次delete&#xff1b;同 理调用多少次ma…...

WebDAV之葫芦儿·派盘+KMPlayer

KMPlayer 支持WebDAV方式连接葫芦儿派盘。 KMPlayer几乎可以播放您系统上所有的影音文件,支持几乎全部音视频格式。通过其强大的插件功能,可以支持层出不穷的新格式。软件还具有齐全的操控功能,支持捕获音频、捕获AVI、捕获画面、外挂字幕、自定义编辑设置,是视频爱好者的不…...

杨浦区人工智能及大数据(云计算)企业登记工作(2023年度)的通知

各相关单位&#xff1a; 根据《“长阳秀带”在线新经济产业集聚发展若干政策》&#xff08;杨府发〔2022〕2号&#xff09;及其实施细则的要求&#xff0c;现组织开展2023年度杨浦区人工智能与大数据(云计算&#xff09;企业登记备案工作,现将相关工作通知如下&#xff1a; 一…...

2023年去培训机构学前端还是Java?

选择专业肯定是优先考虑更有发展前景和钱途的专业。毕竟IT专业的培训费都不低&#xff0c;基本都要一两万左右&#xff0c;咱们花钱总是希望获得最大回报。 那么到底哪个更有发展前景呢&#xff1f; 零基础能学得会吗&#xff1f; 就业薪资如何呢&#xff1f; 前言 不知道大家有…...

【React】组件事件

React(二) 创建组件 函数组件 函数组件&#xff1a;使用JS的函数或者箭头函数创建的组件 使用 JS 的函数(或箭头函数)创建的组件&#xff0c;叫做函数组件约定1&#xff1a;函数名称必须以大写字母开头&#xff0c;React 据此区分组件和普通的 HTML约定2&#xff1a;函数组…...

黑/白盒测试说明

白盒测试白盒测试也称结构测试或逻辑驱动测试&#xff0c;它是按照程序内部的结构测试程序&#xff0c;通过测试来检测产品内部动作是否按照设计规格说明书的规定正常进行&#xff0c;检验程序中的每条通路是否都能按预定要求正确工作。白盒测试的测试方法有代码检查法、静态结…...

车道线检测-Eigenlanes 论文学习笔记

论文&#xff1a;《Eigenlanes: Data-Driven Lane Descriptors for Structurally Diverse Lanes》 代码&#xff1a;https://github.com/dongkwonjin/Eigenlanes 核心&#xff1a;在 Eigenlane Space 中检测车道线 创新点 Eigenlane&#xff1a;数据驱动的车道描述符&#xff…...

docker run mysql -e 的环境变量 Environment Variables

例子 sudo docker run -itd --name DockerMysqlLatest3307 -p 3307:3306 -e MYSQL_ROOT_PASSWORDroot的密码 mysql:latest### root无密码 sudo docker run -itd --name Mysql57 -p 57:3306 -e MYSQL_ALLOW_EMPTY_PASSWORDroot mysql:5.7https://hub.docker.com/_/mysql?tabde…...

第17章 MongoDB 条件操作符教程

第17章 MongoDB 条件操作符教程 描述 条件操作符用于比较两个表达式并从mongoDB集合中获取数据。 在本章节中&#xff0c;咱们将讨论如何在MongoDB中使用条件操作符。 MongoDB中条件操作符有&#xff1a; (>) 大于 - $gt(<) 小于 - $lt(>) 大于等于 - $gte(< …...

电子技术——共源共栅放大器

电子技术——共源共栅放大器 之前我们提到过&#xff0c;提高基础增益单元&#xff08;共源放大器&#xff09;的一种方法是提高其 ror_oro​ 的阻值&#xff0c;之后我们学过共栅放大器作为电流缓冲器可以做到这一点&#xff0c;自然地我们就得到了终极解决方案&#xff0c;也…...

《MySQL学习》 事务隔离 与 MVCC

《MySQL学习》 事务隔离 一.事务的概念 事务保证一组数据要么全部成功要么全部失败&#xff0c;MySQL的事务基于引擎&#xff08;如InnoDB&#xff09;实现。 二.事务的隔离性与隔离级别 MySQL的标准隔离级别&#xff1a; 读未提交 &#xff1a; 一个事务还没提交时&#…...

html(二)基础标签

一 HTML中的注释 重点&#xff1a; 在哪写注释? 注释的形式? vs code和webstorm都可以通过 ctrl / 进行单行注释和取消注释 ① html中注释的形式 1) html文档中单行和多行注释是"<!-- -->" -->html2) 在html文档中,script标签…...

leetcode刷题---递归思想

leetcode刷题---递归思想&#xff09;1.1 递归介绍1.2 基本步骤1.3 代表题目1.3.1 入门题---青蛙跳1.3.2.1 初级题226.翻转二叉树112.路径总和1.3.3 中级题---汉诺塔问题1.3.4 进阶题---细胞分裂1.1 递归介绍 如果在函数中存在着调用函数本身的情况&#xff0c;这种现象就叫递…...

ThreadLocal 源码级别详解

ThreadLocal简介 稍微翻译一下&#xff1a; ThreadLocal提供线程局部变量。这些变量与正常的变量不同&#xff0c;因为每一个线程在访问ThreadLocal实例的时候&#xff08;通过其get或set方法&#xff09;都有自己的、独立初始化的变量副本。ThreadLocal实例通常是类中的私有静…...

训练营day17

110.平衡二叉树 力扣题目链接 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a;一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,null,15,7] 返回 true 。 示…...

避开C2000开发第一个坑:TMS320F28069的InitSysCtrl()函数里,为什么ADC时钟要开一下又关?

TMS320F28069开发揭秘&#xff1a;ADC时钟瞬启瞬闭背后的硬件校准逻辑 在TMS320F28069的InitSysCtrl()初始化函数中&#xff0c;有一段看似矛盾的代码操作&#xff1a;先启用ADC时钟&#xff0c;调用(*Device_cal)()函数后立即关闭。这个"开关ADC时钟"的瞬态操作绝非…...

如何实现一个延迟队列?

1. 基于 Sorted Set (ZSet) 的实现 这是最轻量级、最原生的 Redis 延迟队列实现方式。 核心思想&#xff1a;利用 ZSet 可以根据 score 进行排序的特性。我们将任务的预期执行时间戳作为 score&#xff0c;任务的具体内容&#xff08;或任务 ID&#xff09;作为 member。 生产…...

算法21,搜索插入位置

一道经典的二分查找应用题&#xff0c;通常被称为“搜索插入位置”。笔记中的思路非常清晰&#xff0c;下面为你整理这道题的具体解法、代码实现以及需要注意的细节。1. 题目理解题目描述&#xff1a;给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并…...

OpenClaw 汉化版 Windows 一键安装指南|零基础 5 分钟部署 告别命令行

前言 在本地部署 AI 智能体时&#xff0c;英文界面晦涩、命令行操作复杂、环境配置繁琐&#xff0c;是很多零基础用户的三大痛点。OpenClaw 汉化中文版专为国内用户优化&#xff0c;采用全中文图形化界面 免环境配置 一键部署设计&#xff0c;全程无任何命令行操作&#xff…...

不止于仿真:将Simulink开关电源模型与实物参数对标(以48V反激电源为例)

从虚拟到现实&#xff1a;Simulink开关电源仿真与工程落地的深度校准指南 在电力电子设计领域&#xff0c;仿真工具早已成为工程师的左膀右臂。Simulink凭借其直观的模块化界面和强大的计算引擎&#xff0c;让复杂的开关电源设计变得可视化。然而&#xff0c;当仿真波形完美呈现…...

ExplorerPatcher架构解析:深度剖析Windows界面定制引擎

ExplorerPatcher架构解析&#xff1a;深度剖析Windows界面定制引擎 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher ExplorerPatcher作为Window…...

明日方舟基建自动化终极方案:Arknights-Mower 智能管理工具完全指南

明日方舟基建自动化终极方案&#xff1a;Arknights-Mower 智能管理工具完全指南 【免费下载链接】arknights-mower 《明日方舟》长草助手 项目地址: https://gitcode.com/gh_mirrors/ar/arknights-mower 还在为《明日方舟》中繁琐的基建管理而苦恼吗&#xff1f;每天需要…...

ExplorerPatcher完整指南:轻松定制Windows界面,打造专属工作环境

ExplorerPatcher完整指南&#xff1a;轻松定制Windows界面&#xff0c;打造专属工作环境 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher 还在为…...

工程人福音!一键提取图纸文字,告别手动打字

建筑工程施工管理工作中&#xff0c;涉及大量文书资料编制&#xff0c;涵盖施工组织设计、专项施工方案、各类报告文件、招投标技术标撰写、项目概况说明、工程量清单项目特征描述等诸多文字内容。此类资料编辑工作量大、耗时费力&#xff0c;人工录入不仅效率低下&#xff0c;…...

GitHub 开源育儿知识库:技术型父母如何用 Awesome List 构建科学育儿体系

1. 项目概述&#xff1a;一个为新手父母量身定制的技能宝库当一个小生命降临&#xff0c;新手父母们常常会陷入一种既幸福又焦虑的复杂情绪中。幸福自不必说&#xff0c;那份焦虑则大多源于“未知”——面对一个不会说话、只会用哭声表达一切的小家伙&#xff0c;如何判断他是饿…...