spring用注解读取与获取对象

news2024/11/19 17:24:07

前言

上一篇博客简单的介绍了spring的功能与使用,可以看到我们创建一个对象,就需要在xml中存储一个bean对象,这种操作非常的繁琐,因此spring发明了使用注解来快捷存储bean对象

配置工作

我们在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="">
    </content:component-scan>

</beans>

其中base-package=""中填写要存储的包路径,比如我们的对象存储在com.demo.controller路径下,那么就填写

<content:component-scan base-package="com.demo.component">
    </content:component-scan>

在这里插入图片描述

存储Bean对象

有多种注解可以存储对象

  1. 类注解:@Controller @Service @Repository @Component @Configuration
  2. @Bean

@Controller

在类上使用@Controller 注解,就可以存储bean对象

package com.demo.component;

import org.springframework.stereotype.Controller;

@Controller
public class ArticleController {
    public String sayHi(){
        return "hi";
    }
}

获取使用bean对象和之前的方法一样,使用ApplicationContext

spring规定,使用类名的小驼峰作为id,因此我们可以通过下面这种格式获取bean对象

ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        ArticleController articleController = context.getBean("articleController", ArticleController.class);
        System.out.println(articleController.sayHi());

如果我们的类名本身首字母就是小写的,那么获取Bean的名称和类名一样,如果我们的类名第一个字母和第二个字母都是大写字母,比如说AApple,那么Spring规定,也是使用原类名来获取Bean对象

如果我们的类直接创建于java包下,而不是自定义的包下,我们想要将这个类注入到Spring中,那么要按照下面这个方法来操作

将扫描目录改为通配符**,使用通配符,可以扫描所有的这个项目下所有的类文件

<content:component-scan base-package="**">
    </content:component-scan>

并且,我们在main方法调用时,必须使用BeanFactory来获取上下文

BeanFactory factory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
User user = (User) factory.getBean("user");
System.out.println(user.sayHi());

但是可以发现,使用这个方法,执行的速度是非常慢的,因此非常不建议大家这样编写

其他类注解

使用其他四个类注解,也可以实现和@Controller相同的功能,其基本原理和实现方式和Controller是一样的,事实上,@Component是其他四个类注解的父类

package com.demo.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class StudentService {
    public void sayHi(){
        System.out.println("service : hi");
    }
}

在我们的Spring core中,这些类注解的用途都是一样的,只有后面的Spring MVC和SpringBoot中,这些类注解才有他们不同的功能

分成五个不同类注解的原因:

  1. 我们可以通过类注解来判断这个类是用来干嘛的
  2. 五个类在SpringMVC和SpringBoot中有不同的功能

下面来简单介绍一下这五大类注解的用途:
当我们用户在前端访问网站时,@Controller对应的类负责接待这些用户,确认用户的参数是否合理,相当于我们进餐厅后的接待员,会把你领到位置上

接着,数据传给@Service对应的类,负责判断前端的请求需要调用什么功能,相当于餐厅的服务员,会把你想要的菜告诉后厨

然后,数据传给@Repository对应的类,其于数据库直接相连,会操作数据库的增删改查,相当于餐厅中的厨师,会把饭给你做好拿出来

而@Configuration对应的类,用来配置项目的一些信息

@Component对应的类,则提供一些项目中的公共方法,例如我们项目中确认用户是否登陆,整个项目都需要这个方法

下面来简单翻译一下这些词的含义

  1. @Component 组件,归属于公共工具类
  2. @Controller 控制器, 归属于业务逻辑层
  3. @Service 服务,归属于服务层
  4. @Repository 仓库,归属于持久层
  5. @Configuration 配置,归属于配置层

@Bean

除了在类上使用五大类注解,可以在Spring中存储这个类,我们还可以在方法上使用@Bean这个注解,可以将方法的返回对象存储在Spring中

需要注意的是,为了防止需要扫描大量的方法,因此@Bean在方法上注解了后,还需要在这个方法对应的类上使用五大类注解

代码实例:
我们在别的包实现student类

package com.demo.model;


public class Student {
    private int age;
    private int id;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", id=" + id +
                '}';
    }
}

然后在一个返回Student的方法上注解@Bean,在整个类上注解五大类注解

package com.demo.component;

import com.demo.model.Student;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class StudentBean {
    @Bean
    public Student student(){
        Student student = new Student();
        student.setId(1);
        student.setAge(1);
        return student;
    }
}

就可以使用上下文对象来获取Student对象了

