您现在的位置是:首页 >学无止境 >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容器,有兴趣自己去点点,看下他们几个的关系