spring中存储和获取bean对象

news2024/11/16 9:40:46

文章目录

  • 1. 存储bean对象
    • 1.1 使用配置文件存储bean对象
    • 1.2 使用五大类注解存储bean对象
      • 1.2.1 类注解
      • 1.2.2 五大类注解的作用
      • 1.2.3 方法注解
  • 2.获取bean对象
    • 2.1 属性注入
    • 2.2 构造器注入
    • 2.3 getter注入
    • 2.4 注入对象的时候有`spring`中有多个`bean`对象怎么办
      • 2.4.1 将类中属性的名字,改成和要注入的`bean`对象的名字一样
      • 2.4.2 在 `@Autowired`注解下面加`@Qualifier`注解
      • 2.4.3 抛弃`@Autowired`注解, 使用`@Resource`注解
    • 2. 5 @Autowired和@Resource注解的区别

1. 存储bean对象

存储 Bean 分为以下 2 步:

  1. 存储 Bean 之前,先得有 Bean 才⾏,因此先要创建⼀个 Bean, 说白了也就是写一个类。
  2. 告诉spring,把这个类的对象存起来。

1.1 使用配置文件存储bean对象

  1. 编写User类, 有sayHi方法。
public class User {
    public void sayHi() {
        System.out.println("你好");
    }
}
  1. 告诉spring,把这个类的对象存起来。
    在配置文件中可以通过<bean>标签来告诉spring把对象存起来。
<bean id="user1" class="demo.User"></bean>
  • id : 是用来标识一个对象的,就像我们的身份证一样。
    也称为bean对象的name(名字), 后面通过这个名字就能找到这个对象。
  • class:是带包的类名, 让spring知道我们要存的是哪一个类的对象。

完整的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">
    <bean id="user1" class="demo.User"></bean>
</beans>

注意:配置文件其他的标签不用管,直接复制粘贴,需要关注的是<bean>标签。


怎么知道Spring把对象存起来了呢?我们查找一下这个bean对象的name(名字) 就行了。
使用BeanFactory或者ClassPathXmlApplicationContext就能查找bean对象了。

BeanFactory的代码如下:
在这里插入图片描述

public class Test {
    public static void main(String[] args) {
        //创建BeanFactory的实现类的对象
        BeanFactory beanFactory =
                new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
                
        //根据名字查找bean对象
        User user1 = (User)beanFactory.getBean("user1");
        
        //调用sayHi()方法
        user1.sayHi();
    }
}

结果:

在这里插入图片描述

如何创建BeanFactory对象:

  • BeanFactory是一个接口,XmlBeanFactory是其中的一个实现类,因为我们用xml文件来告诉spring存储bean对象,所以用XmlBeanFactory这个类。
  • XmlBeanFactory 其中的一个构造器的参数类型是:Resource
    Resource也是一个接口, 所以还需要创建Resource接口的实现类。

使用ClassPathXmlApplicationContext上下文对象,查找bean对象。

public class Test {
    public static void main(String[] args) {
        test2();
    }

    public static void test2() {
        //创建上下文对象
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");

        //查找bean对象,第二个参数传了User的类型,得到bean对象后就无需转型了
        User user1 = context.getBean("user1", User.class);
        user1.sayHi();
    }
}

结果:
在这里插入图片描述

1.2 使用五大类注解存储bean对象

xml的形式来存储对象会比较麻烦,如果需要存很多个对象,就需要在xml配置文件中写多个<bean>标签。
这样子会很麻烦。所以spring提供了更加简便的方式来存储bean对象, 那就是使用注解。
下面介绍使用注解存储bean对象。

使用注解的方式,也要配置xml文件,不过只需要配置一个标签:<content:component-scan>
配置文件如下:

<?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="demo"></content:component-scan>
</beans>

说明:
<content:component-scan>这个标签用来配置包扫描路径, base-package="demo"配置的就是具体的包。
作用就是告诉spring在哪个包下扫描带有注解的类。spring扫描到带有注解的类就会为这个类创建对象。

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

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

  1. 类注解:
    @Controller(控制器)、@Service(服务)、
    @Repository(仓库)、@Component(组件)、@Configuration(配置)。
  2. ⽅法注解:
    @Bean

1.2.1 类注解

  1. 使用@Controller类注解

在下面的代码中创建了ControllerTest类,有sayHello方法,类的上面有@Controller注解
有了这个@Controller注解,spring就能扫描到这个类,然后spring就会创建对象了。

@Controller
public class ControllerTest {
    public void sayHello() {
        System.out.println("hello, 正在测试@Controller注解");
    }
}

测试类:

public class Test {
    public static void main(String[] args) {
        test3();
    }