Student student = context.getBean("student",Student.class);
System.out.println(student);

其id和五大类注解一样,默认是类名的小驼峰,由于方法可能有很多重名的,因此我们可以在@Bean后设置name属性,还可以设置多个

@Bean(name = {"stu","学生","s"})

在设置name属性后,原先的小驼峰就找不到对应的类了

属性注入

按照前面讲的,我们需要将@Service的类注入到@Controller类中,那么我们就可以使用属性注入

先实现一个StudentService类

package com.demo.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class StudentService {
    public void sayHi(){
        System.out.println("service : hi");
    }
}

在StudentController类中,就可以自动的获取studentService对象

package com.demo.controller;

import com.demo.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class StudentController {
    @Autowired
    private StudentService studentService;
    
    public void sayHi(){
        studentService.sayHi();
    }
}

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

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

相关文章

基于风光储能和需求响应的微电网日前经济调度(Python代码实现)【0】

目录 0 引言 1 计及风光储能和需求响应的微电网日前经济调度模型 1.1风光储能需求响应都不参与的模型 1.2风光参与的模型 1.3风光和储能参与模型 1.4 风光和需求响应参与模型 1.5 风光储能和需求响应都参与模型 2 需求侧响应评价 2.1 负载率 2.2 可再生能源消纳率 …

Win10PE_V2.0Nvme网络版.iso 支持Nvme硬盘免费下载无需积分

Win10PE_V2.0Nvme网络版.iso 支持Nvme硬盘免费下载无需积分 V1.0版本发布 2022年1月19日 内置常用PE工具&#xff0c;7-Zip、EasyImageX_x64、XorBoot Uefi修复、NT6修复、Ghost、CGI、Google浏览器、PENetwork、RegWorkshop、迅雷迷你版、、BOOTICEx64、windows安装器、XP安…

路径计数2

路径计数2 题目描述 一个NNN \times NNN的网格&#xff0c;你一开始在(1,1)(1,1)(1,1)&#xff0c;即左上角。每次只能移动到下方相邻的格子或者右方相邻的格子&#xff0c;问到达(N,N)(N,N)(N,N)&#xff0c;即右下角有多少种方法。 但是这个问题太简单了&#xff0c;所以现…

MySQL 数据同步 Elasticsearch 的技术方案选型

文章目录1.同步双写2.异步双写3.定时任务4.数据订阅1.同步双写 优点&#xff1a;实现简单缺点&#xff1a; 业务耦合&#xff0c;商品的管理中耦合大量数据同步代码 影响性能&#xff0c;写入两个存储&#xff0c;响应时间变长 不便扩展&#xff1a;搜索可能有一些个性化需求&…

jvm学习的核心(三)---运行时数据区详解(1)

图片等相关信息来源于&#xff1a;尚硅谷宋红康JVM全套教程 1.程序计数器 程序计数器又叫pc寄存器&#xff0c;中文有两个名字 我们可以反编译字节码文件查看方法中操作指令对应的指令地址 javap -v "对应的class文件"为什么要用pc寄存器&#xff0c;pc寄存器有什…

13、Javaweb_Filter登陆验证动态代理过滤敏感词Listener

Filter&#xff1a;过滤器 1. 概念&#xff1a; * 生活中的过滤器&#xff1a;净水器,空气净化器&#xff0c;土匪、 * web中的过滤器&#xff1a;当访问服务器的资源时&#xff0c;过滤器可以将请求拦截下来&#xff0c;完成一些特殊的功能。 * 过滤器的作用&…

深入理解计算机系统_可执行目标文件和可重定位目标文件的3个区别

这篇笔记对比一下可执行目标文件和可执行目标的3个区别。下图分别是可重定位目标文件和可执行目标文件各段结构。 1.1 可执行目标文件和可重定位目标文件的3个区别 区别1&#xff1a;可执行目标文件的rel.text和.rel.data消失了 链接器将.o中.text和.data节整合到一起时&a…

【ROS2入门】理解 ROS 2 Topics 话题

大家好&#xff0c;我是虎哥&#xff0c;从今天开始&#xff0c;我将花一段时间&#xff0c;开始将自己从ROS1切换到ROS2&#xff0c;在上一篇中&#xff0c;我们一起了解ROS 2中节点的功能以及与之交互的工具&#xff0c; 这一篇&#xff0c;我们主要会围绕ROS中另外一个重要的…

RS232 RS485 TO ETH TCP-Modbus 测试

