• springboot原理篇-bean管理


    springboot原理篇-bean管理(二)

    我们今天主要学习IOC容器中Bean的其他使用细节,主要学习以下三方面:

    1. 如何从IOC容器中手动的获取到bean对象
    2. bean的作用域配置
    3. 管理第三方的bean对象

    一、获取Bean

    了解即可,默认情况下,SpringBoot项目在启动的时候会自动的创建IOC容器(也称为Spring容器),并且在启动的过程当中会自动的将bean对象都创建好,存放在IOC容器当中。应用程序在运行时需要依赖什么bean对象,就直接进行依赖注入就可以了,即使用@Autowired

    1. 根据name获取bean

      Object getBean(String name)
      
    2. 根据类型获取bean

      <T> T getBean(Class<T> requiredType)
      
    3. 根据name获取bean(带类型转换

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

    使用示例:

    @SpringBootTest
    class SpringbootWebConfig2ApplicationTests {
    
        @Autowired
        private ApplicationContext applicationContext; //获取IOC容器对象
    
        //获取bean对象
        @Test
        public void testGetBean(){
            //根据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);
        }
    }
    

    在springboot中,有springboot自动创建了bean对象默认是单例模式,即共用一个bean对象,如果不行共用同一个bean对象,这就涉及到了bean对象的作用域问题

    二、bean的作用域

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

    在这里插入图片描述

    在实际开发中,绝大多数的bean是不需要配置scope属性的,@Lazy了解即可,没看出有什么作用,只不过是初始化迟了一些,但还是单例模式

    1、第三方Bean
    • 第三方bean的添加
    
    <dependency>
        <groupId>org.dom4jgroupId>
        <artifactId>dom4jartifactId>
        <version>2.1.3version>
    dependency>
    

    以前,如果我们想将一个类交给IOC容器管理,只需要在类上加上@Component以及它的这三个衍生注解(@Controller、@Service、@Repository),就可以来声明这个bean对象,但是第三方bean无法修改,只有只读权限,就只能另寻他法了。

    解决方案1:在启动类上添加@Bean标识的方法(不推荐,我们当尽量保持启动类的干净)

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

    解决方案2:在配置类中定义@Bean标识的方法

    • 如果需要定义第三方Bean时, 通常会单独定义一个配置类,记住,配置类后面springboot原理篇会考!!!
    @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();
        }
    }
    

    在方法上加上一个@Bean注解,Spring 容器在启动的时候,它会自动的调用这个方法,并将方法的返回值声明为Spring容器当中的Bean对象。如果第三方bean需要依赖其它bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。即这里的这里的SAXReader对象创建时通过依赖注入了DeptService

    测试类:

    @SpringBootTest
    class SpringbootWebConfig2ApplicationTests {
    
        @Autowired
        private SAXReader saxReader;
    
        //第三方bean的管理
        @Test
        public void testThirdBean() throws Exception {
            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);
        }
    
        //省略其他代码...
    }
    
    

    注意事项 :

    • 通过@Bean注解的name或value属性可以声明bean的名称,如果不指定,默认bean的名称就是方法名。
  • 相关阅读:
    gazebo中给机器人添加16线激光雷达跑LIO-SAM
    可视化学习:使用极坐标参数方程和SDF绘制有趣的图案
    碳纳米管包四氧化三铁Fe3O4纳米粒子|氧化石墨烯包覆Fe3O4空心球纳米复合材料(r-GO/Fe3O4)|齐岳
    Spring - IoC 容器之 Bean 的生命周期
    git使用杂记
    华纳云:linux服务器查看端口的办法
    C++的std::move及相关概念
    KMP算法
    《最新出炉》系列入门篇-Python+Playwright自动化测试-40-录制生成脚本
    Postman脚本炼金术:高级数据处理的秘籍
  • 原文地址:https://blog.csdn.net/weixin_73186358/article/details/139710727