乐趣区

关于spring:Spring注册Bean系列方法5ImportImportBeanDefinitionRegistrar

原文网址:​​Spring 注册 Bean 系列 – 办法 5:@Import+ImportBeanDefinitionRegistrar_IT 利刃出鞘的博客 -CSDN 博客​​

简介

本文介绍 Spring 注册 Bean 的办法:@Import+ImportBeanDefinitionRegistrar。

注册 Bean 的办法我写了一个系列,见:​​Spring 注册 Bean(提供 Bean) 系列 – 办法大全_IT 利刃出鞘的博客 -CSDN 博客​​

分享 Java 技术星球(自学精灵):​​https://learn.skyofit.com​​

办法概述

  1. 实现 ImportBeanDefinitionRegistrar 接口

<!—->

  1. 实现它的 registerBeanDefinitions 办法(返回须要导入的组件的全类名数组;)

<!—->

  1. 启动类应用 @Import 导入实现类

实例

ImportBeanDefinitionRegistrar 接口的实现类

package com.knife.registrar;

import com.knife.entity.MyBean;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    /**
     * AnnotationMetadata:以后类的注解信息
     * BeanDefinitionRegistry:BeanDefinition 注册类;*         把所有须要增加到容器中的 bean;调用
     *         BeanDefinitionRegistry.registerBeanDefinition 手工注册进来
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
                                        BeanDefinitionRegistry registry) {
 
        // 能够判断对象是否曾经注册到容器
        // boolean definition = registry.containsBeanDefinition("com.knife.example.entity.MyBean");
        
        // 指定 Bean 定义信息
        RootBeanDefinition beanDefinition = new RootBeanDefinition(MyBean.class);

        // 注册一个 Bean,指定 bean 名
        registry.registerBeanDefinition("myBean", beanDefinition);
    }
}

要注册的类(Bean)

package com.knife.entity;

public class MyBean {public String sayHello() {return "Hello World";}
}

导入配置类

法 1:启动类

package com.knife;

import com.knife.registrar.MyImportBeanDefinitionRegistrar;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Import;

@SpringBootApplication
@Import({MyImportBeanDefinitionRegistrar.class})
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);
    }

}

法 2:@Configuration 标记的类

其实,只有是注册到 Spring 容器中的类就能够,但个别用 @Configuration。

package com.knife.config;

import com.knife.registrar.MyImportBeanDefinitionRegistrar;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import({MyImportBeanDefinitionRegistrar.class})
public class MyBeanImportConfiguration {}

测试

package com.knife.controller;

import com.knife.entity.MyBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @Autowired
    private MyBean myBean;

    @GetMapping("/test")
    public String test() {return myBean.sayHello();
    }
}

后果

退出移动版