首页 > 其他分享 >springBoot容器中注册组件

springBoot容器中注册组件

时间:2024-06-05 20:57:58浏览次数:26  
标签:容器 springBoot 对象 public Bean 组件 new class

1. @Bean

用于配置对象让 spring 来创建的。

默认情况下它调用的是类中的无参构造函数。如果没有无参构造函数则不能创建功。

1.1. 属性

  1. id:给对象在容器中提供一个唯一标识。用于获取对象。
  2. class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。
  3. init-method:指定类中的初始化方法名称。
  4. destroy-method:指定类中销毁方法名称。

1.2. 生命周期

scope:指定对象的作用范围。

1.2.1. singleton 默认值

  1. IoC容器中仅存在一个Bean实例,Bean以单例方式存在,
  2. 一个应用只有一个对象的实例。它的作用范围就是整个引用
  3. 对象出生:当应用加载,创建容器时,对象就被创建了。
  4. 对象活着:只要容器在,对象一直活着。
  5. 对象死亡:当应用卸载,销毁容器时,对象就被销毁了

1.2.2. prototype

  1. 每次从容器中调用Bean时,都返回一个新的实例
  2. 即每次调用getBean()时相当于执行new XxxBean(),不会初始化,只用在使用的时候
  3. 对象出生:当使用对象时,创建新的对象实例。
  4. 对象活着:只要对象在使用中,就一直活着。
  5. 对象死亡:当对象长时间不用时,被java的垃圾回收器回收了

1.2.3. request

每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境

1.2.4. session

同一个HTTP Session 共享一个Bean,不同Session使用不同Bean,仅适用于WebApplicationContext环境

1.2.5. globalSession

一般用于Portlet应用环境,该作用域仅适用于WebApplicationContext 环境

1.3. init-method destroy-method

@Configuration
@ComponentScan("com.du")
public class BeanOfLifeCycle {
    @Bean(initMethod="init",destroyMethod="detory")
    public Car car(){
        return  new Car();
    }
}
@Component
public class Car {
   public Car(){
      System.out.println("car constructor...");
   }
   public void init(){
      System.out.println("car ... init...");
   }
   public void detory(){
      System.out.println("car ... detory...");
   }
}

2. @Component

Controller 一般用于表现层的注解。

Service 一般用于业务层的注解。

Repository 一般用于持久层的注解。

@Component类中的@Bean注解的方法,返回的是一个新的实例。

@Component注解并没有通过 cglib 来代理@Bean 方法的调用,因此像下面这样配置时,就是两个不同的country

@Component
public class MyBeanConfig {

    @Bean
    public Country country(){
        return new Country();
    }

    @Bean
    public UserInfo userInfo(){
        return new UserInfo(country());
    }

}

有些特殊情况下,我们不希望MyBeanConfig被代理(代理后会变成WebMvcConfig$$EnhancerBySpringCGLIB$$8bef3235293)时,就得用@Component,这种情况下,上面的写法就需要改成下面这样:

@Component
public class MyBeanConfig {

    @Autowired
    private Country country;

    @Bean
    public Country country(){
        return new Country();
    }

    @Bean
    public UserInfo userInfo(){
        return new UserInfo(country);
    }
}

3. @Import

用于导入其他配置类,在引入其他配置类时,可以不用再写@Configuration 注解

3.1. 实现 ImportSelector :返回需要导入的组件的全类名数组

public class MyImportSelect implements ImportSelector {

    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.du.domain.Blue","com.du.domain.Yellow"};
    }
}

3.2. 实现 ImportBeanDefinitionRegistrar:手动注册bean到容器中

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
  @Override
  public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
                                      BeanDefinitionRegistry registry) {

    boolean definition = registry.containsBeanDefinition("com.du.domain.Yellow");
    boolean definition2 = registry.containsBeanDefinition("com.du.domain.Blue");
    if(definition && definition2){
      //指定Bean定义信息;(Bean的类型,Bean。。。)
      RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);
      //注册一个Bean,指定bean名
      registry.registerBeanDefinition("rainBow", beanDefinition);
    }
  }
}

