【spring】注解版

1.管理bean

之前我们要想管理bean都是在xml文件中将想要添加的bean手动添加进ioc容器中,这样太过麻烦了,在 Java 开发里,针对一些较为繁琐的操作,通常会有相应的简化方式,这个也不例外,就是spring提供的注解。

@Component

只需要把它写在想要放入ioc容器的bean所属的类上即可,在后面可以加上(value="")这个value的值就是相当于之前xml文件中bean标签里的id,可以直接把value去掉直接写上对应的值,毕竟就这一个值也不需要区分。当然你也可以选择什么都不加,那么此时默认的值就是改类名但是首部第一个字母一定要是小写。

还有一个很重要的细节别忘了,就是一定要在xml文件中配置扫描,旨在告诉spring要扫描的包因为ClassPathXmlApplicationContext初始化容器时会把xml文件中声明的标签下的类都创建到容器中。但 是因为bean.xml并不知道哪一个类加上注解了,所以无法创建对象。

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

base-package的值就是告诉com.xq一下的包都要扫描。 

该注解衍生出三个注解

@Controller:一般用在表现层。

@Service:一般用在业务。

@Repository:一般用在持久层。

其实它们跟@Component是一个用法,之所以这样分开是因为java写项目时是需要进行分层开发的

为了区分各个层,就用了这三个注解。

2.依赖注解

@Autowired

有一点要说明,它只能注入引用类型的bean

分三个场景来讲

构造函数注入

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;// 定义一个服务接口
interface MessageService {void sendMessage(String message);
}// 实现服务接口
@Component
class EmailService implements MessageService {@Overridepublic void sendMessage(String message) {System.out.println("Sending email: " + message);}
}// 使用 @Autowired 进行构造函数注入
@Component
class UserService {private final MessageService messageService;@Autowiredpublic UserService(MessageService messageService) {this.messageService = messageService;}public void notifyUser(String message) {messageService.sendMessage(message);}
}

在该代码中,类UserService依赖于MessageService,通过构造函数注入的方式,spring会自动将EmailService的实例注入到UserService中。

setter方法注入

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;// 定义一个服务接口
interface PaymentService {void processPayment(double amount);
}// 实现服务接口
@Component
class CreditCardPaymentService implements PaymentService {@Overridepublic void processPayment(double amount) {System.out.println("Processing credit card payment: " + amount);}
}// 使用 @Autowired 进行 Setter 方法注入
@Component
class OrderService {private PaymentService paymentService;@Autowiredpublic void setPaymentService(PaymentService paymentService) {this.paymentService = paymentService;}public void placeOrder(double amount) {paymentService.processPayment(amount);}
}

这里的OrderService通过setter方法注入了PaymentService实例。

字段注入 

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;// 定义一个服务接口
interface LoggingService {void log(String message);
}// 实现服务接口
@Component
class ConsoleLoggingService implements LoggingService {@Overridepublic void log(String message) {System.out.println("Logging to console: " + message);}
}// 使用 @Autowired 进行字段注入
@Component
class ProductService {@Autowiredprivate LoggingService loggingService;public void addProduct(String productName) {loggingService.log("Adding product: " + productName);}
}

 ProductService类中的loggingService被注入ConsoleLoggingService的实例,但是这里有一点要注意,万一接口有多个实现类呢,那这样就会报错,在识别时ioc容器会先先按照类型进行筛选,如果有多个相同类型的,然后用变量名作为bean的id继续筛选。

3.其他注入数据的注解

使用注入数据注解的效果跟在xml配置文件中的bean标签中写一个标签的作用是一样的.

@Qualifier:它可以在按照类中注入的基础之上再按照名称注入,但是它给类成员注入时不能单独使用,但是在给方法参数注入式可以。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;// 定义一个接口
interface Animal {void sound();
}// 实现接口
@Component("dog")
class Dog implements Animal {@Overridepublic void sound() {System.out.println("Woof!");}
}@Component("cat")
class Cat implements Animal {@Overridepublic void sound() {System.out.println("Meow!");}
}// 使用 @Autowired 和 @Qualifier 注入指定的 Bean
@Component
class AnimalService {private final Animal animal;@Autowired@Qualifier("dog")public AnimalService(Animal animal) {this.animal = animal;}public void makeSound() {animal.sound();}
}

将@Autowired和@Qualifier组合在一起,spring会根据类型和@Qualifier指定的名称从ioc容器中查找对应的bean并注入到AnimalService中。

@resource

它与@Autowired的注入策略相反,它是先看bean的id来筛选,因为它后面可以加(name=“”),再来看类型。

import javax.annotation.Resource;
import org.springframework.stereotype.Component;// 定义一个接口
interface Printer {void print();
}// 实现接口,并使用 @Component 指定 Bean 的名称为 "colorPrinter"
@Component("colorPrinter")
class ColorPrinter implements Printer {@Overridepublic void print() {System.out.println("Printing in color...");}
}// 使用 @Resource 按名称注入
@Component
class PrintingService {@Resource(name = "colorPrinter")private Printer printer;public void doPrinting() {printer.print();}
}