   public static void test3() {
        //创建上下文对象
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");

        //获取bean对象, 如果没有在注解上加参数,默认用类名的首字母小写获取bean对象
        ControllerTest controllerTest = context.getBean("controllerTest", ControllerTest.class);
        controllerTest.sayHello();
    }

结果:
在这里插入图片描述

注意:
如果在注解上没有指定bean对象的名字,将类名的首字母小写后作为bean对象的名字获取bean对象。
ControllerTest类名小写后是controllerTest,所以用controllerTest可以获取到bean对象。

也可以在注解上传参,指定bean对象的名字。

在这里插入图片描述

根据名字获取bean对象

在这里插入图片描述

  1. 使用@Service注解
    @Service注解跟@Controller的用法几乎一模一样。
@Service
public class ServiceTest {
    public void sayHello() {
        System.out.println("hello, 正在测试@Service注解");
    }
}
public class Test {
    public static void main(String[] args) {
        test4();
    }
    
    public static void test4() {
        //创建上下文对象
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");

        //获取bean对象, 如果没有在注解上加参数,默认用类名的首字母小写获取bean对象
        ServiceTest serviceTest = context.getBean("serviceTest", ServiceTest.class);
        serviceTest.sayHello();
    }
}

在这里插入图片描述
@Repository, @Component, @Configuarion注解用法跟上面的代码差不多,就不再演示了。

1.2.2 五大类注解的作用

因为后端程序是分层的,这五个类注解,分别就代表不同的层。
@Controller代表了业务逻辑层。
@Service代表了服务层。
@Repository代表了数据层。
@Configuration是配置层。
这些类注解功能是一样的,都是告诉spring存储bean对象。
但是当我们看到一个类上带了@Controller注解的时候,我们就清楚了,这个类处于 哪一层的,是干什么的。
在这里插入图片描述
这样做这样可以大大提高程序的可阅读性。

在这里插入图片描述

1.2.3 方法注解

@Bean方法注解用来将方法返回的对象存到spring中。

ControllerTest类中,写一个getObj方法,这个方法返回的ArrayList对象会存到spring

@Controller("con")
public class ControllerTest {
    public void sayHello() {
        System.out.println("hello, 正在测试@Controller注解");
    }

    @Bean(name = "list")
    public ArrayList<Integer> getObj() {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        return list;
    }
}

测试列:

public class Test {
    public static void main(String[] args) {
        test5();
    }
    
   public static void test5() {
        //创建上下文对象
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        //根据name获取bean对象
        ArrayList<Integer> list = context.getBean("list", ArrayList.class);
        System.out.println(list.get(0));
    }
}

输出:

在这里插入图片描述

2.获取bean对象

获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,也可以叫对象注⼊。
对象注⼊的实现⽅法以下 3 种:

  1. 属性注⼊
  2. 构造⽅法注⼊
  3. Setter 注⼊

使用@Autowired或者@Resource注解实现spring中的bean对象注入。
这里用@Autowired注解进行演示。

2.1 属性注入

UserService

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

UserController

获取spring中的对象使用@Autowired注解,将UserService类的bean对象注入进来

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

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

测试类:

public class Test {
    public static void main(String[] args) {
        test6();
    }
    
	public static void test6() {
        //创建上下文对象
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        //获取bean对象
        UserController userController = context.getBean("userController", UserController.class);
        userController.sayHi();
    }
}

在这里插入图片描述
输出了HiUserSevice类的bean对象成功被注入了。

2.2 构造器注入

@Autowired注解放在构造器的上面,加一个形参,就可以实现构造器注入了。

@Controller
public class UserController {
    private UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }
    public void sayHi() {
        userService.sayHi();
    }
}

2.3 getter注入

getter注入也一样,将@Autowired注解放在getter方法上即可。

@Controller
public class UserController {
    private UserService userService;

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

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
}

2.4 注入对象的时候有spring中有多个bean对象怎么办

当注入对象的时候,spring中有多个对象的时候,就要告诉spring获取的是哪个bean对象。
但是@Autowired注解不能传入bean对象的名字,所以要用其他的方式来解决这个问题。

在这里插入图片描述

这时候有三种做法:

  1. 将类中属性的名字,改成和要注入的bean对象的名字一样
  2. @Autowired注解下面加@Qualifier注解
  3. 抛弃@Autowired注解, 使用@Resource注解

下面演示这三种不同处理方法:

2.4.1 将类中属性的名字,改成和要注入的bean对象的名字一样

Student类, 有idnameage属性, set方法和toString方法。

public class Student {
    private int id;
    private String name;
    private int age;
    
