Spring更简单的读取和存储Bean(基于注解)

news2024/12/23 5:10:18

目录

①从Maven中央仓库获取spring-context和spring-beans的依赖,将依赖引入到pom.xml中

②配置扫描路径 

③添加注解存储Bean对象(可以使用5大类注解和方法注解) 

 类注解(写在类上,作用于类上)

@Controller:类标记为控制器 

@Service

@Repository

@Component

@Configuration

为什么需要这么多注解? 

类注解之间的关系 (除了@Component注解以外的注解,都是基于@Component来实现的。也就是说,@Component是上述所有注解的父类。)

方法注解(作用在方法上的注解) @Bean

为什么不直接加@Bean注解,还需要加类注解? 

总结@Bean注解的使用规则: 

④从Spring获取Bean对象(对象装配/对象注入)

对象注入的三种方式: 

1、属性注入 (@Autowired)

2、构造方法注入 (官方推荐写法)

3、Setter注入 

@Resource注解以及它和@Autowired的区别 

1、提供方不同 

2、支持的注入方式有不同 

3、支持的参数不同 

属性注入、构造方法注入、Setter注入三种方式获取bean的区别 


①从Maven中央仓库获取spring-context和spring-beans的依赖,将依赖引入到pom.xml中

  如下配置:

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.24</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.3.24</version>
        </dependency>
    </dependencies>

②配置扫描路径 

找到之前保存在Gitee的相关配置代码:

<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">

    <!-- 配置 Spring 扫描的根路径(此根路径下的所有 Spring 存对象的注解才能生效) -->
    <content:component-scan base-package="com.demo.spring.beans"></content:component-scan>

</beans>

在resources文件中配置spring-config.xml文件并复制以上内容 (注意:配置扫描根路径需要更改为和自己的一致)

  

③添加注解存储Bean对象(可以使用5大类注解和方法注解) 

1: 使用 5 大类注解实现:@Controller[控制器],@Service[服务],@Repository[仓库],
@Configuration[配置],Component[组件]

2: 通过方法注解: @Bean方法

 类注解(写在类上,作用于类上)

@Controller:类标记为控制器 

控制器:三层架构当中的Controller对应的类

@Controller注解当中传入的参数,就是这一个类对象的名称。 

package com.demo.spring.beans;

import org.springframework.stereotype.Controller;

@Controller("Student")
public class Student {
    public void sayHi(){

        System.out.println("Hi Student");
    }
}

需要注意的是:如果我们在@Controller注解中传入参数了,那么在使用的时候就要按照这个参数的名称来:

 如果不一样就会得不到Bean对象:

并且,如果没有给@Controller传入参数的话,默认情况下是小驼峰命名(除了类名是开头两个字母都是大写的情况,如SUser,那么默认也是这个名字) 

 上述原因还是因为Spring的源码规定的:

 在源码中找到这两个方法:

@Service

作用与Controller一样,用于标注"业务逻辑层"的对象。

@Repository

作用与Controller一样,用于标注"持久层"的对象

@Component

不属于前面的任意3层,那么这个注解就可以认为是一个"工具"。

@Configuration

作用与Controller一样,用于标注"配置类"。
以上的注解作用都一样,这里就不一一演示了。 

为什么需要这么多注解? 

这是让代码的可读性更高,能够让程序员能够直观的判断当前类的用途 。

一般软件开发分四个层次: 

@Controller:表示的是业务逻辑层;
@Servie:服务层;
@Repository:持久层;
@Configuration:配置层; 

上述的@Component不在这四层之内。 

类注解之间的关系 (除了@Component注解以外的注解,都是基于@Component来实现的。也就是说,@Component是上述所有注解的父类。)

如@Controller: 

方法注解(作用在方法上的注解) @Bean

 先重新创建一个User类:

package com.demo.spring.beans;

public class User {
    private int Id;
    private String name;

    public int getId() {
        return Id;
    }

    public void setId(int id) {
        Id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "Id=" + Id +
                ", name='" + name + '\'' +
                '}';
    }
}

再创建一个UserBeans:

1、要在类上再加一个5大类注解之一

2、在方法中加Bean注解

