原文网址: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;@RestControllerpublic class HelloController {    @Autowired    private MyBean myBean;    @GetMapping("/test")    public String test() {        return myBean.sayHello();    }}

后果