Spring注册Bean系列--方法5:@Import+ImportBeanDefinitionRegistrar
原文网址:Spring注册Bean系列--方法5:@Import+ImportBeanDefinitionRegistrar_IT利刃出鞘的博客-CSDN博客
简介
本文介绍Spring注册Bean的方法:@Import+ImportBeanDefinitionRegistrar。
注册Bean的方法我写了一个系列,见:Spring注册Bean(提供Bean)系列--方法大全_IT利刃出鞘的博客-CSDN博客
方法概述
- 实现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();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix