bean的管理-bean的获取

获取bean

  • 默认情况下,在Spring项目启动时,会把bean都创建好(但是还会受到作用域及延迟初始化的影响)放在IOC容器中,如果想主动获取这些bean,可以通过如下方式
    • 根据name获取bean
      • Object getBean(String name)
    • 根据类型获取bean
      •  T getBean(Class requiredType)
    • 根据name以及类型获取bean
      •  T getBean(String name,Class requiredType)

具体实现代码及运行结果如下

具体代码

  •  
        @Autowired
        ApplicationContext applicationContext;  // 自动注入IOC容器对象
    
        @Test
        public void GetBean() {
            // 根据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项目中设置bean对象

在Spring Boot中,可以使用注解来定义和配置Bean。常用的注解包括:

  • @Component:用于标识一个普通的Bean类。
  • @Service:用于标识一个服务类,通常用于业务逻辑的处理。
  • @Repository:用于标识一个数据访问类,通常用于数据库操作。
  • @Controller:用于标识一个控制器类,通常用于处理HTTP请求。

除了以上常用的注解外,还有一些特殊用途的注解,如:

  • @Configuration:用于标识一个配置类,通常用于配置Bean的创建和依赖关系。
  • @Autowired:用于自动注入依赖的Bean。
  • @Value:用于注入配置属性的值。

通过使用这些注解,可以将普通的Java类转化为Spring Bean,使其由Spring容器进行管理。Spring容器会负责创建、初始化和销毁这些Bean,并处理它们之间的依赖关系。在应用程序中,可以通过注入Bean来使用其提供的功能和服务。

bean作用域

  • Spring支持5种作用域,后三种在web环境才生效
  • 作用域 说明
    singleton 容器内同名称的bean只有一个实例(单例)默认
    prototype 每次使用该bean时会创建新的实例(非单例)
    request 每个全球范围内会创建新的实例(web环境下,了解)
    session 每个会话范围内会创建新的实例(web环境下,了解)
    application 每个应用范围内会创建新的实例(web环境下,了解)
  • 可以通过@Scope注解来进行配置作用域

注意事项

  • 默认singleton的bean,在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时,才会创建该bean对象)。

  • prototype的bean,每一次使用该bean时都会创建一个新的实例。

  • 实际开发过程中,绝大部分的bean是单例的,也就是说绝大部分bean不需要配置scope属性。

具体代码及效果

  • scope为默认值singleton
    •     @Test
          public void GetBean() {
              // 根据bean的名称获取
              for (int i = 1; i < 5; i++) {
                  DeptController bean1 = (DeptController) applicationContext.getBean("deptController");
                  System.out.println(bean1);
              }
      }
  • 运行结果(都是同一个bean对象)

    • bean的管理-bean的获取_第1张图片

  • scope为prototype
    • bean的管理-bean的获取_第2张图片 
  • 运行结果(每一次都会创建一个新的实例对象)
    • bean的管理-bean的获取_第3张图片

第三方bean

  • 对于第三方的类,我们无法在其代码中加入注解来将其添加到IOC容器中去。
  • 如果要管理的bean来自第三方(不是自定义的),是无法使用@Component及其衍生注解来说明bean的,就需要用到@Bean注解,通过@Bean注解的name/value属性指定bean名称,如果未指定,默认是方法名

具体实现

  • 在SpringBoot项目的启动类中加上一个方法,在该方法中创建第三方类的对象并且返回该对象,并且在该方法上加入@Bean注解(但是这种方式不建议
    • public class TliasApplication {
          public static void main(String[] args) {
              SpringApplication.run(TliasApplication.class, args);
          }
      
          @Bean  // todo 将发放返回值交给IOC容器管理,称为IOC容器的bean对象
          public SAXReader saxReader() {
              return new SAXReader();
          }
      }
      
  • 若要管理第三方的bean对象,建议对这些bean进行集中分类配置,可以通过@Configuration注解声明一个配置类。当应用程序启动时,Spring Boot会自动扫描并加载所有带有特定注解的配置类
    • 具体实现如下
    • @Configuration  
      public class BeanConfig {
          @Bean  // todo 将发放返回值交给IOC容器管理,称为IOC容器的bean对象
          public SAXReader saxReader() {
              return new SAXReader();
          }
      }
  • 如果在配置第三方类时要进行依赖注入的话,就可以在创建的方法中设置要注入的对象类型及其名称,然后Spring容器会继续自动装配

    • 具体代码

      • @Configuration
        public class BeanConfig {
            @Bean  // todo 将发放返回值交给IOC容器管理,称为IOC容器的bean对象
            public SAXReader saxReader(DeptService deptService) {
                return new SAXReader();
            }
        }

注意事项

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

你可能感兴趣的:(Java,Web学习跟踪笔记,java,前端,数据库)