    public void setId(int id) {
        this.id = id;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public void setAge(int age) {
        this.age = age;
    }

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

StudentService类, 使用了方法注解@Bean将两个Student类的对象存到spring中。

@Service
public class StudentService {
    @Bean("stu1")
    public Student getStu1() {
        Student student = new Student();
        student.setId(1);
        student.setName("张三");
        student.setAge(22);
        return student;
    }

    @Bean("stu2")
    public Student getStu2() {
        Student student = new Student();
        student.setId(2);
        student.setName("李四");
        student.setAge(23);
        return student;
    }
}

StudentController类中,有属性stu1showStuInfo方法, 使用@Autowired将对象注入到属性上。

@Controller("stucon")
public class StudentController {
    @Autowired
    private Student stu1;

    public void showStuInfo() {
        System.out.println(stu1.toString());
    }
}

stu1属性名bean对象的名字一样。

在这里插入图片描述

在这里插入图片描述

测试类:

public class Test {
    public static void main(String[] args) {
        test7();
    }
    
	public static void test7() {
        //创建上下文对象
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        
        StudentController studentController = context.getBean("stucon", StudentController.class);
        studentController.showStuInfo();
    }
}

输入出:

在这里插入图片描述

2.4.2 在 @Autowired注解下面加@Qualifier注解

@Qualifier注解的源码,使用注解的时候,可以传递value的值
在这里插入图片描述

@Qualifier注解的中加上bean对象的名字,spring就知道要注入哪一个bean对象了。

StudentController类如下。

@Controller("stucon")
public class StudentController {
    @Autowired
    @Qualifier("stu1")
    private Student stu;

    public void showStuInfo() {
        System.out.println(stu.toString());
    }
}

2.4.3 抛弃@Autowired注解, 使用@Resource注解

@Resource注解的部分源码。

在这里插入图片描述

在注解上传递一个参数即可,name = "stu1"就表示要注入名为stu1bean对象

@Controller("stucon")
public class StudentController {
    @Resource(name = "stu1")
    private Student stu;

    public void showStuInfo() {
        System.out.println(stu.toString());
    }
}

2. 5 @Autowired和@Resource注解的区别

  • 出身不同。@Autowired来自于spring,而@ResourceJDK自带的。
  • 传参不同。@Resource相比@Autowired,可以传递的参数更多。
  • @Autowired注解可以用于属性注入,构造方法注入,setter注入。
    @Resource注解只能用于属性注入和setter注入, 不同用于构造方法注入。
    因为@Autowried注解可以修饰属性,构造器,和方法,@Resource不能修饰构造器,但可以修饰属性和方法。

@Autowried注解部分源码

在这里插入图片描述

@Resource注解部分源码

在这里插入图片描述

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

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

相关文章

ava版知识付费平台免费搭建 Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台

提供私有化部署&#xff0c;免费售后&#xff0c;专业技术指导&#xff0c;支持PC、APP、H5、小程序多终端同步&#xff0c;支持二次开发定制&#xff0c;源码交付。 Java版知识付费-轻松拥有知识付费平台 多种直播形式&#xff0c;全面满足直播场景需求 公开课、小班课、独…

数据结构基础:2.顺序表。

顺序表的介绍和实现 一.线性表1.基本概念&#xff1a; 二.顺序表&#xff1a;1.基本概念&#xff1a;分类&#xff1a;1.静态顺序表&#xff1a;分类&#xff1a;2.动态顺序表&#xff1a;2.动态顺序表的功能接口的实现&#xff1a;0.顺序表打印&#xff1a;1.初始化和删除&…

功率放大器在电光调制中的应用有哪些

电光调制是一种利用光电效应将电信号转化为光信号的技术。在实现电光调制的过程中&#xff0c;功率放大器作为一个重要的组件&#xff0c;具有对输入电信号进行放大和控制的功能。本文将介绍功率放大器的基本原理、特点以及在电光调制中的应用。 基本原理 功率放大器是一种能够…

新建Git仓库,将本地文件上传至仓库

1、新建仓库&#xff0c;勾选初始化仓库 2、复制仓库链接 3、打开本地文件目录 右键选择 Git Bash Here 打开命令窗口 4、依次按照下面的步骤&#xff08;*如果报错&#xff0c;看原目录下是否存在 .git 需要删除&#xff09; // 生成git文件 git init // 把文件加入暂存区 g…

DeepSpeed-MoE:训练更大及更复杂的混合专家网络

这是微软发布在2022 ICML的论文&#xff0c;MoE可以降低训练成本&#xff0c;但是快速的MoE模型推理仍然是一个未解决的问题。所以论文提出了一个端到端的MoE训练和推理解决方案DeepSpeed-MoE&#xff1a;它包括新颖的MoE架构设计和模型压缩技术&#xff0c;可将MoE模型大小减少…

Java基础篇

前言&#xff1a;此篇博客笔者参考了JavaGuide、三分恶等博主的八股文&#xff0c;结合Chat老师和自己的理解&#xff0c;整理了一篇关于Java基础的八股文。全篇图文并茂&#xff0c;每个知识点都有细致描述&#xff0c;详略得当&#xff0c;理解通透。希望对各位读者有所帮助&…

Python(四十二)流程控制语句——continue

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

reids集群删除某个集群节点

由于服务期调整&#xff0c;已经配好的集群&#xff0c;要删除几个节点&#xff0c;利用命令redis-cli --cluster del-node ip:prot 结果删除失败了&#xff0c;报错&#xff1a; ERR Unknown subcommand or wrong number of arguments for del-node。help查了下&#xff0c;没…

【数据结构】实验二:顺序表

实验二 顺序表 一、实验目的与要求 1&#xff09;熟悉顺序表的类型定义&#xff1b; 2&#xff09;熟悉顺序表的基本操作&#xff1b; 3&#xff09;灵活应用顺序表解决具体应用问题。 二、实验内容 1&#xff09;在一个整数序列a1,a2,…,an中&#xff0c;若存在一个数&…

调用post请求方式的feign接口怎么传递多个参数,包含对象和字符串

今天尝试把自己原来的项目上的权限管理相关的类抽离开来&#xff0c;并建立一个统一的权限管理平台&#xff0c;然后项目中要用到的权限相关资源通过feigin请求权限平台的对应接口获取。 现在有一个需求&#xff0c;页面上有一个一键获取资源权限的按钮&#xff0c;点击一下&a…

python_PyQt5开发验证K线视觉想法工具V1.0

目录 写在前面&#xff1a; 使用过程&#xff1a; 代码&#xff1a; 导入的包、字符型横坐标、K线控件 K线图控件 放置标记数据表格控件 输入并设置标记数据控件 主界面 运行代码 写在前面&#xff1a; 开发这个工具的初衷&#xff0c;是基于在分析股票实践中想批量计算…

Django实现音乐网站 ⑴

使用Python Django框架制作一个音乐网站。 目录 网站功能模块 安装django 创建项目 创建应用 注册应用 配置数据库 设置数据库配置 设置pymysql库引用 创建数据库 创建数据表 生成表迁移文件 执行表迁移 后台管理 创建管理员账户 启动服务器 登录网站 配置时区…

神码ai火车头伪原创设置【php源码】

大家好&#xff0c;给大家分享一下python考什么内容&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 火车头采集ai伪原创插件截图&#xff1a; 1、Python 计算机二级都考什么 Python要到什么程度 考试内容 一、Python语言的基本语法元素…

高算力AI模组前沿应用:基于ARM架构的SoC阵列式服务器

本期我们带来高算力AI模组前沿应用&#xff0c;基于ARM架构的SoC阵列式服务器相关内容。澎湃算力、创新架构、异构计算&#xff0c;有望成为未来信息化社会的智能算力底座。 ▌性能优势AI驱动&#xff0c;ARM架构服务器加速渗透 一直以来&#xff0c;基于ARM架构的各类处理器…

Tooltip文字提示(antd-design组件库)简单使用

1.Tooltip文字提示 简单的文字提示气泡框。 2.何时使用 鼠标移入则显示提示&#xff0c;移出消失&#xff0c;气泡浮层不承载复杂文本和操作。 可用来代替系统默认的 title 提示&#xff0c;提供一个 按钮/文字/操作 的文案解释。 组件代码来自&#xff1a; 文字提示 Tooltip -…

读写分离案例、Mysql主从复制 步骤

在开发大型应用程序时&#xff0c;数据库的性能通常是一个关键问题。读写分离是一种常见的数据库优化技术&#xff0c;可以显著提升数据库的读取操作性能。本文将介绍MySQL主从复制和一个读写分离案例。 1、MySQL主从复制 主从复制是MySQL数据库提供的一种数据复制机制&#…

免费商城搭建、免费小程序商城搭建、之java商城 电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

【黑马头条之内容安全第三方接口】

本笔记内容为黑马头条项目的文本-图片内容审核接口部分 目录 一、概述 二、准备工作 三、文本内容审核接口 四、图片审核接口 五、项目集成 一、概述 内容安全是识别服务&#xff0c;支持对图片、视频、文本、语音等对象进行多样化场景检测&#xff0c;有效降低内容违规风…

vue+ivew model框 select校验遇到的问题

iview model 点击关闭&#xff0c;校验没有通过也会关闭 解决办法&#xff1a; 第一步&#xff1a;自定义页脚内容 <div slot"footer"><Button type"primary" click"confirmCarryOver()">确认</Button><Button click&qu…

python绘制3D条形图

文章目录 数据导入三维条形图bar3d 数据导入 尽管在matplotlib支持在一个坐标系中绘制多组条形图&#xff0c;效果如下 其中&#xff0c;蓝色表示中国&#xff0c;橘色表示美国&#xff0c;绿色表示欧盟。从这个图就可以非常直观地看出&#xff0c;三者自2018到2022年的GDP变化…