【Spring】注解

文章目录

  • 1. 前言
  • 2.注解开发的准备工作
  • 3. IOC相关注解
    • DI相关注解
  • 4. DI相关注解
    • 4.1 @Value
    • 4.2 @AutoWired
    • 4.3 @Qualifier
  • 5. xml配置文件相关注解
    • 5.1 @Configuration
    • 5.2 @ComponensScan
  • 6.@Bean注解
  • 7. @PropertySource

1. 前言

Spring支持使用注解代替xml配置,注解开发可以简化配置.
注解和XML配置文件的对比:

  • 注解相对于XML配置的优点主要体现在编写的简洁性和代码量的减少上。由于注解直接写在源代码中,使得代码看起来更直观和清晰。不过,这也是注解的一个缺点,即一旦需要在源代码中进行维护或修改,就必须改动源代码,并重新编译和部署。
  • 相比之下,XML配置有其独特的优势。首先,XML是集中式的元数据,不需要与代码绑定,这使得我们可以独立于源代码进行配置修改,而无需重新编译和部署。其次,使用XML可以进行灵活的配置调整,并且当需要对软件进行扩展时,利用XML可以方便地实现。此外,XML还具有较好的可读性和易懂性。

2.注解开发的准备工作

如果要使用注解开发必须要开始组件扫描,这样加了注解的类才能被扫描出来,Spring才能去解析其中的注解

如下:

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

这样Spring就能够扫描com.example包下所有的类

3. IOC相关注解

@Component @Controller @Service @Repository 这四个注解都可以加到类上

他们都可以起到类似bean标签的作用。可以把加了该注解类的对象放入Spring容器中.实际再使用时选择任意一个都可以。但是后3个注解是语义化注解。

示例:

在之前管理bean对象都是使用xml配置文件中bean标签来管理的,例如:

<bean class="com.example.entity.Student" id="student"></bean>

如今学习了注解,就可以使用注解来代替xml配置文件了

如下:

@Data
@AllArgsConstructor
@Component("student")
public class Student {private int age;private String name;public Student() {System.out.println("执行了空参构造方法");}
}

只需要添加一个注解,并加上标识就可以了. 同样可以获取到bean对象
在这里插入图片描述
⭐注意不要忘记加注解扫描以及确认路径是否正确

虽然说上面四个注解用法是相同的,但也不要随便用,就像变量名不能随便取一样:

  • 如果是Service类要求使用@Service。
  • 如果是Dao类要求使用@Repository
  • 如果是Controllerl类(SpringMVC中会学习到)要求使用@Controller
  • 如果是其他类可以使用@Component

DI相关注解

4. DI相关注解

DI依赖注入就是要让Spring来给Bean对象的属性进行赋值,可以使用注解来完成

4.1 @Value

主要用于String,int等可以直接赋值的属性注入。

示例1:

@Component("student")
public class Student {@Value("20")private int age;@Value("张三")private String name;public Student() {System.out.println("执行了空参构造方法");}
}

在这里插入图片描述
用法并不难,就不多说了

⭐注意:@Value注解并不需要setter方法,但支持SpEL表达式

示例2:

@Component("student")
public class Student {@Value("#{20+6}")private int age;@Value("张三")private String name;public Student() {System.out.println("执行了空参构造方法");}
}

在这里插入图片描述

4.2 @AutoWired

@Autowired用于自动装配bean。它可以应用于字段、setter方法和构造函数上。当一个类被Spring容器管理时,可以使用@Autowired注解来注入其他bean

@Value注入的都是一些简单类型的值,如果Student中有其它类的实例,要如何注入? 这时候就需要用到@AutoWired注解

示例:

@Component("student")
public class Student {@Value("#{20+6}")private int age;@Value("张三")private String name;@Autowiredprivate StudentDao studentDao;public Student() {System.out.println("执行了空参构造方法");}
}

⭐需要注意的是:当一个类被Spring容器管理时,才可以使用@Autowired注解来注入其他bean

@Repository
public class StudentDao {@Value("111")private int num;
}

在这里插入图片描述

接下来介绍**@AutoWired中的属性**
在这里插入图片描述

