SpringBoot——Bean管理

这篇具有很好参考价值的文章主要介绍了SpringBoot——Bean管理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Bean管理

一、获取Bean

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

  • 根据name获取bean: Object getBean(String name)
  • 根据类型获取bean: <T> T getBean(Class <T> requiredType)
  • 根据name获取bean(带类型转换): <T> T getBean(String name,Class <T> requiredType)
//  IOC容器对象
    @Autowired
    private ApplicationContext applicationContext;

    @Test
    public void testBean(){
//      TODO  根据bean名称获取   若没指定bean名称,默认类名首字母小写
        DeptController deptControllerBean1 =(DeptController) applicationContext.getBean("deptController");
        System.out.println(deptControllerBean1); //com.zhangjingqi.controller.DeptController@249b54af

//      TODO 根据bean的类型获取
        DeptController deptControllerBean2 = applicationContext.getBean(DeptController.class);
        System.out.println(deptControllerBean2);//com.zhangjingqi.controller.DeptController@249b54af

//      TODO 根据bean的名称 及 类型获取
        DeptController deptControllerBean3 = applicationContext.getBean("deptController",DeptController.class);
        System.out.println(deptControllerBean3);//com.zhangjingqi.controller.DeptController@249b54af

    }

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

二、 Bean的作用域

Spring支持五中作用域,后三种在Web环境下才生效

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

singleton模式下bean对象情况,并且在容器启动的时候创建好的

@Test
public void testScope(){
    for (int i=0;i<10;i++){
        DeptController deptControllerBean2 = applicationContext.getBean(DeptController.class);
        System.out.println(deptControllerBean2);
    }
}

com.zhangjingqi.controller.DeptController@586728e8
com.zhangjingqi.controller.DeptController@586728e8
com.zhangjingqi.controller.DeptController@586728e8
com.zhangjingqi.controller.DeptController@586728e8
com.zhangjingqi.controller.DeptController@586728e8
com.zhangjingqi.controller.DeptController@586728e8
com.zhangjingqi.controller.DeptController@586728e8
com.zhangjingqi.controller.DeptController@586728e8
com.zhangjingqi.controller.DeptController@586728e8
com.zhangjingqi.controller.DeptController@586728e8

我们也可以在第一次使用的时候实例化 @Lazy

​ 代表延迟初始化,直到第一次使用的时候

@Lazy //
@RestController
@Slf4j
public class DeptController {...}

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

@Scope("prototype")
@RestController
@Slf4j
public class DeptController {}

com.zhangjingqi.controller.DeptController@7f6b57f2
com.zhangjingqi.controller.DeptController@144ee8a7
com.zhangjingqi.controller.DeptController@52b32b70
com.zhangjingqi.controller.DeptController@18c820d2
com.zhangjingqi.controller.DeptController@3d3930fe
com.zhangjingqi.controller.DeptController@5e51ec2e
com.zhangjingqi.controller.DeptController@15f2a43f
com.zhangjingqi.controller.DeptController@4c65d8e3
com.zhangjingqi.controller.DeptController@382faf51
com.zhangjingqi.controller.DeptController@69ce14e6

2.1 注意事项

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

三、第三方Bean

​ 项目开发中,自己开发的类使用@Component以及其三个衍生注解@Controller、@Service、@Repository注入即可

但是还有一种情况是第三方提供的,比如依赖

比如:dom4j就是第三方组织提供的。 dom4j中的SAXReader类就是第三方编写的。

​ 如果我想将SAXReader对象存入到容器,需要在SAXReader类添加@Component注解,但是这是第三方bean,我们是无法修改的是不能添加注解的。

        <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.1.3</version>
        </dependency>

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

​ 启动类也是配置类,我们完全可以在这里进行注入

//Filter是javaweb三大组件之一,不是Spring提供的,如果想要使用三大组件,需要添加这个注解
@ServletComponentScan
@SpringBootApplication
public class SpringbootWebApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootWebApplication.class, args);
    }
    //声明第三方bean
    @Bean //将当前方法的返回值对象交给IOC容器管理, 成为IOC容器bean
    public SAXReader saxReader(){
        return new SAXReader();
    }
}

测试是否可以

​ 创建xml文件,解析下面内容

<?xml version="1.0" encoding="UTF-8"?>
<emp>
    <name>Tom</name>
    <age>18</age>
</emp>

挺完美的

@Autowired
private SAXReader saxReader;
@Test
public void testBean2() throws DocumentException {
    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); // Tom : 18
}

​ 但是在Spring项目中,我们一般会保证启动类的纯粹性,让启动类仅仅是启动类,我们把其他的配置单独列出来文章来源地址https://www.toymoban.com/news/detail-452739.html

