您现在的位置是:首页 >学无止境 >Spring中把一个bean对象交给Spring容器管理的三种方式网站首页学无止境
Spring中把一个bean对象交给Spring容器管理的三种方式
一、@ComponentScan + @Component
使用@Component,把bean对象依赖交给Spring容器
@Componet中文译为组件,放在类名上面,然后@ComponentScan放置在我们的配置类上,然后可以指定一个路径,进行扫描带有@Componet注解的bean,然后加至容器中。这种方式也较为常用,spring扫描包路径就是使用这种方式,这样可以一下子扫描很多个bean到容器
注意,该注解不能使用,则说明未添加依赖,需要去该项目pom.xml文件内引入依赖,若该项目只是作为一个存放工具类的子模块项目,没有业务代码编写,则在引入的依赖下加上该配置<scope>provided</scope>表示该依赖只在编译阶段有效,否则不要加,切记!!!
二、
1、@Bean,在项目主启动类里面加上一个方法,方法里面是new一个该要注入的bean对象并返回
2、如果不想在启动类上,而在其他任意类上接收,则需要在该接收类上额外添加一个注解@Configuration。
三、@Import(对象.class)
同上,该注解可以直接在主启动类上使用,也可以在任意其他类上使用,在其他类上使用时也需要加上@Configuration
四、使用FactoryBean接口
FactoryBean接口和BeanFactory不一样,BeanFactory顾名思义 bean工厂,它是IOC容器的顶级接口。
下述代码通过@Configuration + @Bean的方式将 PersonFactoryBean 加入到容器中,注意,我没有向容器中注入 Person, 而是直接注入的 PersonFactoryBean 然后从容器中拿Person这个类型的bean,成功运行。
五、实现BeanDefinitionRegistryPostProcessor进行后置处理。
这种方式也是利用到了 BeanDefinitionRegistry,在Spring容器启动的时候会执行 BeanDefinitionRegistryPostProcessor 的 postProcessBeanDefinitionRegistry 方法,大概意思就是等beanDefinition加载完毕之后,对beanDefinition进行后置处理,可以在此进行调整IOC容器中的beanDefinition,从而干扰到后面进行初始化bean。
下述代码中我们手动向beanDefinitionRegistry中注册了person的BeanDefinition,最终成功将person加入到applicationContext中
总结:1、三种方式的使用区别:
@Component:适合在本项目内或者各子项目之间使用,允许去更改要管理的对象,去添加该注解。@Import和@Bean适合引入第三方得资源,我们无法去修改其本来的对象。同时,一般@Import多用与配置资源得对象,@Bean用与普通对象
2、@Bean和@Import在主启动类上跟普通类上的区别:
因为主启动类@SpringBootApplication里包含了@SpringBootConfiguration,@SpringBootConfiguration类又包含了@Configuration配置类,所以主启动类上不需要再添加,该类作用就是读取@Bean标记的类,把他交给spring容器,有兴趣自己去点点,看下他们几个的关系





U8W/U8W-Mini使用与常见问题解决
QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结