为什么不直接加@Bean注解,还需要加类注解? 

为了提高效率,当我们添加了5大类注解的时候,Spring就会去扫描这些注解的类,可以大大缩减扫描的范围,然后扫描被@Bean注解的方法。

package com.demo.spring.beans;

import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;

@Controller
public class UserBeans {
    @Bean//方法返回的对象存储在Spring容器
    public User user(){
        //创建User对象
        User user=new User();
        //设置属性
        user.setId(1);
        user.setName("张三");
        //返回对象
        return user;
    }

}

还可以指定返回对象的名称(指定之后原对象名称不可用) 

    @Bean(name = {"userInfo","user2"})
    public User user(){
        //创建User对象
        User user=new User();
        //设置属性
        user.setId(1);
        user.setName("张三");
        //返回对象
        return user;
    }

获取User对象 

import com.demo.spring.beans.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
       User user= context.getBean("userInfo", User.class);
        System.out.println(user.toString());
    }
}

注意:指定返回对象的名称后不能用原来的对象名称,比如上述的只能使用userInfo和user2,而不能使用user:

总结@Bean注解的使用规则: 

1、使用@Bean注解的时候要和5大类注解一起使用,这样才能把方法的返回值注入到IoC容器中

2、如果没有指定bean的name属性,默认为方法名,一旦指定就不能用方法名,一个bean可以指定多个name

3、使用@Bean注解了多个方法的时候,并且是相同类型的bean的时候,一定要使用ID+类名的方式使用getBean()方法,否则会出现报错

④从Spring获取Bean对象(对象装配/对象注入)

对象注入的三种方式: 

1、属性注入

2、构造方法注入

3、Setter注入 

1、属性注入 (@Autowired)

属性注入:把需要获取的对象作为类的属性

如下面把Service类注入到Controllerl类当中:

Service类:

package com.demo.spring.beans;

import org.springframework.stereotype.Service;

@Service
public class UserService {

    public void sayHi(){
        System.out.println("Hi UserService");
    }
}

Controller类: 

package com.demo.spring.beans;

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

@Controller
public class UserController {
    @Autowired
    private UserService userService;

    public void sayHi(){
        userService.sayHi();
    }
}

启动类: 

import com.demo.spring.beans.UserController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App2 {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
       UserController userController= context.getBean(UserController.class);
       userController.sayHi();
    }
}

2、构造方法注入 (官方推荐写法)

构造方法注入就是在类的构造方法中实现注入 :

package com.demo.spring.beans;

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

@Controller
public class UserController2 {
    private UserService userService;
    //在构造方法上加@Autowired注解
    @Autowired
    public UserController2(UserService userService){
        this.userService=userService;
    }
    public void sayHi(){
        userService.sayHi();
    }
}

App启动类:

import com.demo.spring.beans.UserController2;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App3 {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
        UserController2 userController2=context.getBean("userController2", UserController2.class);
        userController2.sayHi();

    }
}

  

注意:如果只有一个构造方法的话,上面的@Autowired注解可以省略,官方是这样设定的,如果有多个就不能省略的,并且@Autowired注解只能在一个构造方法上。 

3、Setter注入 

Setter 注⼊和属性的 Setter ⽅法实现类似,只不过在设置 set ⽅法的时候需要加上@Autowired注解 

package com.demo.spring.beans;

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

@Controller
public class UserController3 {
    private UserService userService;
    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    public void sayHi(){
        userService.sayHi();
    }
}

App启动类:

import com.demo.spring.beans.UserController3;
import com.demo.spring.beans.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App4 {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
        UserController3 userController3=context.getBean("userController3",UserController3.class);
        userController3.sayHi();
    }
}

 

@Resource注解以及它和@Autowired的区别 

@Resource注解和@Autowired注解的作用相似,但是它们还是有些不同的。(一般还是使用@Autowired) 

1、提供方不同 

@Resource是jdk提供的注解,而@Autowired是Spring提供的 

2、支持的注入方式有不同 

@Autowired支持以上3种注入方式,而@Resource不支持构造方法注入

3、支持的参数不同 