@Configuration //配置类 (在配置类当中对第三方bean进行集中的配置管理)
public class CommonConfig {
    //声明第三方bean
    @Bean //将当前方法的返回值对象交给IOC容器管理, 成为IOC容器bean
//通过@Bean注解的name/value属性指定bean名称, 如果未指定, 默认是方法名
    public SAXReader reader(DeptService deptService) {
        System.out.println(deptService);
        return new SAXReader();
    }
}
的返回值对象交给IOC容器管理, 成为IOC容器bean
//通过@Bean注解的name/value属性指定bean名称, 如果未指定, 默认是方法名
    public SAXReader reader(DeptService deptService) {
        System.out.println(deptService);
        return new SAXReader();
    }
}

到了这里,关于SpringBoot——Bean管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 获取Spring中bean工具类

    @RestController(value = “easySqlInjector”) @RequestMapping(value = “bean”) @Api(tags = “3.获取bean操作”) @Slf4j public class BeanController { @Bean(name = “easySqlInjector”) public EasySqlInjector easySqlInjector(){ return new EasySqlInjector(); } 2023-08-09 22:04:20.211 INFO 25656 — [nio-8081-exec-1] c.g.s.controller.BeanController : e

    2024年02月13日
    浏览(58)
  • Spring的存储与获取Bean

    关于 Spring 的创建及简单的使用 可以参考这篇文章 之前的存储方式是利用 bean id=\\\"\\\" class=\\\"\\\"/bean 进行存储 但这种方式存在一个弊端 即需要存储的 Bean 过多时, 手动添加过于繁琐 利用注解可以有效规避这种情况 添加注解存储 Bean 类注解 @Controller: 控制器存储 @Service: 服务存储 @

    2024年02月09日
    浏览(35)
  • spring中存储和获取bean对象

    存储 Bean 分为以下 2 步: 存储 Bean 之前,先得有 Bean 才⾏,因此先要创建⼀个 Bean, 说白了也就是写一个类。 告诉spring,把这个类的对象存起来。 编写 User 类, 有 sayHi 方法。 告诉 spring ,把这个类的对象存起来。 在配置文件中可以通过 bean 标签来告诉 spring 把对象存起来。

    2024年02月15日
    浏览(42)
  • Spring - 更简单的获取 Bean 对象

    目录 二、获取 Bean 对象(对象装配或者对象注入) 1. 属性注入 1.1 属性注入的优点和缺点: 2. Setter注入  2.1 Setter注入的优点和缺点 3. 构造方法注入(spring 官方推荐的对象注入方式) 3.1 构造方法的优点和缺点 4. @Autowired 注解 和 @Resource 注解的区别 4.1 @Autowired 和 @Source 的区

    2024年02月16日
    浏览(36)
  • Spring工具类(获取bean,发布事件)

    spring-beans-5.3.1.jar

    2024年02月11日
    浏览(35)
  • SpringBoot复习:(51)默认情况下DataSource是怎么创建出来的,是什么类型的?

    DataSource是通过DataSourceAutoConfiguration创建的,这个类代码如下: 可以看到DataSourceAutoConfiguration有个静态内部类PooledDataSourceConfiguration,在这个类上有个@Import注解,导入了DataSourceConfiguration.Hikari这个类,它的代码如下: 可以看到,如果没有在配置文件指定 spring.datasource.type这个属

    2024年02月12日
    浏览(46)
  • Spring——更快捷的存储 / 获取Bean对象

    本人是一个普通程序猿!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果你也对编程感兴趣的话,互关一下,以后互相学习,共同进步。这篇文章能够帮助到你的话,劳请大家点赞转发支持一下! 上篇文章中,向Spring容器中添加对象,还要去配置文件里手动添

    2024年02月15日
    浏览(43)
  • 一文带你了解Spring中存入Bean和获取Bean的方式

    上图中就是五大类注解对应的层,通过源码可以看到其他四个注解都基于@Conponent Spring既然是一个包含众多工具方法的IoC容器,它是一个控制反转的容器,所以就需要将Bean对象存入到容器中,需要用的时候从容器中获取Bean对象,下面我们来介绍下存入Bean对象。 配置了 Bean 的

    2024年02月16日
    浏览(41)
  • 如何获取springboot中所有的bean

    这段代码是一个使用 Spring Framework 的依赖注入(DI)功能的示例。它用 @Autowired 注解将一个类型为 MapString, Object 的变量声明为一个由 Spring 容器管理的 bean,并初始化为一个线程安全的 ConcurrentMap 实现对象。 从代码中可以看出以下几点: @Autowired :这是 Spring Framework 提供的一

    2024年02月09日
    浏览(50)
  • 【JavaEE】Spring中注解的方式去获取Bean对象

    【JavaEE】Spring的开发要点总结(3) 在前面的代码里,我们获取Bean对象也比较麻烦: 本文章就是为了更方便地去获取Bean对象~ 对象装配 也叫 对象注入 那么有没有对应的注解去实现这个功能呢? Spring提供的三种实现方法: 属性注入 构造方法注入 Setter注入 而这种非明文获取

    2024年02月15日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包