Spring注解使用

news2025/2/11 9:01:43

文章目录

  • 前言
    • 存储Bean对象
      • ① 配置扫描路径 -
      • ② 使用注解存储Bean对象
          • @Controller(控制器存储)
    • 这里讲一下Spring的调用流程 及 注解的含义
        • getBean里面的命名规则
          • 使用⽅法注解:@Bean
    • 获取Bean对象
      • 1. 属性注⼊
          • 属性注入的优缺点
      • 2. 构造⽅法注⼊ (官方推荐)
          • 构造方法注入的优缺点
      • 3. Setter 注⼊
          • ser注入的优缺点
    • 获取Be**加粗样式**an对象的注意事项
  • 依赖注入与new 一个对象有什么区别
    • 讲了这么多注入, 下面说一个另外的注入关键字@Resource
    • @Autowired 与 @Resource的区别


前言

之前讲了Spring 如何创建和使用对象 , 那种初始的方法需要不停的在XML中写入 Bean对象, 如果有多个Bean对象 ,则也是比较麻烦的一种写法 , 有没有更简单的方式呢? Spring 为我们提供了一种更加简单与快捷的方式来存取Bean对象!那就是使用注解的形式 , 注解的本质就是 ,将一些代码给了第三方去完成, 你只需要调用它就行了 , 本质上还是的在XML中存储, 只不过省略你写的过程了. 交给第三方来完成了

存储Bean对象

① 配置扫描路径 -

告诉系统 扫描那个包下面有我们想要的对象, 配置同样是在XML中 ,XML基础配置不为

有人肯定会说 , 不配行不行 ,让它全部扫描 ,答案当然是可以 , 但是速度会很慢, 就像新华字典 ,按目录指定查找 和一页页查可是区别很大的!

<?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:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <content:component-scan base-package="com.bit.service"></content:component-scan>
</beans>

在这里插入图片描述

② 使用注解存储Bean对象

想要将对象存储在 Spring 中,有两种注解类型可以实现:

  1. 五大类注解:@Controller、@Service、@Repository. @Component、@Configuration。

这五个类注解, 使用方法是一致的 , 效果上看也是一致的 ,但是使用场景不一致 , 分别有特定的含义 , 相当于做饭里面不同的柜子 , 有的放碗 , 有的放调料 , 有的放食材 , 虽然作用都是一致的 - 存储数据 , 但是使用场景不同 ,

@Controller(控制器存储)

使用@Controller 存储 bean 的代码

@Controller
public class AATEST {
    public String f(){
        return "AATEST";
    }
}

测试代码

public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        AATEST aatest = (AATEST) context.getBean("AATEST");
        System.out.println(aatest.f());

    }

结果图
在这里插入图片描述
其他注解的使用方法与@ Controller 一致, 效果也一样, 这里就不一一演示了 .

这里讲一下Spring的调用流程 及 注解的含义

@Controller:表示的是交互层;
@Servie:服务层;
@Repository:持久层;
@Configuration:配置层。
在这里插入图片描述
有人会说了 ,不是5大类注解吗 ,怎么四个 还有个@Component 干嘛去了 ,
答案就是 : @Component :标准一个普通的spring Bean类 ,不代表特殊含义 ,但是@Component可以代替@Repository、@Service、@Controller,因为这三个注解是被@Component标注的 ,算@Component的子类

getBean里面的命名规则

默认规则 : ID 等于该类的首字母小写的类名 ( 这是因为 , 咱们的类名一般都是大驼峰的命名格式)
特殊规则 : 当第一与第二的字母是大写的时候,ID等于该类的类名

使用⽅法注解:@Bean

类注解是添加在类上的 ,方法注解是添加在方法上的 , 理论上,如果你把一个类中的所有方法都添加上方法注解 , 那么你的效果跟类注解一模一样 ,
还有一个不方便的地方在于 , 就算你给方法添加注解, 你的类上还必须要有五大类注解之一, 要不然根本获取不到!

说了这么多是不是认为方法注解一无是处, nonono ,如果真的一无是处, 为什么不把它删除了 ,它还是有点用的, 它的作用在于可以通过设置 name 属性给 Bean 对象进⾏重命名操作,然后获取的时候使用name属性就可以了