3.3. @Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名

利用 car的无参构造器

@Configuration
@Import({Car.class,MyImportSelect.class,MyImportBeanDefinitionRegistrar.class})
public class ImportShow {
}

3.4. 测试

AnnotationConfigApplicationContext applicationContext =
        new AnnotationConfigApplicationContext(ImportShow.class);
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
    System.out.println(beanDefinitionName);
}

标签:容器,springBoot,对象,public,Bean,组件,new,class
From: https://blog.csdn.net/qq_26594041/article/details/139481914

相关文章

  • 请自行构建一个Mysql容器并将Python开发数据保存到此数据库 用户名数据库名不限制
    下面是一个完整的示例,展示如何构建一个MySQL容器,并使用Python脚本将数据保存到数据库中。启动MySQLDocker容器首先,确保Docker已经安装。然后打开终端或命令提示符,运行以下命令来拉取MySQLDocker镜像并启动容器:dockerpullmysql:latestdockerrun--namemy-mys......
  • Mybatis + SpringBoot 构建项目流程总结
    软件版本SpringBoot:3.0.2 引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot......
  • 构建HTTP Server容器Docker构建一个简单的HTTP Server。
    构建HTTPServer容器Docker构建一个简单的HTTPServer。HTTPServer在访问根路径/时返回"Hello,World!"。提供完整的Dockerfile和启动命令。步骤1:创建HTTPServer的Python脚本首先,创建一个目录来存放HTTPServer文件:mkdirhttp_servercdhttp_server在这个目录中,创建一......
  • 服务器部署-docker-容器版本
    后端部署准备docker环境,拉取所需镜像正式安装docker环境:1)较旧的Docker版本称为docker或docker-engine。如果已安装这些程序,请卸载它们以及相关的依赖项。[root@localhost~]#sudoyumremovedocker\docker-clientdocker-client-latestdocker-commondocker-la......
  • SpringBoot+Nginx大文件传输
    Nginx配置 #公众端的附件上传location/api/visitor/upload{#Passalteredrequestbodytothislocationupload_pass/api/outerPortal/uploadAndSave;#Storefilestothisdirectory#Thedirectory......
  • 给容器右上角打标,带图标
    假设容器的active类名为is-active,那么可以通过伪元素的方式来给容器打标。效果如下: 样式如下:.is-active{ position:relative;}.is-active::after{content:"";position:absolute;right:0;top:0;border-right:20pxsolid#0A53C8;border-top:20pxsolid#0A......
  • Java1.8语言+ springboot +mysql + Thymeleaf 全套家政上门服务平台app小程序源码
    Java1.8语言+springboot+mysql +Thymeleaf 全套家政上门服务平台app小程序源码家政系统是一套可以提供上门家政、上门维修、上门洗车、上门搬家等服务为一体的家政平台解决方案。它能够与微信对接、拥有用户端小程序,并提供师傅端app,可以帮助创业者在不需要相关技术人员及......
  • 深入理解flutter的代码结构:组件
    import'package:flutter/material.dart';voidmain(){runApp(constMyApp());}classMyAppextendsStatelessWidget{constMyApp({super.key});@overrideWidgetbuild(BuildContextcontext){returnMaterialApp(title:'顶部......
  • 如何从零开始创建一个完整的SpringBoot项目,逐步构建自己的技术栈。
     有的小伙伴虽然开发很多年,但是有很多连自己都没有动手去创建一个SpringBoot。原因各不相同,有的是开发项目比较忙,没有时间,刚去公司的时候项目的框架就是现成的,就一直用。还有就是自己没有闲下学习的习惯。我其实就是,最起码工作1-2的时候还没有自己创建过,当时自我学习的时间......
  • 容器启动playwright报错TargetClosedError
    运行环境docker:Dockerversion24.0.5,build24.0.5-0ubuntu1~22.04.1ubuntu:22.04playwrightimage:itisfoundation/osparc-playwright-e2e:2024-05mavenimage:maven:3.8.5-openjdk-17-slim报错信息Causedby:com.microsoft.playwright.impl.TargetClosedError:Er......