Spring框架(三)Spring注解和获取Bean对象详解

2023-10-26

一,什么是基于Java的Spring注解配置,具体注解的例子

  • 基于Java的配置,允许你在少量的Java注解的帮助下,进行你的大部分Spring配置而非通过XML文件。
  • 以@Configuration 注解为例,它用来标记类可以当做一个bean的定义,被Spring IOC容器使用。
  • 另一个例子是@Bean注解,它表示此方法将要返回一个对象,作为一个bean注册进Spring应用上下文。
@Configuration
public class StudentConfig {
    @Bean
    public StudentBean myStudent() {
        return new StudentBean();
    }
}

二,更好的将Bean存储在Spring中⭐

1,前置工作,在配置文件中设置Bean根路径

想要将对象成功的存储到 Spring 中,我们需要配置⼀下存储对象的扫描包路径,只有被配置的包下的所有类,添加了注解才能被正确的识别并保存到 Spring 中。
在 spring-config.xml 添加如下配置:

 <!-- 设置需要存储在Spring中的bean根目录-->
    <content:component-scan base-package="com.beans"></content:component-scan>

在这里插入图片描述

2,添加注解存储Bean对象

有两种方式实现注解:

  • 类注解:@Controller(控制器)、@Service(服务)、@Repository(仓库)、@Component(组件)、@Configuration(配置)
  • 方法注解:@Bean

2.1 @Controller(控制器存储)

代码示例:

import org.springframework.stereotype.Controller;
@Controller
public class UserController {
    public void sayHi(String name) {
        System.out.println("Hi," + name);
    }
}

注意事项:
①即使在spring配置文件配置了bean的扫描路径,五大类注解也是不能省略的
②即使加了五大类注解,但类没有放在spring配置的Bean路径下,也是不能讲类注解到spring

此时我们先使用之前读取对象的方式来读取上面的UserController 对象,如下代码所示:

public class Application {
    public static void main(String[] args) {
// 1.得到 spring 上下⽂
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
// 2.得到 bean
        UserController userController = (UserController)
                context.getBean("userController");
// 3.调⽤ bean ⽅法
        userController.sayHi("Bit");
    }
}

2.2@Service(服务)

代码示例:

import org.springframework.stereotype.Service;
@Service
public class UserService {
    public void sayHi(String name) {
        System.out.println("Hi," + name);
    }
}

2.3 @Repository(仓库存储)

代码示例:

@Repository
public class UserRepository {
    public void sayHi(String name) {
        System.out.println("Hi," + name);
    }
}

2.4 @Component(组件存储)

代码示例:

@Component
public class UserComponent {
    public void sayHi(String name) {
        System.out.println("Hi," + name);
    }
}

2.5 @Configuration(配置存储)

代码示例:

@Configuration
public class UserConfiguration {
    public void sayHi(String name) {
        System.out.println("Hi," + name);
    }
}

3,注意 Bean 的命名

通过上面示例,我们可以看出,通常我们 bean 使用的都是标准的大驼峰命名,而读取的时候首字母小写就可以获取到 bean 了,如下图所示:

在这里插入图片描述

4,方法注解 @Bean

  • 类注解是添加到某个类上的,而方法注解是放到某个方法上的,如以下代码的实现:
    1.方法注解要配合类注解使用
@Component
public class Users {
    @Bean
    public User user1() {
        User user = new User();
        user.setId(1);
        user.setName("Java");
        return user;
    }
}

2.重命名 Bean

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

5,既然功能是⼀样的,为什么需要这么多的类注解呢

那么为什么需要怎么多的类注解也是相同的原因,就是让程序员看到类注解之后,就能直接了解当前类的用途,比如:
@Controller:表示的是业务逻辑层
@Servie:服务层
@Repository:持久层
@Configuration:配置层

在这里插入图片描述

三,@Component, @Controller, @Repository, @Service 有何区别

关系:

  • 查看 @Controller / @Service / @Repository / @Configuration 等注解的源码发现Component类是Controller,Repository, Service ,Configuration的父类

区别:

  • @Component:这将 java 类标记为 bean。它是任何 Spring 管理组件的通用构造型。spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中
  • @Controller:这将一个类标记为 Spring Web MVC 控制器。标有它的 Bean 会自动导入到 IoC 容器中
  • @Service:此注解是组件注解的特化。它不会对 @Component 注解提供任何其他行为。您可以在服务层类中使用 @Service 而不是 @Component,因为它以更好的方式指定了意图
  • @Repository:这个注解是具有类似用途和功能的 @Component 注解的特化。它为 DAO 提供了额外的好处。它将 DAO 导入 IoC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException

四,怎样开启注解装配

  • 注解装配在默认情况下是不开启的,为了使用注解装配,我们必须在Spring配置文件中配置 context:annotation-config/元素

五,获取Bean对象(对象装配)

获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注入
对象装配(对象注⼊)的实现⽅法以下 3 种:
1.属性注入
2.构造方法注入
3.Setter 注入

1.属性注入

属性注入是使用 @Autowired 实现的,将 Service 类注入到 Controller 类中

  • @Autowired默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在(可以设置它required属性为false)。@Autowired 注解提供了更细粒度的控制,包括在何处以及如何完成自动装配。它的用法和@Required一样,修饰setter方法、构造器、属性或者具有任意名称和/或多个参数的PN方法
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
    // 注⼊⽅法1:属性注⼊
    @Autowired
    private UserService userService;
    public User getUser(Integer id) {
        return userService.getUser(id);
    }
}

2.构造方法注入

构造方法注入是在类的构造方法中实现注入,如下代码所示:

@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 注入

Setter 注入和属性的 Setter 方法实现类似,只不过在设置 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);
    }
}

六,@Autowired和@Resource之间的区别

  • 出身不同:@Autowired是Spring的实现,@Resource来自于JDK
  • 支持的参数设置不同:@Autowired只支持required参数设置,,而@Resource支持很多参数,比如name,type等
  • 支持的注入类型不同:@Autowired可用于:构造函数、成员变量、Setter方法, 而@Resource可用于:成员变量、Setter方法

