背景
ioc是spring的基础,即控制反转。springboot基于注解使用ioc.
ioc
spring称所有被管理的对象为bean,
spring ioc主要通过描述的方式完成3类bean的管理工作:
基本功能 | 说明 |
---|---|
发布对象 | 包扫描业务bean,javaConfig或者xml的方式配置第三方bean |
获取对象 | beanfactory或者ApplicationContext的子类获取bean |
依赖注入对象 | 通过关键字@Autowired,属性注入,构造函数注入,方法注入 |
**spring ioc的核心接口是beanfactory和ApplicationContext ; **
beanfactory | ApplicationContext |
---|---|
获取bean的方法 | 等同 |
判断是否是单例或者原型 | 等同 |
类型匹配 | 等同 |
获取bean的类型和别名 | 等同 |
-- | MessageResource消息国际化功能 |
-- | EnvironmentCapable环境可配置 |
-- | ApplicationEventPublisher应用事件发布 |
-- | ResourcePatternResolver资源模式解析 |
来个例子,发布和获取bean;
TODO
通过@ComponentSacn发布Bean
@ComponentScan源码阅读
主要方法 | 说明 |
---|---|
basePackages | 扫描的包路径 |
basePackageClasses | 扫描的javaConfig类 |
includeFilters | 包含的bean的过滤器 |
excludeFilters | 排除的bean的过滤器 |
lazyInit | 是否延迟初始化 |
javaConfig方式或者xml方式定义第三方Bean发布
javaConfig方式主要是增加@Configuration 和 @Bean注解来发布;
xml方式需要通过注解@ImportResource来引入
条件装配bean @Conditional(Condition实现类)
依赖注入
通过@Autowired来描述
通过@Primary和@Quelifier来消除歧义。
bean的生命周期
bean定义 -> bean初始化 ->bean生存期->bean销毁
bean定义:通过@ComponentScan扫描得到资源信息,从资源中解析出定义信息,然后把定义发布到spring容器中;
bean的初始化:创建bean,完成依赖注入,setBeanName,setbeanfactory,@PostConstruct标注的方法,postProcessorBeforeInitialzerion方法,setApplicationContext方法,afterPropertiesSet方法,postProcessorAfterInitialization方法;
bean生存期: 运行阶段直接使用
bean销毁: @PreDesctroy标注的方法,destory方法;
生命周期相关的扩展接口 | 说明 |
---|---|
BeanNameAware | 设置bean的名称 |
beanfactoryAware | 获取beanfactory |
ApplicationContextAware | 获取ApplicationContext |
InitializingBean | 初始化bean |
DisposableBean | 销毁bean |
BeanPostProcessor | 所有ben的公共增强 |
属性文件
引入依赖:
spring-boot-configuration-processor;
然后使用@Value(“${xxx}”)来引用即可;
或者通过@ConfigurationProperties(“xxx”)直接组装到自定义类中;
还可以使用SpringEL来处理属性配置:
@Value("#{T(System).currentTimeMillis()}")
Bean作用域
作用域 | 说明 |
---|---|
singleton | 单例,全局唯一 |
prototype | 原型,每次创建 |
session | 每个http会话创建一个 |
application | 同单例 |
request | 每次请求创建一个 |
Profile
指明不同环境下启用的bean,springboot不同的profile对应不同的application-profile.yaml文件;
原创不易,转载请注明出处。