@Resource支持更多的参数设置,比如 name,type 设置,而@Autowired只支持required参数设置 

属性注入、构造方法注入、Setter注入三种方式获取bean的区别 

①属性注入,简单易用,但是只限于在IoC容器中使用。同时使用属性注入的时候如果这个属性对应的bean不在容器中,属性注入的写法就会失效。

②构造方法注入,安全性升级,有良好的通用性,支持非Ioc容器。它保证了使用这个类的其他方法之前,属性已经被注入了(构造方法的缘故),避免了NullPointException。

③Setter方法注入,写法复杂一点,支持非IoC容器,同时通用性好,适合单元性测试。程序猿可以通过调用setter方法进行不同参数的传入

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

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

相关文章

【致敬未来的攻城狮计划】— 连续打卡第十一天:FSP固件库开发点亮第一个灯。

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 3.欲速则不达&#xff0c;今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

leetcode刷题--辅助工具

idea插件 插件商店搜索leetcode&#xff0c;可以让你利用idea调试leetcode的题目 插件首先需要填写用户名密码登录&#xff0c;登录上就可以在idea搜题、做题、提交等 注意&#xff1a; 一些版本登录可能登录失败&#xff0c;解决方法是换leetcode地址为leetcode.cn。 有些可…

通过用户名密码认证保障 MQTT 接入安全

认证是一种安全措施&#xff0c;用于识别用户并验证他们是否有权访问系统或服务器。它能够保护系统免受未经授权的访问&#xff0c;确保只有经过验证的用户才能使用系统。 物联网连接万物&#xff0c;对试图访问基础设施的用户进行认证至关重要。未经授权的访问存在重大的安全…

数据保管库的数据质量错误

数据保管库的数据质量错误 在过去的几年里&#xff0c;数据仓库发生了巨大的变化&#xff0c;但这并不意味着支撑健全数据架构的基本原理需要被抛在窗外。事实上&#xff0c;随着GDPR等数据法规的日益严格以及对优化技术成本的重新重视&#xff0c;我们现在看到了“Data Vault…

设计模式之备忘录模式(C++)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 一、备忘录模式是什么&#xff1f; 备忘录模式是一种行为型的软件设计模式&#xff0c;在不破坏封装的前提下&#xff0c;获取一个…

OpenCV实例(八)行人跟踪

OpenCV实例&#xff08;八&#xff09;行人跟踪 1.目标跟踪概述2.基于背景差分检测运动物体2.1 实现基本背景差分器2.2 使用MOG背景差分器2.3 使用卡尔曼滤波器寻找运动趋势 3.跟踪行人 作者&#xff1a;Xiou 1.目标跟踪概述 目标跟踪是对摄像头视频中的移动目标进行定位的过…

数据结构与算法基础-学习-20-查找之散列表(HASH TABLE)

目录 目录 一、基本思想 二、术语 1、散列方法 2、散列函数 3、散列表 4、冲突 5、同义词 三、如何减少哈希冲突 四、构造散列函数需考虑的情况 五、散列函数的构造方法 1、直接定址法 2、除留余数法 六、如何处理哈希冲突 1、开地址法 2、拉链法 七、散列表查…

【微服务笔记16】微服务组件之Gateway服务网关基础环境搭建、高可用网关环境搭建

这篇文章&#xff0c;主要介绍微服务组件之Gateway服务网关基础环境搭建、高可用网关环境搭建。 目录 一、Gateway服务网关 1.1、什么是Gateway 1.2、Gateway基础环境搭建 &#xff08;1&#xff09;基础环境介绍 &#xff08;2&#xff09;引入依赖 &#xff08;3&#…

快速上手Navicat~

众所周知&#xff0c; Navicat是一款轻量级的用于MySQL连接和管理的工具&#xff0c;非常好用&#xff0c;使用起来方便快捷&#xff0c;简洁。下面我会简单的讲一下其安装以及使用的方法。并且会附带相关的永久安装教程。 简介 一般我们在开发过程中是离不开数据库的&#xf…

【Unity VR开发】结合VRTK4.0:添加对象追随器

