原文网址:Spring 注册 Bean 系列 – 办法 5:@Import+ImportBeanDefinitionRegistrar_IT 利刃出鞘的博客 -CSDN 博客
简介
本文介绍 Spring 注册 Bean 的办法:@Import+ImportBeanDefinitionRegistrar。
注册 Bean 的办法我写了一个系列,见:Spring 注册 Bean(提供 Bean) 系列 – 办法大全_IT 利刃出鞘的博客 -CSDN 博客
分享 Java 技术星球(自学精灵):https://learn.skyofit.com
办法概述
- 实现 ImportBeanDefinitionRegistrar 接口
<!—->
- 实现它的 registerBeanDefinitions 办法(返回须要导入的组件的全类名数组;)
<!—->
- 启动类应用 @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();
}
}
后果