这里的@Resource直接指明了bean的id为colorPrinter,spring直接在ioc容器中寻找对应的bean,再将其注入到printer字段中。

@Value

用于注入基本数据类型和String类型,因为前面提到的那些只能注入引用数据类型。可以用在字段、构造函数参数或者方法参数上,用于注入值。

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class MyComponent {@Value("Hello, Spring!")private String message;@Value("123")private int number;public String getMessage() {return message;}public int getNumber() {return number;}
}

通过该注解,可以很方便的将各种外部值注入到spring管理的bean中。

4.改变作用域范围的注解

@Scope

类似于xml文件中的scope属性,它是用来注解一个类的

分别是

@Scope(value="singleton")单例bean

@Scope(value="prototype")多例bean

@Service("accountService")
@Scope(value = "prototype")
public class AccountServiceImpl implements AccountService {@Resource(name = "accountDao1")AccountDao accountDao1;public void addAccount() {accountDao1.addAccount();}
}public class TestAccount {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");AccountService accountService1 = (AccountService) context.getBean("accountService");AccountService accountService2 = (AccountService) context.getBean("accountService");System.out.println(accountService1==accountService2);}
}

根据注解显示创建的是多例bean,所以输出为false。、

5.生命周期相关的注解

使用与生命周期相关的注解的作用跟在bean标签中使用init-method和destroy-method的作用是一样 的。

@PreDestroy 作用:用于指定销毁方法。

@PostConstruct 作用:用于指定初始化方法。

代码就不写了,没啥写的,无非就是在相应的方法上加上相应的注解。

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

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

相关文章

RV1126+FFMPEG多路码流监控项目

一.项目介绍&#xff1a; 本项目采用的是易百纳RV1126开发板和CMOS摄像头&#xff0c;使用的推流框架是FFMPEG开源项目。这个项目的工作流程如下(如上图)&#xff1a;通过采集摄像头的VI模块&#xff0c;再通过硬件编码VENC模块进行H264/H265的编码压缩&#xff0c;并把压缩后的…

13.IIC-EEPROM(AT24C02)

1.为什么需要EEPROM? 在单片机开发中&#xff0c;断电数据保存是常见的需求。例如&#xff0c;智能家居设备的用户设置、电子秤的校准参数等都需要在断电后仍能保留。AT24C02作为一款IIC接口的EEPROM芯片&#xff0c;具备以下优势&#xff1a; 非易失性存储&#xff1a;断电后…

ubuntu22.04安装P104-100一些经验(非教程)

一、版本&#xff1a; 系统&#xff1a;ubuntu-22.04.5-desktop-amd64.iso Nvidia 驱动&#xff1a;NVIDIA-Linux-x86_64-570.124.04.run。官网下载即可 二、经验 1、通用教程⭐ 直接关键词搜“ubuntu p104”会有一些教程&#xff0c;比如禁用nouveau等 安装参考&#xff1a…

TCP7680端口是什么服务

WAF上看到有好多tcp7680端口的访问信息 于是上网搜索了一下&#xff0c;确认TCP7680端口是Windows系统更新“传递优化”功能的服务端口&#xff0c;个人理解应该是Windows利用这个TCP7680端口&#xff0c;直接从内网已经具备更新包的主机上共享下载该升级包&#xff0c;无需从微…

OSI七大模型 --- 发送邮件

我想通过电子邮件发送一张照片给我的朋友。从我开始写邮件到发送成功&#xff0c;按照这个顺序讲一下我都经历了OSI模型的哪一层&#xff0c;对应的层使用了什么样的协议&#xff1f; 完整流程示例&#xff08;补充物理层细节&#xff09; 假设你通过Wi-Fi发送邮件&#xff1a…

LINUX网络基础 [一] - 初识网络,理解网络协议

目录 前言 一. 计算机网络背景 1.1 发展历程 1.1.1 独立模式 1.1.2 网络互联 1.1.3 局域网LAN 1.1.4 广域网WAN 1.2 总结 二. "协议" 2.1 什么是协议 2.2 网络协议的理解 2.3 网络协议的分层结构 三. OSI七层模型&#xff08;理论标准&#xff09; …

【LLms】关键词提取

1. 停用词 在文本处理和信息检索领域&#xff0c;停用词&#xff08;Stop Words&#xff09;是指在文本中出现频率较高&#xff0c;但通常不包含实际语义信息或对语义理解贡献较小的词汇。这些词汇通常是一些常见的功能词&#xff0c;如冠词、介词、连词、代词、感叹词、助动词…

1998-2022年各地级市三次产业占比/地级市国内生产总值构成/地级市第一产业占比、第二产业占比、第三产业占比数据(全市)

1998-2022年各地级市三次产业占比/地级市国内生产总值构成/地级市第一产业占比、第二产业占比、第三产业占比数据&#xff08;全市&#xff09; 1、时间&#xff1a;1998-2022年 2、指标&#xff1a;第一产业占比、第二产业占比、第三产业占比 3、来源&#xff1a;城市统计年…

基于STM32的简易出租车计费设计(Proteus仿真+程序+设计报告+原理图PCB+讲解视频)

