当前位置: 首页 > news >正文

SpringBoot-将Bean放入容器的五种方式

1、@Configuration + @Bean

@Configuration
public class MyConfiguration {@Beanpublic Person person() {Person person = new Person();person.setName("spring");return person;}
}

2、@Componet + @ComponentScan

@Component
public class Person {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +'}';}
}@ComponentScan(basePackages = "com.springboot.initbean.*")
public class Demo1 {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo1.class);Person bean = applicationContext.getBean(Person.class);System.out.println(bean);}
}

3、@Import注解导入

@import注解源码

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {/**   * 用于导入一个class文件     * {@link Configuration @Configuration}, {@link ImportSelector},     * {@link ImportBeanDefinitionRegistrar}, or regular component classes to import.     */Class<?>[] value();}

3.1、直接使用@import注解导入类

然后自动的就被放置在IOC容器中了。

public class Person {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +'}';}
}
/*** 直接使用@Import导入person类,然后尝试从applicationContext中取,成功拿到**/
@Import(Person.class)
public class Demo1 {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo1.class);Person bean = applicationContext.getBean(Person.class);System.out.println(bean);}
}

3.2 @Import + ImportSelector

@Import(MyImportSelector.class)
public class Demo1 { public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo1.class);Person bean = applicationContext.getBean(Person.class);System.out.println(bean);}
}class MyImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {return new String[]{"com.springboot.pojo.Person"};}
}

3.3 @Import + ImportBeanDefinitionRegistrar

bean的定义(bean的元数据),也是需要放在IOC容器中进行管理的,先有bean的元数据,

applicationContext再根据bean的元数据去创建Bean。

 

@Import(MyImportBeanDefinitionRegistrar.class)
public class Demo1 {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo1.class);Person bean = applicationContext.getBean(Person.class);System.out.println(bean);}
}class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {// 构建一个beanDefinition, 关于beanDefinition我后续会介绍,可以简单理解为bean的定义.AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Person.class).getBeanDefinition();// 将beanDefinition注册到Ioc容器中.registry.registerBeanDefinition("person", beanDefinition);}
}

3.4 @Import + DeferredImportSelector

DeferredImportSelector 它是 ImportSelector 的子接口,所以实现的方法和第二种无异。

只是Spring的处理方式不同,它和Spring Boot中的自动导入配置文件 延迟导入有关

@Import(MyDeferredImportSelector.class)
public class Demo1 {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo1.class);Person bean = applicationContext.getBean(Person.class);System.out.println(bean);}
}
class MyDeferredImportSelector implements DeferredImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {// 也是直接将Person的全限定名放进去return new String[]{Person.class.getName()};}
}

4、使用FactoryBean接口

FactoryBean, 后缀为bean,那么它其实就是一个bean,

BeanFactory,顾名思义 bean工厂,它是IOC容器的顶级接口

@Configuration
public class Demo1 {@Beanpublic PersonFactoryBean personFactoryBean() {return new PersonFactoryBean();}public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo1.class);Person bean = applicationContext.getBean(Person.class);System.out.println(bean);}
}class PersonFactoryBean implements FactoryBean<Person> {/**     *  直接new出来Person进行返回.     */@Overridepublic Person getObject() throws Exception {return new Person();}/**     *  指定返回bean的类型.     */@Overridepublic Class<?> getObjectType() {return Person.class;}
}

5、使用 BeanDefinitionRegistryPostProcessor

等beanDefinition加载完毕之后,对beanDefinition进行后置处理,

可以在此进行调整IOC容器中的beanDefinition,从而干扰到后面进行初始化bean。

public class Demo1 {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();MyBeanDefinitionRegistryPostProcessor beanDefinitionRegistryPostProcessor = new MyBeanDefinitionRegistryPostProcessor();applicationContext.addBeanFactoryPostProcessor(beanDefinitionRegistryPostProcessor);applicationContext.refresh();Person bean = applicationContext.getBean(Person.class);System.out.println(bean);}
}class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Person.class).getBeanDefinition();registry.registerBeanDefinition("person", beanDefinition);}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {}
}

相关文章:

  • Graph + LLM图数据库技术如何助力行业大语言模型应用落地
  • 这一年大概是我长这么大最难熬的一年, 也是让我成长最多的一年。
  • 基于springboot+vue的B2B平台的医疗病历交互系统(前后端分离)
  • dubbo源码中设计模式——注册中心中工厂模式的应用
  • Vista 2.08: The storm chaser
  • Linux下彻底卸载MySQL数据库
  • 2.21 Qt day2 菜单栏/工具栏/状态栏/浮动窗口、UI界面、信号与槽
  • [设计模式Java实现附plantuml源码~行为型]协调多个对象之间的交互——中介者模式
  • 标题:从预编译到链接:探索C/C++程序的翻译环境全貌
  • [C#]winform使用引导APSF和梯度自适应卷积增强夜间雾图像的可见性算法实现夜间雾霾图像的可见度增强
  • PotPlayer+Alist挂载并播放网盘视频
  • mplfinance 使用make_addplot做复杂股票走势图
  • dell r740服务器黄灯闪烁维修现场解决
  • 167基于matlab的根据《液体动静压轴承》编写的有回油槽径向静压轴承的程序
  • vant-search确定按钮变成了“换行”文字
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 【comparator, comparable】小总结
  • Angular4 模板式表单用法以及验证
  • Asm.js的简单介绍
  • CAP理论的例子讲解
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Linux中的硬链接与软链接
  • Mybatis初体验
  • spring security oauth2 password授权模式
  • 构建二叉树进行数值数组的去重及优化
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 使用权重正则化较少模型过拟合
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 赢得Docker挑战最佳实践
  • Java性能优化之JVM GC(垃圾回收机制)
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • # 透过事物看本质的能力怎么培养?
  • #FPGA(基础知识)
  • (1)(1.13) SiK无线电高级配置(六)
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (2)Java 简介
  • (6)设计一个TimeMap
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (ros//EnvironmentVariables)ros环境变量
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)springboot教学评价 毕业设计 641310
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转载)虚函数剖析
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .cfg\.dat\.mak(持续补充)
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .net流程开发平台的一些难点(1)
  • .NET面试题(二)
  • @Documented注解的作用
  • @PreAuthorize注解