原来modbus 传感器都是有对应的指令码的&#xff0c;不同功能的指令码也不一样&#xff0c;比如测温度和湿度的指令码也是不一样的&#xff1b; 硬件连接如下图 &#xff08;温湿度传感器&#xff0c;板载SHT20&#xff09; ​ 编辑切换为居中 添加图片注释&#xff0c;不超…

华为VRRP、BFD实验配置

目录 VRRP实验配置 BFD实验配置 配置单跳检测 配置多跳检测 配置单臂回声 BFD与路由协议联动配置 BFD与OSPF联动 BFD与ISIS联动 BFD与BGP联动 VRRP实验配置 VRRP配置 AR1配置&#xff08;VRRP缺省优先级100&#xff09; int g0/0/0 ip add 192.168.10.1 24 vrrp vrid …

织音云站长扶持计划:可免费获得CDN或虚拟主机

活动介绍活动详情页&#xff1a;织音云站长扶持计划网站被恶意攻击时是中小站长最脆弱的时候&#xff0c;90%的站长都会动“关站不干了”的心思&#xff0c;夹在中间真的很难搞!因此织音云决定为中小站长提供免费的全球CDN加速服务和提供免费的虚拟主机,免备案&#xff01;只需…

智改数转水循环在线监测系统,提升企业生产安

江苏省政府印发《江苏省制造业智能化改造和数字化转型三年行动计划&#xff08;2022&#xff0d;2024年&#xff09;》&#xff0c;提出通过三年的努力&#xff0c;全省制造业数字化、网络化、智能化水平显著提升&#xff0c;新业态、新模式、新动能显著壮大&#xff0c;制造业…

linux系统中使用QT操作硬件蜂鸣器的方法

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何使用QT进行蜂鸣器的控制与实现。 目录 第一&#xff1a;资源基本简介 第二&#xff1a;应用实例的代码实现 第三&#xff1a;源文件“mainwindow.cpp”的具体实现 第四&#xff1a;程序运行效果 第一&#xff1a;资…

自动控制原理课程设计

一、实验目的(1)要求学生根据书上习题的要求&#xff0c;自行设计一校正装置&#xff0c;并用本 实验挂件 构成的模拟系统 进行实验和实际调试、使学生能认识到校正装置在系统中的重要性。(2)掌握工程中常用的 二阶系统 和 三阶系统 的工程设计方法。二、实验所需挂件及附件型 …

Docker 安装mysql主从复制

1、新建主服务器容器实例3307docker run -d -p 3307:3306 -v /mydata/mysql-master/log:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORDroot --name mysql-master mysql:5.72、进入/myd…

Acwing——第二场热身赛

题目链接 AcWing 3547. 特殊数字 AcWing 3548. 双端队列 AcWing 3549. 最长非递减子序列 题目描述 3547.特殊数字 我们规定&#xff0c;对于一个整数 a&#xff0c;如果其各位数字相加之和能够被 4 整除&#xff0c;则称它是一个特殊数字。 现在&#xff0c;给定一个整数 n…

算法第十一期——BFS(广度优先搜索)入门与应用

目录 BFS BFS:找最短路路径 BFS:用队列实现 特点 最短路径问题用BFS 应用场合 例题一 【思路】 输出路径的两种方法 简单方法 标准方法&#xff08;栈&#xff09; BFS:连通性判断 例题二&#xff1a;全球变暖 【思路】 BFS的三种实现 1、queue实现 2、 li…

分享66个Java源码,总有一款适合您

Java源码 分享66个Java源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载后可以看到。 源码下载链接&#xff1a;https://pan.baidu.com/s/1wnPO7GfR_cVmDb2qx-4vEw?pwdlrsu …

Android 深入系统完全讲解(16)

2 属性权限 我们来看下属性权限的整体流程&#xff0c;简单分析下这个模块。init.cpp -->property_init() init 进程 进入第二阶段的时候&#xff0c;初始化属性。 关键点&#xff0c;创建了一个目录&#xff0c;这个目录就是我们属性后续会存在的地方。加载对应文件中的配…

[ADT笔记]图(graph)

定义 其实跟树差不多&#xff0c;但是树强调的是节点&#xff08;data&#xff09;&#xff0c;图则既强调节点又强调边。 分类 有向图&#xff08;边有方向&#xff09;无向图&#xff08;边没方向&#xff09; 例如&#xff0c;在无向图里<j,i>和<i,j>是同一…