默认值为true.

如果required属性值为false,那么即使要被注入的类没有被Spring容器管理,也不会报错

示例:

@Component("student")
public class Student {@Value("#{20+6}")private int age;@Value("张三")private String name;@Autowired(required = false)private StudentDao studentDao;public Student() {System.out.println("执行了空参构造方法");}
}
//@Repository
public class StudentDao {@Value("111")private int num;
}

在这里插入图片描述

4.3 @Qualifier

如果相同类型的bean在容器中有多个时,单独使用@AutoWired就不能满足要求,这时候可以再加上
@Qualifier来指定bean的名字从容器中获取bean注入。

⭐注意:@Qualifier是不能单独使用的

5. xml配置文件相关注解

上面的注解中,虽然可以使用注解替换掉bean,但是xml配置文件还在,接下来学习的注解就可以把xml配置文件替换掉

5.1 @Configuration

标注在类上,表示当前类是一个配置类。我们可以用注解类来完全替换掉xml配置文件。
⭐注意: 如果使用配置类替换了xml配置,spring容器要使用: AnnotationConfigApplicationContext

5.2 @ComponensScan

@ComponensScan 可以用来代替context:component-scan标签来配置组件扫描,@ComponensScan中的basePackages属性用于指定需要扫描的基础包路径。

示例:

@Configuration
@ComponentScan(basePackages = "com.example")
public class ApplicationConfig {
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component("student")
public class Student {@Value("#{20+6}")private int age;@Value("张三")private String name;
}

在这里插入图片描述

注意这里的Spring容器类型,以及创建实例时,传递的参数是配置类的字节码文件

6.@Bean注解

@Bean可以用来代替bean标签,主要用于第三方类的注入

例如之前的jdbc的数据源,像这种对象就不能使用注解进行配置,因为这些类的源码是在jar包里的.
在这里插入图片描述
这时就可以用@Bean注解

@Configuration
@ComponentScan(basePackages = "com.example")
public class ApplicationConfig {@Bean("dataSource")public DataSource getDataSource(){DataSource dataSource = new MysqlDataSource();((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false;");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("123456");return dataSource;}
}

此时就可以通过getBean方法传入dataSource来获取数据源对象
在这里插入图片描述

7. @PropertySource

可以用来代替context:property-placeholder,让Spring读取指定的properties文件。
然后可以使用@Value来获取读取到的值。

示例:

jdbc.properties文件:

jdbc.url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false;
jdbc.user=root
jdbc.password=123123

配置类:

@Configuration
@ComponentScan(basePackages = "com.example")
@PropertySource("jdbc.properties")
public class ApplicationConfig {@Value("${jdbc.url}")private String url;@Value("${jdbc.user}")private String user;@Value("${jdbc.password}")private String password;@Beanpublic DataSource getDataSource(){DataSource dataSource = new MysqlDataSource();((MysqlDataSource)dataSource).setURL(url);((MysqlDataSource)dataSource).setUser(user);((MysqlDataSource)dataSource).setPassword(password);return dataSource;}
}

在这里插入图片描述
由上述结果可以看出properties文件中的键值对已经成功被读取到了

⭐注意: 使用@Value来获取读取到的值时,使用的是${}

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

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

相关文章

NSSCTF web刷题记录4

文章目录 [NSSRound#4 SWPU]1zweb(revenge)[强网杯 2019]高明的黑客[BJDCTF 2020]Cookie is so subtle![MoeCTF 2021]fake game[第五空间 2021]PNG图片转换器[ASIS 2019]Unicorn shop[justCTF 2020]gofs[UUCTF 2022 新生赛]phonecode[b01lers 2020]Life On Mars[HZNUCTF 2023 f…

Educational Codeforces Round 2 D 计算几何

题目链接&#xff1a;Educational Codeforces Round 2 D 题目 给你两个圆。求它们相交处的面积。 输入 第一行包含三个整数 x1, y1, r1 (  - 109 ≤ x1, y1 ≤ 109, 1 ≤ r1 ≤ 109 ) - 第一个圆的圆心位置和半径。 第二行包含三个整数 x2, y2, r2 (  …

【Pytorch】计算机视觉项目——卷积神经网络CNN模型识别图像分类

目录 一、前言二、CNN可视化解释器1. 卷积层工作原理 三、详细步骤说明1. 数据集准备2.DataLoader3. 搭建模型CNN3.1 设置设备3.2 搭建CNN模型3.3 设置loss 和 optimizer3.4 训练和测试循环 4. 模型评估和结果输出 一、前言 在上一篇笔记《【Pytorch】整体工作流程代码详解&am…

虚析构函数

1)类指针指向本身的对象 Son *xiaoming new Son; delete xiaoming; 构造及析构顺序&#xff1a; 父类构造 子类构造&#xff1b; 子类析构&#xff1b; 父类析构。 2)父类指针指向子类对象,&#xff0c;父类析构函数不是虚函数 Father *father new Son; delete f…

YOLOv5源码中的参数超详细解析(5)— 验证部分(val.py)参数解析

前言:Hello大家好,我是小哥谈。YOLOv5是一种先进的目标检测算法,它可以实现快速和准确的目标检测。在YOLOv5源码中,train.py和detect.py文件讲完了之后,接着就是讲val.py文件了。本节课就结合源码对val.py文件进行逐行解析~!🌈 前期回顾: YOLOv5源码中的参数超详细解…

RK3566上运行yolov5模型进行图像识别

一、简介 本文记录了依靠RK官网的文档&#xff0c;一步步搭建环境到最终在rk3566上把yolov5 模型跑起来。最终实现的效果如下&#xff1a; 在rk3566 板端运行如下app&#xff1a; ./rknn_yolov5_demo model/RK356X/yolov5s-640-640.rknn model/bus.jpg其中yolov5s-640-640.r…

GPT学习笔记

百度的文心一言 阿里的通义千问 通过GPT能力&#xff0c;提升用户体验和产品力 GPT的出现是AI的iPhone时刻。2007年1月9日&#xff0c;第一代iPhone发布&#xff0c;开启移动互联网时代。新一轮的产业革命。 GPT模型发展时间线&#xff1a; Copilot - 副驾驶 应用&#xf…

基于DevEco Studio的OpenHarmony应用原子化服务(元服务)入门教程

一、创建项目 二、创建卡片 三、应用服务代码 Index.ets Entry Component struct Index {State TITLE: string OpenHarmony;State CONTEXT: string 创新召见未来&#xff01;;build() {Row() {Column() {Text(this.TITLE).fontSize(30).fontColor(0xFEFEFE).fontWeight(…

基于SpringAOP实现自定义接口权限控制

文章目录 一、接口鉴权方案分析1、接口鉴权方案2、角色分配权限树 二、编码实战1、定义权限树与常用方法2、自定义AOP注解3、AOP切面类&#xff08;也可以用拦截器实现&#xff09;4、测试一下 一、接口鉴权方案分析 1、接口鉴权方案 目前大部分接口鉴权方案&#xff0c;一般…

SurfaceFlinger的硬件Vsync深入分析-千里马android framework车机手机系统开发

背景&#xff1a; 学过或者你看过surfaceflinger相关文章同学都知道&#xff0c;vsync其实都是由surfaceflinger软件层面进行模拟的&#xff0c;但是软件模拟有可能会有误差或偏差&#xff0c;这个时候就需要有个硬件vsync帮忙校准。 故才会在surfaceflinger的systrace出现如下…

应用安全四十二:SSO安全

一、什么是SSO SSO是单点登录(Single Sign On)的缩写,是指在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。这种方式减少了由登录产生的时间消耗,辅助了用户管理,是比较流行的企业业务整合的解决方案之一。 身份验证过程依赖于双方之间的信任关…

新一代存储介质技术SCM探讨

什么是SCM介质&#xff1f; SCM介质现状 SCM介质产品形态和在存储系统中的应用 高性能SSD 字节型DIMM形态 小结 什么是SCM介质&#xff1f; SCM&#xff08;Storage Class Memory&#xff09;是当前业界非常热门的新介质形态&#xff0c;同时具备持久化&#xff08;Storage Cla…