七,@Qualifier 和@RequestMapping 注解有什么用

  • 当您创建多个相同类型的 bean 并希望仅使用属性装配其中一个 bean 时,您可以使用@Qualifier 注解和 @Autowired 通过指定应该装配哪个确切的 bean 来消除歧义
  • @RequestMapping 注解用于将特定 HTTP 请求方法映射到将处理相应请求的控制器中的特定类/方法。此注释可应用于两个级别:
    ①类级别:映射请求的 URL
    ②方法级别:映射 URL 以及 HTTP 请求方法
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring框架(三)Spring注解和获取Bean对象详解 的相关文章

  • java中数字字符串间隔排序

    我正在与一些人一起上一个人课 其中有姓名 年龄范围等详细信息 年龄区间为 0 5 6 10 11 30 31 45 46 50 50 100 100 110 我正在上 Person 课name ageBand字符串间隔及其参数化构造函数 g
  • Spring-MVC 3.1:如何映射带有尾部斜杠的 URL?

    我正在将旧版 servlet 应用程序转换为 Spring 3 1 在此过程中 一些 URL 现在已过时 我们的网络存在一些问题 短期内不会得到解决 我的老板不想相信他们的重定向将始终有效 因此 她要求我将自己的重定向放入网络应用程序中 一
  • 当服务器仅从请求中读取标头时,Http 客户端未收到响应

    我在 Java 中搞乱了 HTTP 和套接字 希望你能对此有所了解 当我用 Java SE 11 编写的 HTTP 服务器没有读取整个请求然后响应时 客户端不会收到它或收到错误 这是为什么 在服务器读取整个请求之前 客户端是否无法读取响应
  • 从 Java 监听系统鼠标点击

    我的主要目的是计算特定应用程序上的鼠标点击次数 想象一下 我在 PC 上打开了 Microsoft Word 和 Web 浏览器 我的 Java 代码应该告诉我单击 Word 和 Web 浏览器的次数 我需要应用程序名称和点击次数 我怎样才
  • 如何将值从 recyclerview 项目传递到另一个活动

    当我们单击 recyclerview 项目时 我试图将 recyclerview 项目中的值传递给另一个活动 这里我使用的是OnItemTouchListener 我从 JSON 检索数据并将其解析为 ArrayList 我保存了5个参数
  • TestNG 与 DataProvider 并行执行

    我有一个从数据提供者接收数据的测试 我希望此测试与数据提供者的不同值并行运行 我尝试了这样的方法 public class IndependentTest Test dataProvider dp1 threadPoolSize 3 inv
  • 实现一个java UDF并从pyspark调用它

    我需要创建一个在 pyspark python 中使用的 UDF 它使用 java 对象进行内部计算 如果它是一个简单的 python 我会做类似的事情 def f x return 7 fudf pyspark sql functions
  • 如何抑制有关已弃用 api 的 javac 警告?

    当我编译时 javac 输出 Note Some input files use or override a deprecated API Note Recompile with Xlint deprecation for details
  • Spring:当我的类已经用@RestController注释时,为什么我仍然应该使用@RequestBody?

    我目前正在将 Java 和 Spring 用于我的 Web 服务应用程序 我正在使用 RestController希望消除使用注释的需要 ResponseBody and RequestBody注释 不幸的是 删除 RequestBody注
  • 为什么 JPA/hibernate 不能映射到 MySQL blob 类型?

    我收到以下错误 Caused by org hibernate HibernateException Wrong column type in TestTable for column PAYLOAD Found blob expected
  • Spring MVC - 从 JSP 提交对象

    我有一个显示客户列表的 JSP ArrayList searchResults 我希望能够选择其中之一 并将其 提交给 Spring MVC 控制器 但是 我似乎无法传递所选对象 只能传递它的属性 例如 customerId 我真的需要传递
  • 从文件执行db语句

    我在我的应用程序中使用嵌入式 Apache derby 我有一个名为的 SQL 脚本创建的数据库 sql创建数据库中的所有表并用初始数据填充它 例如 SET SCHEMA APP CREATE TABLE study study id bi
  • 在 Eclipse 中编写链接特定行的注释

    我正在 Java 中使用 Eclipse 并且处理很长的类 我需要这样的功能 在方法的顶部注释中 例如 有一个由该方法执行的操作列表 对于列出的每个操作 我想将注释的一部分 超链接 到相关代码的特定行 然后使用 Ctrl Click 到该行
  • JPA Criteria API 任意数量的联接/子查询

    我需要使用以下实体构建相交类型查询 为了清楚起见 减少了实体 Entity and other stuff public class Member Id private Long id private String name Entity
  • 字符串包含相同的字符但仍然不同[重复]

    这个问题在这里已经有答案了 我正在尝试读取一个 txt 文件并使用每个句子作为团队的名称 同时使用该名称查找另一个 txt 文件以获取其内容 所有 txt 文件都位于我的资产文件夹的根目录中 第一个 txt 文件工作正常 我使用assetm
  • 什么触发了java垃圾收集器

    我对 Java 中垃圾收集的工作原理有点困惑 我知道当不再有对某个对象的实时引用时 该对象就有资格进行垃圾回收 但是如果它有对实时对象的引用怎么办 可以说我有一个节点集合 它们再次引用更多节点 List 1 gt Node a gt Nod
  • JToolBar 放回 GridBagLayout 时出现 IllegalArgumentException

    为什么这段代码会抛出一个IllegalArgumentException当工具栏被拖离 GUI 然后关闭 将其返回到 GUI 时 我可以理解为什么在没有约束的情况下添加组件可能是不合适的 但在这种情况下 工具栏最初添加到面板 使用GridB
  • 三角形未在 OSX 上的 OpenGL 2.1 中绘制

    我正在学习有关使用 OpenGL 在 Java 中创建游戏引擎的教程 我正在尝试在屏幕上渲染一个三角形 一切运行良好 我可以更改背景颜色 但三角形不会显示 我还尝试运行作为教程系列的一部分提供的代码 但它仍然不起作用 教程链接 http b
  • 使用java读取行并映射过滤数据[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions publi
  • 如何使用 GWT 2.4 在服务器端动态创建 UI

    我正在尝试使用 Google Web Toolkit v2 4 创建用户界面 由于多种原因 我需要在运行时指定服务器上接口的内容 我的意思不仅仅是按钮需要动态标签等 而是整个 UI 需要在运行时创建 我的大部分 UI 都可以指定为直接的 H

随机推荐

  • codeforces 526D(kmp,数学)

    description One day Om Nom found a thread with n beads of different colors He decided to cut the first several beads fro
  • 内核体系结构和编译体系分析

    1 Linux操作系统体系结构 1 操作系统可以分为两个层次 内核空间和用户空间 内核和用户空间使用不同的保护地址空间 内核不能将用户空间传递的地址进行直接的操作 需要先转换 2 系统调用 内核空间管理设备资源 应用程序通过内核提供的内核调
  • 米家接入HomeKit系列三:HomeAssistant接入米家网关

    系列文章 米家接入HomeKit系列一 接入基本原理与开篇 米家接入HomeKit系列二 通过群辉NAS的Docker搭建HomeAssistant 米家接入HomeKit系列三 HomeAssistant接入米家网关 米家接入HomeKi
  • 微信小程序--web-view--h5返回微信小程序

    1 配置微信小程序 web view 记得配置业务域名 微信公众平台配置业务域名 上线需要 1 1 建议微信小程序里单独用一个页面打开
  • debug

    1 在DOS提示符下 进入Debug程序 2 详细记录每一步所用的命令 以及查看结果的方法和具体结果 3 现有一个双字加法源程序如下 其中存在错误 现假设已汇编 连结生成了可执行文件HB EXE 存放在d MASM目录下 请使用Debug对
  • argmax与max的区别

    y max f x 表示y是函数f x 的最大值 y argmax f x 表示y为函数f x 取得最大值时 参数x的值 例 f x x3 x的取值范围是 0 1 2 3 y max f x 27 y argmax f x 3
  • AcWing 907. 区间覆盖 贪心

    AcWing 907 区间覆盖 给定N个闭区间 ai bi 以及一个线段区间 s t 请你选择尽量少的区间 将指定线段区间完全覆盖 输出最少区间数 如果无法完全覆盖则输出 1 输入格式 第一行包含两个整数s和t 表示给定线段区间的两个端点
  • 数据分析中的统计与机器学习应用

    1 数据分析应用场景 数据分析场景 例如逛淘宝 后台一般会从以下几个方面对用户数据进行分析来 了解的一个产品的数据模型 1 Acquisition 获取用户 运营一件产品首先就需要获取用户 也就是推广 运营人员要分析自己产品的特性以及想要推
  • 一文看懂PCB助焊层跟阻焊层的区别与作用

    一文看懂PCB助焊层跟阻焊层的区别与作用 PCBworld 今天 阻焊层简介 阻焊盘就是soldermask 是指板子上要上绿油的部分 实际上这阻焊层使用的是负片输出 所以在阻焊层的形状映射到板子上以后 并不是上了绿油阻焊 反而是露出了铜皮
  • zookeeper 搭建集群

    待完善
  • 《计算机文化基础》22-23第一学期后十周教学计划(中国铁道出版社第三版)

    课程 任课教师 授课班级 编制时间 计算机文化基础 2022 10 28 授课日期 2022年 10月31日至 2022年 12月 16日 本课程总课时 28课时 已授课时 0 课时 尚余课时 28课时 本学期授课周 7周 本学期周课时 4
  • 超详细讲解!Android面试题集2021版,面试心得体会

    前言 Android常用知识体系是什么鬼 所谓常用知识体系 就是指对项目中重复使用率较高的功能点进行梳理 注意哦 不是Android知识体系 古语道 学而不思则罔 思而不学则殆 如果将做项目类比为 学 那么整理就可以类比为 思 在做项目过程
  • 文件包含漏洞

    一 文件包含函数 将外部文件的内容引入当前环境 include
  • 玩转Kali之初始化系统

    文章目录 下载镜像 安装系统 修改root密码 配置APT国内源 更新软件包 下载镜像 1 打开kali官网 https www kali org 安装系统 1 打开VirtualBox 2 选择新建虚拟机 1 输入虚拟机名称 2 选择安装
  • TopK问题的三种解法

    TopK问题是指从n个数据中取前K个数据 在生活中的应用也有很多 如游戏中xxx的排行榜前10名等 在这篇博客中我将主要利用堆去解决TopK问题 堆排序 首先我们需要建一个堆 然后我们再进行堆排序 排好序后直接取前K个就可以了 需要注意的是
  • Debian10iptables放行语法

    文章目录 1 基本语法 2 修改默认规则 3 实例 4 易错总结 1 基本语法 iptables A 链 匹配条件 j 动作 D 删除 p 协议 ACCEPT 放行 s 源ip地址 DROP 丢弃 d 目的ip地址 REJECT 拒绝 sp
  • java.util.EnumSet complementOf (EnumSet<E> s)方法具有什么功能呢?

    转自 java util EnumSet complementOf EnumSet lt E gt s 方法具有什么功能呢 下文笔者讲述EnumSet complementOf方法的功能简介说明 如下所示 EnumSet complemen
  • To Java程序员:切勿用普通for循环遍历LinkedList

    ArrayList与LinkedList的普通for循环遍历 对于大部分Java程序员朋友们来说 可能平时使用得最多的List就是ArrayList 对于ArrayList的遍历 一般用如下写法 public static void mai
  • 余弦定理实现新闻自动分类算法

    前言 余弦定理 这个在初中课本中就出现过的公式 恐怕没有人不知道的吧 但是另外一个概念 可能不是很多的人会听说过 他叫空间向量 一般用e表示 高中课本中有专门讲过这个东西 有了余弦定理和向量空间 我们就可以做许多有意思的事情了 利用余弦定理
  • Spring框架(三)Spring注解和获取Bean对象详解

    目录 一 什么是基于Java的Spring注解配置 具体注解的例子 二 更好的将Bean存储在Spring中 1 前置工作 在配置文件中设置Bean根路径 2 添加注解存储Bean对象 2 1 Controller 控制器存储 2 2 Se