SpringBoot中的bean管理示例详解

 更新时间:2023年06月28日 15:15:34   作者:曼诺尔雷迪亚兹  
这篇文章主要介绍了SpringBoot中的bean管理,本文结合示例代码给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、获取bean

1.默认情况下,Spring项目启动时,会把bean都创建好放在IOC容器中,如果想要主动获取这些bean,可以通过如下方式:

根据name获取bean:

object getBean (String name)

根据类型获取bean:

<T> T getBean (Class<T> requiredType)

根据name获取bean(带类型转换) :

<T> TgetBean(String name,Class<T> requiredType)

示例:

package com.itheima;
import com.itheima.controller.DeptController;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
@SpringBootTest
class SpringbootWebConfig2ApplicationTests {
    @Autowired
    private ApplicationContext applicationContext;  //IOC容器对象
    //获取bean对象
    @Test
    public void testGetBean() {
        //根据bean的名称获取     //声明一个bean对象没有指定名字时,默认是类名首字母小写
        DeptController bean1 = (DeptController) applicationContext.getBean("deptController");
        System.out.println(bean1);
        //根据bean的类型获取
        DeptController bean2 = applicationContext.getBean(DeptController.class);
        System.out.println(bean2);
        //根据bean的名称及类型获取
        DeptController bean3 = applicationContext.getBean("deptController", DeptController.class);
        System.out.println(bean3);
    }

运行结果:

上述所说的【Spring项目启动时,会把其中的bean都创建好】还会受到作用域延迟初始化影响,这里主要针对于默认的单例 非延迟加载的bean而言。

二、bean作用域

spring支持五种作用域,后三种在web环境才生效:

作用域说明
singleton容器内同名称的bean只有一个实例(单例)(默认)
prototype每次使用该 bean时会创建新的实例(非单例)
request每个请求范围内会创建新的实例(web环境中,了解)
session每个会话范围内会创建新的实例((web环境中,了解)
application每个应用范围内会创建新的实例(web环境中,了解)

1.设置作用域

可以通过@Scope注解来进行配置作用域:

//@Lazy   //延迟初始化 --延迟到第一次使用的时候
@Scope("prototype")  //将作用域设置为非单例的prototype--每次调用后bean对象都不同
@RestController
@RequestMapping("/depts")
public class DeptController {
}

默认singleton的bean,在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时)。prototype的bean,每一次使用该bean的时候都会创建一个新的实例。实际开发当中,绝大部分的Bean是单例的,也就是说绝大部分Bean不需要配置scope属性。

三、第三方bean

常见的bean管理的类@Component @Controller @Service @Repository.但是存在第三方的bean–比如:引入的第三方依赖的bean,*示例:为了解析XML文件所添加到pom的依赖:

<!--Dom4j-->
<dependency>
    <groupId>org.dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>2.1.3</version>
</dependency>

* test中的类:

    //第三方bean的管理
    @Test
    public void testThirdBean() throws Exception {
        SAXReader saxReader = new SAXReader();  //读取XML文件,下面逻辑是对XML文件的解析
        Document document = saxReader.read(this.getClass().getClassLoader().getResource("1.xml"));
        Element rootElement = document.getRootElement();
        String name = rootElement.element("name").getText();
        String age = rootElement.element("age").getText();
        System.out.println(name + " : " + age);
    }

按照之前的学习,我们就需要在SAXReader这个类上添加@Component注解,但是这个类是read-only,所以不能添加注解将其变成bean对象。

如果要管理的bean对象来自于第三方(不是自定义的),是无法用@Component 及衍生注解声明bean的,就需要用到@Bean注解。

在启动类上添加加一个新的方法,并且添加@Bean注解:

//声明第三方bean
@Bean  //将当前方法的返回值对象交给Ioc容器管理,成为IOC容器bean
public SAXReader saxReader() {
    return new SAXReader();
}

现在可以在读取XML文件的类上添加@Autowried注解来注入这个类的bean对象:

    @Autowired
    private SAXReader saxReader;
    //第三方bean的管理
    @Test
    public void testThirdBean() throws Exception {
        /** 
		 * SAXReader saxReader = new SAXReader();  //读取XML文件,
		*/
		//下面逻辑是对XML文件的解析
        Document document = saxReader.read(this.getClass().getClassLoader().getResource("1.xml"));
        Element rootElement = document.getRootElement();
        String name = rootElement.element("name").getText();
        String age = rootElement.element("age").getText();
		//输出XML中的数据(解析后)
        System.out.println(name + " : " + age);
    }

缺点:若要管理的第三方bean对象,建议对这些bean进行集中分类配置,而不是如上放在启动类中,可以通过@Configuration注解声明一个配置类。

  • 通过@Bean注解的name或value属性可以声明bean的名称,如果不指定,默认bean的名称就是方法名。
  • 如果第三方bean需要依赖其它bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。

到此这篇关于SpringBoot中的bean管理的文章就介绍到这了,更多相关SpringBoot bean管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入解析Java的Spring框架中的混合事务与bean的区分

    深入解析Java的Spring框架中的混合事务与bean的区分

    这篇文章主要介绍了Java的Spring框架中的混合事务与bean的区分,Spring是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2016-01-01
  • 关于SpringBoot简介、官网构建、快速启动的问题

    关于SpringBoot简介、官网构建、快速启动的问题

    SpringBoot 是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程,这篇文章主要介绍了SpringBoot简介、官网构建、快速启动,需要的朋友可以参考下
    2022-07-07
  • SpringBoot集成JWT实现登陆验证的方法详解

    SpringBoot集成JWT实现登陆验证的方法详解

    JSON Web Token(JWT)是一个开放的标准(RFC 7519),它定义了一个紧凑且自包含的方式,用于在各方之间以JSON对象安全地传输信息。本文将利用SpringBoot集成JWT实现登陆验证,感兴趣的可以了解一下
    2022-05-05
  • java并发编程中实现可见性的四种可行方案解析

    java并发编程中实现可见性的四种可行方案解析

    这篇文章主要介绍了java并发编程中实现可见性的四种可行方案解析,使用关键字volatile和使用锁(如synchronized关键字或者java.util.concurrent包中的锁)来确保对共享变量的修改在多线程环境中能够正确地被其他线程所观察到,需要的朋友可以参考下
    2023-08-08
  • Springboot错误页面和错误信息定制操作

    Springboot错误页面和错误信息定制操作

    这篇文章主要介绍了Springboot错误页面和错误信息定制操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • java中的Io(input与output)操作总结(三)

    java中的Io(input与output)操作总结(三)

    这一节我们来讲Scanner类和PrintWriter类的用法,感兴趣的朋友可以了解下
    2013-01-01
  • Java中&&与?表达式结合时出现的坑

    Java中&&与?表达式结合时出现的坑

    这篇文章主要给大家介绍了关于Java中&&与?表达式结合时出现的坑的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • SpringBoot详解MySQL如何实现读写分离

    SpringBoot详解MySQL如何实现读写分离

    当响应的瓶颈在数据库的时候,就要考虑数据库的读写分离,当然还可以分库分表,那是单表数据量特别大,当单表数据量不是特别大,但是请求量比较大的时候,就要考虑读写分离了.具体的话,还是要看自己的业务...如果还是很慢,那就要分库分表了...我们这篇就简单讲一下读写分离
    2022-09-09
  • spring boot实战之本地jar包引用示例

    spring boot实战之本地jar包引用示例

    本篇文章主要介绍了spring boot实战之本地jar包引用示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Hadoop MapReduce实现单词计数(Word Count)

    Hadoop MapReduce实现单词计数(Word Count)

    这篇文章主要为大家详细介绍了如何利用Hadoop实现单词计数(Word Count)的MapReduce,文中的示例代码讲解详细,感兴趣的可以跟随小编一起学习一下
    2023-05-05

最新评论