Spring注册Bean系列--方法5:@Import+ImportBeanDefinitionRegistrar

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

简介

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

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

方法概述

  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();
    }
}
posted @ 2024-02-18 09:50  IT利刃出鞘  阅读(33)  评论(0编辑  收藏  举报