语录&#xff1a; 我已经准备好了足够挡雨的伞&#xff0c;可是却迟迟没有等到雨的到来&#xff0c;这样的尴尬只是我漫长人生中的小插曲罢了。 前言&#xff1a; 对象追随器的目的是让一个或多个游戏对象跟随场景中的另一个对象&#xff0c;而无需将游戏对象嵌套在彼此之下。 …

『pyqt5 从0基础开始项目实战』13. 打包生成exe(保姆级图文)

目录 项目源码打包exe打开闪退需要db文件夹总结 欢迎关注 『pyqt5 从0基础开始项目实战』 专栏&#xff0c;持续更新中 欢迎关注 『pyqt5 从0基础开始项目实战』 专栏&#xff0c;持续更新中 项目源码 请查阅专栏上文获取源码 ## 安装库包 python pip install pyinstaller ![…

Stable Diffusion的原理

CSDN-markdown语法之怎样使用LaTeX语法编写数学公式 参考视频&#xff1a;【diffusion】扩散模型详解&#xff01;原理代码&#xff01; 用一颗桃树为你讲清楚 知识点&#xff1a;AI绘图原理 Diffusion扩散模型 Windows深度学习环境搭建&#xff1a;Windows深度学习环境搭建 …

FFmpeg开发笔记(三)FFmpeg的可执行程序介绍

外界对于FFmpeg主要有两种使用途径&#xff0c;一种是在命令行运行FFmpeg的可执行程序&#xff0c;该方式适合没什么特殊要求的普通场景&#xff1b;另一种是通过代码调用FFmpeg的动态链接库&#xff0c;由于开发者可以在C代码中编排个性化的逻辑&#xff0c;因此该方式适合厂商…

一篇文章介绍分布式事务

1、事务的基本概念 事务 事务指的就是一个操作单元&#xff0c;在这个操作单元中的所有操作最终要保持一致的行为&#xff0c;要么所有操作都成功&#xff0c;要么所有的操作都被撤销。简单地说&#xff0c;事务提供一种“要么什么都不做&#xff0c;要么做全套”机制。 本地…

【越早知道越好】的道理——能够大大提升效率的【快捷键】

文章目录 1️⃣虚拟桌面第一步&#xff1a;打开任务视图第二步&#xff1a;创建桌面第三步&#xff1a;桌面切换第四步&#xff1a;桌面删除 2️⃣窗口切换3️⃣桌面分屏如何分屏 前言&#x1f9d1;‍&#x1f3a4;&#xff1a;作为程序员&#x1f468;‍&#x1f4bb;&#xf…

scratch足球射门练习 中国电子学会图形化编程 少儿编程 scratch编程等级考试一级真题和答案解析2023年3月

目录 scratch足球射门练习 一、题目要求 1、准备工作 2、功能实现 二、案例分析

基于Java+SpringBoot+Vue前后端分离仓库管理系统设计实现

基于JavaSpringBootVue前后端分离仓库管理系统设计实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式…

RocketMQ 5.0 时代,6 张图带你理解 Proxy!

大家好&#xff0c;我是君哥。今天来聊一聊 RocketMQ 5.0 中的 Proxy。 RocketMQ 5.0 为了更好地拥抱云原生&#xff0c;引入了无状态的 Proxy 模块&#xff0c;新的架构图如下&#xff1a; 引入 Proxy 模块后&#xff0c;Proxy 承担了协议适配、权限管理、消息管理等计算功能…

JVM垃圾回收GC 详解(java1.8)

目录 垃圾判断算法&#xff08;你是不是垃圾&#xff1f;&#xff09; 引用计数法 可达性算法 对象的引用 强引用 软引用 弱引用 虚引用 对象的自我救赎 垃圾回收算法--分代 标记清除算法 复制算法 标记整理法 垃圾处理器 垃圾判断算法&#xff08;你是不是垃圾&…

Anaconda+PyTorch环境搭建

AnacondaPyTorch环境搭建 环境Anaconda安装配置下载镜像 cuda和cudnncudacudnn pytorch参考文章 环境 win10 22hx nvidia driver 528.89 Anaconda安装 在清华镜像中选择合适的版本及对应系统 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 下载好之后一路next即可…