@Component
public class Users {
	 @Bean
	 public User user1() {
		 User user = new User();
		 user.setId(1);
		 user.setName("Java");
		 return user;
	 }
}

获取Bean对象

一般使用了 注解的方式来存放 Bean对象 , 那么有三种方式来获取 它, 当然不是上述的getBean()方法 , 你想,既然存放Bean可以优化, 那为啥获取Bean不能优化呢? 下面依次介绍这三种方法- 这里说一下, 这三种方法就是我们第一节提到的,依赖注入DI的实现

1. 属性注⼊

属性注入 属于是: 骂的多, 用的多的方法了! , 为啥如此矛盾, 因为属性注入简单, 骂是因为它简单,出错概率高 , 用也是因为它简单好写!

属性注⼊是使⽤ @Autowired 实现的,将 Service 类注⼊到 Controller 类中。
代码如下

@Service
public class StuSTest {
    public User getUser(Integer id , String name){
        User user = new User();
        user.Id = id;
        user.name = name;
        return user;
    }
}
@Controller
public class StudentTest {
    @Autowired
    public StuSTest studentTest;
    public User getUser(Integer id ,String  name){
        return studentTest.getUser(id,name);
    }

}

通过 给想要的使用 的类 ,上面加上 @Autowired就可以直接使用该类的对象, 快不快! 方便不方便!
这里有个前提 : 属性注入不适用于局部变量!

效果上和你new 该类的对象是一样的

属性注入的优缺点

缺点 :

①功能性问题 : 不能注入final(不可变对象)

②通用性问题 : 只适用于Loc容器

③设计原则问题 : 更容易违背单一设计原则

优点 :

使用简单

2. 构造⽅法注⼊ (官方推荐)

如题就是在构造方法上面加上@Autowired , 如果只有⼀个构造⽅法,那么 @Autowired 注解可以省略

@Controller
public class UserController2 {
	 // 注⼊⽅法2:构造⽅法注⼊
	 private UserService userService;
 
	@Autowired
	 public UserController2(UserService userService) {
		 this.userService = userService;
	 }
		public User getUser(Integer id) {
		 return userService.getUser(id);
	 }
}
构造方法注入的优缺点

缺点 :

①没有属性注入的方式实现简单

优点:

①可以注入一个不可变的对象

②注入的对象不会被修改

③注入对象会被完全初始化

④通用性更好

3. Setter 注⼊

如题, Set注入就是在在设置 set ⽅法的时候需要加上 @Autowired 注
解,如下代码所示:

@Controller
public class UserController3 {
	 // 注⼊⽅法3:Setter注⼊
	 private UserService userService;
	 @Autowired
	 public void setUserService(UserService userService) {
		 this.userService = userService;
	 }
	 public User getUser(Integer id) {
		 return userService.getUser(id);
	 }
}
ser注入的优缺点

缺点 :

①:不能注入不可变的对象

②:注入的对象是可以被修改的

优点 : 更加符合单一设计原则

获取Be加粗样式an对象的注意事项

① 方法要搭配 5大类注解 去使用

② Bean 注解可以设置 name 属性

③ Bean 默认使用是方法名 , 设置了 name属性 就必须 使用 name的 名字

④使用BeanFactory (Spring创建与使用讲过)不能使用Bean注解

依赖注入与new 一个对象有什么区别

spring依赖注入,是指对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。 new一个对象的时候,初始化顺序是: 父类静态块,子类静态块,父类属性(先系统默认值,后直接你赋予的值) ,父类构造器,子类属性,子类构造器。
总结: 来做饭来举例: 加入一个菜品有多种做法 , 且所需要的材料不同, 依赖注入, 是动态的 ,是一开始不确定的,是到点做那个去买那个材料 ,而new一个对象是固定的,是需要将材料全部准备好才能在做的时候找到材料.懂了吧?所以说依赖注入,降低了耦合度!

讲了这么多注入, 下面说一个另外的注入关键字@Resource

在进⾏类注⼊时,除了可以使⽤ @Autowired 关键字之外,我们还可以使⽤ @Resource 进⾏注⼊,如下代码所示:

@Controller
public class UserController {
 // 注⼊
	 @Resource
	 private UserService userService;
	 public User getUser(Integer id) {
		 return userService.getUser(id);
	 }
}

