SpringBean相关

Spring Bean 相关

BeanDefinition

概念

BeanDefinition 是Spring Framework 中定义Bean 的配置元信息接口,包含:

  • Bean的类名
  • Bean 行为配置元素,如作用域、自动绑定的模式,生命周期回调等
  • 其他Bean 引用,又可称作合作者(collaborators)或者依赖(dependencies)
  • 配置设置,比如Bean 属性(Properties)
BeanDefinition 创建方式
  • 通过BeanDefinitionBuilder
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(User.class);
  • 通过AbstractBeanDefinition 以及派生类
Spring Bean 注册
  • xml 配置元信息
  • Java 注解配置元信息
    @Bean
    @Component
    @Import
@Import(AnnotationBeanDefinitionDemoTest.Config.class)
public class AnnotationBeanDefinitionDemoTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        applicationContext.register(AnnotationBeanDefinitionDemoTest.class);
        applicationContext.refresh();
        System.out.println(applicationContext.getBeansOfType(User.class));
        System.out.println(applicationContext.getBeansOfType(Config.class));
        applicationContext.close();
    }


    // 2. 通过 @Component 方式
    @Component // 定义当前类作为 Spring Bean(组件)
    public static class Config {

        // 1. 通过 @Bean 方式定义

        /**
         * 通过 Java 注解的方式,定义了一个 Bean
         */
        @Bean(name = {"userTest"})
        public User user() {
            User user = new User();
            user.setId(1L);
            user.setName("userTest");
            return user;
        }
    }
}

  • Java API 配置元信息
    1.命名方式:

    BeanDefinitionRegistry#registerBeanDefinition(String,BeanDefinition)
    

    2.非命名方式:

    BeanDefinitionReaderUtils#registerWithGeneratedName(AbstractBeanDefinition,Be
    anDefinitionRegistry)
    
     /**
     * 通过命名方式注册Bean
     * @param registry
     * @param beanName
     */
    public static void registerUserBeanDefinition(BeanDefinitionRegistry registry, String beanName) {
        BeanDefinitionBuilder beanDefinitionBuilder = genericBeanDefinition(User.class);
        beanDefinitionBuilder
                .addPropertyValue("id", 2L)
                .addPropertyValue("name", "小马哥");
    
        // 判断如果 beanName 参数存在时
        if (StringUtils.hasText(beanName)) {
            // 注册 BeanDefinition
            registry.registerBeanDefinition(beanName, beanDefinitionBuilder.getBeanDefinition());
        } else {
            // 非命名 Bean 注册方法
            BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinitionBuilder.getBeanDefinition(), registry);
        }
    }
    
    /***
     * 通过非命名方式注册Bean
     * @param registry
     */
    public static void registerUserBeanDefinition(BeanDefinitionRegistry registry) {
        registerUserBeanDefinition(registry, null);
    }
    

    3.配置类方式:

    AnnotatedBeanDefinitionReader#register(Class...)
    
Spring Bean实例化
常规方式
  • 通过构造器(配置元信息:XML、Java 注解和Java API )
  • 通过静态工厂方法(配置元信息:XML 和Java API )
  • 通过Bean 工厂方法(配置元信息:XML和Java API )
  • 通过FactoryBean(配置元信息:XML、Java 注解和Java API )
特殊方式
  • 通过ServiceLoaderFactoryBean(配置元信息:XML、Java 注解和Java API )
  • 通过AutowireCapableBeanFactory#createBean(java.lang.Class, int, boolean)
  • 通过BeanDefinitionRegistry#registerBeanDefinition(String,BeanDefinition)
Spring Bean 初始化
  • @PostConstruct 标注方法
  • 实现InitializingBean 接口的afterPropertiesSet() 方法
  • 自定义初始化方法
    1.XML 配置:
    2.Java 注解:@Bean(initMethod=”init”)
    3.Java API:AbstractBeanDefinition#setInitMethodName(String)

初始化的顺序 : @PostConstruct -> afterPropertiesSet() 方法 -> initMethod()

初始化中 @lazy的作用

默认为true,
当设置 为false时候,非延迟初始化在 Spring 应用上下文启动完成后,被初始化。

Bean 销毁
  • @PreDestroy 标注方法
  • 实现DisposableBean 接口的destroy() 方法
  • 自定义销毁方法
    1.XML 配置:
    2.Java 注解:@Bean(destroy=”destroy”)
    3.Java API:AbstractBeanDefinition#setDestroyMethodName(String)
    销毁的顺序: @PreDestroy -> DisposableBean 的destroy() 方法 -> 自定义的方法 destroyMethod()

你可能感兴趣的:(SpringBean相关)