这里写目录标题 1.主要功能资料下载链接&#xff1a;2.仿真3. 程序4. 原理图PCB5. 实物图6. 设计报告7. 下载链接 基于STM32的简易出租车计费设计(Proteus仿真程序设计报告原理图PCB讲解视频&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1…

HAL库启动ADC的三个函数的区别

HAL_ADC_Start 应该是启动ADC转换的最基本函数。只是启动一次转换&#xff0c;然后需要用户自己去查询转换是否完成&#xff0c;或者可能只是单次转换。比如&#xff0c;当调用这个函数后&#xff0c;ADC开始转换&#xff0c;但程序需要不断检查某个标志位来看转换是否完成&am…

EXIT原理和使用

要用到的控制器NVIC(中断总控制器)、EXIT&#xff08;外部中断控制器&#xff09; (EXIT是NVIC是下属) GPIO外部中断简图 EXIT的基本概念 EXIT主要特性 EXTI工作原理框图&#xff08;从输入线开始看&#xff09; 6个寄存器 EXTI和IO的映射关系 AFIO简介 EXTI与IO对应关系 如…

经典核密度估计(Kernel Density Estimation):从直觉到数学

经典核密度估计&#xff08;Kernel Density Estimation&#xff09;&#xff1a;从直觉到数学 作为一名在大模型时代进入深度学习领域的研究者&#xff0c;你可能对 Transformer、扩散模型等现代技术驾轻就熟。然而&#xff0c;在阅读一些生成模型的文献&#xff08;如 Explic…

Halcon 算子 一维码检测识别、项目案例

首先我们要明白码的识别思路 把窗口全部关闭读取新的图片图像预处理创建条码模型设置模型参数搜索模型获取条码结果显示条码结果 图像预处理和条码增强 对比度太低&#xff1a; scale_image&#xff08;或使用外部程序scale_image_range&#xff09;,增强图像的对比度图像模糊…

vue-cli3+vue2+elementUI+avue升级到vite+vue3+elementPlus+avue总结

上一个新公司接手了一个vue-cli3vue2vue-router3.0elementUI2.15avue2.6的后台管理项目&#xff0c;因为vue2在2023年底已经不更新维护了&#xff0c;elementUI也只支持到vue2&#xff0c;然后总结了一下vue3的优势&#xff0c;最后批准升级成为了vitevue3vue-router4.5element…

SpringBoot实战(三十五)微服务集成OAuth2.0(UAA)

目录 一、知识回顾1.1 什么是 OAuth2 协议&#xff1f;1.2 OAuth2 的4个角色1.3 OAuth2 的3种令牌1.4 OAuth2 的5种认证方式1.5 OAuth2 内置接口地址 二、UAA介绍2.1 概述2.2 UAA的主要功能2.3 UAA 的应用场景 三、微服务集成3.1 集成示例介绍3.2 集成测试 一、知识回顾 在进行…

红果短剧安卓+IOS双端源码,专业短剧开发公司

给大家拆解一下红果短剧/河马短剧&#xff0c;这种看光解锁视频&#xff0c;可以挣金币的短剧APP。给大家分享一个相似的短剧APP源码&#xff0c;这个系统已接入穿山甲广告、百度广告、快手广告、腾讯广告等&#xff0c;类似红果短剧的玩法&#xff0c;可以看剧赚钱&#xff0c…

从0开始的操作系统手搓教程23:构建输入子系统——实现键盘驱动1——热身驱动

目录 所以&#xff0c;键盘是如何工作的 说一说我们的8042 输出缓冲区寄存器 状态寄存器 控制寄存器 动手&#xff01; 注册中断 简单整个键盘驱动 Reference ScanCode Table 我们下一步就是准备进一步完善我们系统的交互性。基于这个&#xff0c;我们想到的第一个可以…

百度SEO关键词布局从堆砌到场景化的转型指南

百度SEO关键词布局&#xff1a;从“堆砌”到“场景化”的转型指南 引言 在搜索引擎优化&#xff08;SEO&#xff09;领域&#xff0c;关键词布局一直是核心策略之一。然而&#xff0c;随着搜索引擎算法的不断升级和用户需求的多样化&#xff0c;传统的“关键词堆砌”策略已经…

Python ❀ Unix时间戳转日期或日期转时间戳工具分享

设计一款Unix时间戳和日期转换工具&#xff0c;其代码如下&#xff1a; from datetime import datetimeclass Change_Date_Time(object):def __init__(self, date_strNone, date_numNone):self.date_str date_strself.date_num date_num# 转时间戳def datetime2timestamp(s…

【目标检测】【NeuralPS 2023】Gold-YOLO:通过收集与分发机制实现的高效目标检测器

Gold-YOLO&#xff1a; Efficient Object Detector via Gather-and-Distribute Mechanism Gold-YOLO&#xff1a;通过收集与分发机制实现的高效目标检测器 0.论文摘要 在过去的几年中&#xff0c;YOLO系列模型已成为实时目标检测领域的领先方法。许多研究通过修改架构、增强数…