@Autowired 与 @Resource的区别

相同点 : 都可以进行依赖注入
不同点 :

① :功能支持不同 , @Autowired支持所有方式的注入 ,而@Resource不支持构造方法的注入

②:出身地不同 @Autowired 出生与Spring 框架 , 而@Resource 出生于JDK

③:支持的参数类型不同 : @Resource 支持更多的参数, 而@Autowired只支持require参数

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

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

相关文章

【c++】static和const修饰类的成员变量或成员函数

目录 1、静态成员变量 2、静态成员函数 3、常函数 4、常对象 当我们使用c的关键字static修饰类中的成员变量和成员函数的时候&#xff0c;此时的成员变量和成员函数被称为静态成员。 静态成员包含&#xff1a; 静态成员变量静态成员函数 1、静态成员变量 静态成员变量有…

window系统:python3 + auto-py-to-exe 打包playwright为exe,内含独立浏览器

auto-py-to-exe的使用参考一下链接&#xff1a; 链接: python—auto-py-to-exe—.py文件打包成.exe文件最全最详细&#xff08;用不同的类别做教程&#xff09; 1、使用auto-py-to-exe打包playwright成exe&#xff0c;运行之后运行一直报错&#xff1a;FileNotFoundError: [Wi…

Java-API简析_java.lang.Character类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131178778 出自【进步*于辰的博客】 其实我的【Java-API】专栏内的博文对大家来说意义是不大的。…

OJ: Digit Primes

目录 1.题目 2.中文翻译 3.代码 4.代码中部分程序段思路详解 4.1 素数判定高效率代码&#xff1a; ​编辑 4.2 最小的素数是 2 4.3 python中如何计算一个数各个位的和 1.题目 题目描述&#xff1a; A prime number is a positive number, which is divisible by exactly…

chatgpt赋能python:在Python中建立虚拟环境

在Python中建立虚拟环境 在Python编程中&#xff0c;建立虚拟环境是一项非常重要的工作。虚拟环境不仅可以避免不同版本的库之间的冲突&#xff0c;还可以使我们更好地控制项目的依赖关系。在本文中&#xff0c;我们将介绍如何使用Python建立虚拟环境。 第一步&#xff1a;安…

Jmeter参数化方式

前言&#xff1a;什么是参数化&#xff1f; 把测试数据组织起来&#xff0c;用不同的测试数据调用相同的测试方法&#xff08;实现测试数据跟测试脚本分离&#xff09;。 一、用户定义的变量&#xff1a; 1、作用&#xff1a;定义全局变量 2、局限性&#xff1a;每次取值都是…

chatgpt赋能python:Python建模型指南

Python建模型指南 Python是一种功能强大的编程语言&#xff0c;以其优雅的语法和丰富的库而闻名。而且&#xff0c;Python也是机器学习、人工智能和数据科学领域的首选语言之一。在本文中&#xff0c;我们将学习Python中如何建模型。 什么是建模&#xff1f; 建模是指使用统…

【MySQL数据库 | 第十七篇】索引以及索引结构介绍

目录 前言&#xff1a; 索引简介&#xff1a; 索引结构&#xff1a; 二叉树索引结构 Tree&#xff08;普通二叉树&#xff09; B-Tree(多路平衡查找树) BTree 哈希索引数据结构 总结&#xff1a; 前言&#xff1a; 在实际生活中&#xff0c;我们对SQL语句进行优化实际上有…

Linux,看这篇就够了

Linux 一、为什么要学linux二、目录介绍三、vi / vim编辑器四、网络配置4.1、修改 IP 地址4.2、配置主机名4.2.1、修改主机名称4.2.2、修改 hosts 映射文件 五、系统配置5.1、service 服务管理5.2、systemctl5.3、防火墙5.4、关机重启命令5.5、查看系统内核与版本 六、常用命令…

一分钟学一个 Linux 命令 - cat 和 tail

前言 大家好&#xff0c;我是 god23bin。今天我给大家带来的是 Linux 命令系列&#xff0c;每天只需一分钟&#xff0c;记住一个 Linux 命令不成问题。今天&#xff0c;需要你花费两分钟时间&#xff0c;因为我们要介绍的是两个常用的查看文件内容的命令&#xff1a;cat 和 ta…

