将类添加至容器中的四种方法
在Spring中,有四种方法可以将现有的类的实例添加到容器中.在了解之前需要了解以下两种作用域.
Spring在创建对象的时候共有四种作用域可选.分别为常用的singleton
、prototype
.和在web应用开发中的request
和session
.
下面针对常用的singleton
、prototype
来了解bean的作用域(SCOPE)
Spring的作用域
1. Singleton 单例
Singleton为Spring对象的默认的创建方式,也就是说Spring在创建Bean的时候默认是单例的.
1 | /准备对象Person |
运行结果:
1 | 创建Bean实例! |
并且需要注意的时,在Spring创建Singleton对象的时候,是在容器创建后立即创建的.
2. prototype 原型
同样上述的代码,在@Bean下面增加@Scope("prototype")
后,会注意到结果的不同.运行时在进行结果的观察:
1 | 容器创建成功。。接下来创建对象! |
类型 | 是否单例 | 创建时间 | 是否销毁 |
---|---|---|---|
Singleton | 单例 | 默认在容器启动时创建 | 容器关闭后销毁 |
prototype | 多实例 | 在获取对象时创建 | 不会调用销毁方法 |
一、Configuration注解和Bean注解
代替了原来的Spring配置文件,在类上标注Configuration
注解说明这个类是Spring的配置类.
在方法上使用Bean
注解,则会将返回值作为实例添加到容器中,方法名称作为Bean的ID.
一般使用这种方法将第三方的包中的类加入到容器中,如Shiro的配置类.
1 | /* |
二、componentScan包扫描注解
在面对自己写的@Component
,@Service
,@Controller
,@Repository
则不需要使用第一个中的使用@Bean注解一个一个的添加到配置类中,只需要配置@ComponentSacn
就行了.它会自动扫描路径下的所有这些注解的类加入到容器中.
1 |
|
三、import注解
1. 直接导入@Configuration配置类
能够使用@Import(value=xxx.class)
其中value是数组,可以一次性导入多个配置类.批量的导入配置文件中的所有声明的bean.
1 | // 新的实体 |
导入了TestConfig
配置类和其中的person实例
2. 使用importSelector自定义导入
除了使用 @import
直接导入指定的类外,还可以导入 继承importSelector
接口的类,并且在实现类中进行自定义操作.
1 | public class MyImportSelector implements ImportSelector { |
3. 使用 importBeanDefinitionRegister
可以使用 importBeanDefinitionRegister
自定义注册bean,因为在接口中有BeanRegiest作为参数,通过参数调用Registe相关方法.
1 | public class MyimportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { |
后面的两种方法在SpringBoot源码中会经常看到,所以还是挺重要的.
四、使用FactoryBean注册bean
用于创建复杂的bean时,会用到FactoryBean.
如果继承 FactoryBean
接口实现,则这个就不能当作一个普通的bean使用了,他暴露出来的获取的对象是 getObject()
方法获取的工厂中的对象,而不是他自身.默认创建的时FactoryBean的对象实例,而不是工厂实例,如果想获取工厂的实例,在getBean的时候在对象ID前加上&
符号。
具体实例:
1 | public class MyFactoryBean implements FactoryBean<Dog> { |