您现在的位置是:首页 >学无止境 >Spring中把一个bean对象交给Spring容器管理的三种方式网站首页学无止境

Spring中把一个bean对象交给Spring容器管理的三种方式

忧郁的叮当猫 2024-06-14 17:17:43
简介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容器启动的时候会执行 BeanDefinitionRegistryPostProcessorpostProcessBeanDefinitionRegistry 方法,大概意思就是等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容器,有兴趣自己去点点,看下他们几个的关系

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。