动态规划-背包问题(三)

动态规划-背包问题&#xff08;三&#xff09; 1 描述2 样例2.1 样例 1:2.2 样例 2: 3 算法解题思路以及实现方法3.1 算法解题思路3.1.1 确定状态3.1.2 转移方程3.1.3 初始条件以及边界情况3.1.4 计算顺序 3.2 算法实现3.2.1 java实现的O(MN)算法复杂度3.2.2 C实现的O(MN)算法复…

Lua基本语法

目录 1 lua基础数据结构 2 Lua 变量 3 Lua 循环 3.1 Lua while 循环 3.2 Lua for 循环 数值for循环 泛型for循环 3.3 Lua repeat...until 循环 3.4 Lua 循环嵌套 3.5 循环控制语句 Lua break 语句 Lua goto 语句 4 Lua 流程控制 4.1 Lua if 语句 4.2 Lua if...else 语…

04-编织灵魂旋律:Golang 函数的魔力绽放

&#x1f4c3;个人主页&#xff1a;个人主页 &#x1f525;系列专栏&#xff1a;Golang基础 &#x1f4ac;Go&#xff08;又称Golang&#xff09;是由Google开发的开源编程语言。它结合了静态类型的安全性和动态语言的灵活性&#xff0c;拥有高效的并发编程能力和简洁的语法。G…

常见网络设备及其功能

1.常见网络设备及其功能 笔记来源&#xff1a; Computer network components and their functions 设备工作所在层隔离冲突域隔离广播域路由器(Router)网络层√√网桥(Bridge)数据链路层√交换机(Switch)数据链路层√中继器(Repeater)物理层集线器(Hub)物理层 1.1 路由器&…

chatgpt赋能python:Python并排输出数字——快速高效的实现技巧

Python并排输出数字——快速高效的实现技巧 在Python编程中&#xff0c;我们经常需要对数字进行输出&#xff0c;并排输出数字是一种非常常见的需求。比如说&#xff0c;我们需要将多个数据进行比较&#xff0c;或者需要将多个相关数据进行显示&#xff0c;等等。本文将介绍Py…

一.基于压缩感知(CS)的DOA估计方法-OMP-CS算法

阅读须知&#xff1a; 1.本文为本人原创作品仅供学习参考&#xff0c;未经过本人同意禁止转载和抄袭。 2.要想无障碍阅读本文需要一定的压缩感知理论以及压缩感知信号重构算法基础。 3.话不多说&#xff0c;直接开搞。 1 基于压缩感知DOA估计方法原理 假设有K个远场窄带信号…

dpdk21.11 编译(meson+ninja)及VFIO模块的加载和运行

目录 前言 安装前的环境配置 编译流程 1. 设置环境变量&#xff08;好像也不需要了&#xff09; 2. 构建dpdk 3. 编译 执行测试 1. 绑定vfio-pci 模块 2. 挂载网卡 3. 设置大页 4. 启动测试程序-testpmd 前言 操作系统&#xff1a;ubuntu22.04.2 LTS 内核版本&#…

深入理解 Java ServiceLoader、Dubbo ExtensionLoader 源码结合实战篇

介绍Java SPIDriver 实现类DriverManager 驱动管理器类loadInitialDrivers 方法registerDriver 方法getConnection 方法 ServiceLoader 核心类LazyIterator#hasNextService 方法LazyIterator#nextService 方法 Dubbo SPI加载策略FilterExtensionLoaderExtensionLoader#getExten…

框架篇面试详解

spring AOP AOP称为面向切面编程&#xff0c;用于将那些与业务无关&#xff0c;但却对多个对象产生影响的公共行为和逻辑&#xff0c;抽取并封装成为一个可重用的模块&#xff0c;这个模块被命名为“切面”&#xff08;Aspect&#xff09;&#xff0c;减少系统中的重复代码&am…

02-舞动数据类型:Golang 类型定义的奇妙之旅

&#x1f4c3;个人主页&#xff1a;个人主页 &#x1f525;系列专栏&#xff1a;Golang基础 &#x1f4ac;Go&#xff08;又称Golang&#xff09;是由Google开发的开源编程语言。它结合了静态类型的安全性和动态语言的灵活性&#xff0c;拥有高效的并发编程能力和简洁的语法。G…