1 Bean注册

应用启动实质是调用Spring容器启动方法扫描配置加载bean到Spring容器中、同时启动内置的Web容器的过程,具体分析如下:

@SpringBootApplication注解在主类上,用于注入对象到ioc容器中,方便程序中提取对象使用。如下所示:

@SpringBootApplication
public class TomcatdebugApplication {
public static void main(String[] args) {
SpringApplication.run(TomcatdebugApplication.class, args);
}
}

该注解包括@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三个注解。

(1)@ComponentScan

Spring有四大注解:@Respository、@Service、@Component、@Controller用来定义bean,该注解就是用来自动扫描这些注解标识的类,最终生成ioc容器里的bean,以提供一个Spring的上下文环境。默认情况下,它扫描的范围是run方法中的Class对象对应的包路径下的所有文件,所以最好将该启动类放到根包路径下。

需要说明的是,这四大注解是没什么本质区别的,当不指定bean时,默认以类名首字母小写作为Ioc管理的该类的对象,当指定bean时,会以指定bean的名字注册实例。对象注入方式完全一致,之所以区分为四层只是为了更好的区分各自的功能。

(2)@EnableAutoConfiguration

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({EnableAutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; Class<?>[] exclude() default {}; String[] excludeName() default {};
}

其中最关键的要属@Import({EnableAutoConfigurationImportSelector.class}),借助EnableAutoConfigurationImportSelector,@EnableAutoConfiguration可帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的Ioc容器中。

(3)@SpringBootConfiguration注解

来源:该注解继承自@Configuration,二者功能也一致,提供一种新的bean注入方式。

作用:标注当前类是配置类,将当前类声明的一个或多个@Bean注解标记方法的实例注册到Spring容器中,并且实例名就是方法名。

 @SpringBootConfiguration
public class Config {
@Bean //注入后的实例名为createMap
public Map createMap(){
Map map = new HashMap();
map.put("username","gxz");
map.put("age",27);
return map;
}
}

2 Bean使用

2.1 单例或工厂

注入对象时,用@Scope注解可声明bean的生成方式,其中,Scope常用值如下:

Scope

Description

作用范围

singleton

默认值,Ioc容器只存在单例

所有Spring应用

prototype

每当从Ioc容器中取出一个bean,则创建一个新的bean

所有Spring应用

@Component
@Scope("prototype")
public class ScopeBean {
...
}

2.2 bean提取

对象的注入有多种方式,但提取时都是使用@Autowired和@Resource提取,并且默认bean是单例。因此关于这两个注解的解析很重要。

2.1.2 @Resource

@Resource是Java自带注解,该注解有两个属性比较重要,包括name和type,SpringBoot将该注解的name属性解析成bean的名字,type属性则解析成bean的类型。@Resource的装配顺序:

(1)如果同时指定了name属性和type属性,那么Spring将从容器中找唯一匹配的bean进行装配,找不到则抛异常。

(2)如果指定了name属性值,则从容器中查找名称匹配的bean进行装配,找不到或者找到多个都会抛异常。

(3)如果指定了type属性值,则从容器中查找类型匹配的唯一的bean进行装配,找不到或者找到多个都会抛出异常。

(4)如果都不指定,则会自动按照byName方式进行装配,如果没有装配,则回退到一个原始类型进行匹配,如果匹配则自动装配。

2.1.3 @Autowired

@Autowired是spring的注解,该注解只根据type来进行注入,不会去匹配name,如果涉及到type无法辨别注入对象,那就需要Qualifier注解或Primary注解指定bean名一起注释。并且默认情况下,它要求依赖对象必须存在,如果允许null值,可以设置它required为false。

3 Bean构造与析构

由于前面已经解析了bean注册、销毁时机,因此这里解析的Bean的生命周期过程只包含bean构造和析构过程:

【初始化顺序】:构造函数 --> @PostConstruct --> afterProppertiesSet(重载) --> 自定义initMethod方法 -->   [bean初始化完成] ---> postProcessBeforeInitialization(重载)  --> postProcessAfterInitialization(重载) --> [注册到Ioc容]

【销毁顺序】: @PreDestory --> destory(重载) --> 自定义destoryMethod --> [bean销毁]

【详解相关接口】:

afterPropertiesSet:初始化bean的时候执行,可以针对某个具体的bean进行配置

postProcessBeforeInitalization:该方法会在Bean构造完执行,该方法接收两个参数:

(1)Object bean: 刚刚由Spring实例化出来的bean

(2)String beanName: 在Spring配置的元数据bean的名称

该方法的返回值会被Spring容器作为处理后的Bean注册到Ioc容器中并覆盖原来的Bean。其中,测试Demo如下所示:

// 功能类
public class Car implements InitializingBean, DisposableBean, BeanPostProcessor { // 构造(顺序定义) public Car() {
System.out.println("Car 创建");
} @PostConstruct
public void postConstructTest() {
System.out.println(" .. @PostConstruct .. ");
} @Override
public void afterPropertiesSet() {
System.out.println(" .. InitializingBean .. ");
} public void initTest() {
System.out.println(" .. init-method .. ");
} @Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException { System.out.println(" .. postProcessBeforeInitialization .. "); return bean;
} @Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException { System.out.println(" .. postProcessAfterInitialization .. "); return bean;
} // 销毁(顺序定义) @PreDestroy
public void preDestroyTest() {
System.out.println(" .. @PreDestroy .. ");
} @Override
public void destroy() {
System.out.println(" .. DisposableBean .. ");
} public void detoryTest() {
System.out.println(" .. destory-method .. ");
} } //注册
@Configuration
public class MainConfigOfLifeCycle { @Bean(initMethod="initTest", destroyMethod="detoryTest")
public Car car() {
return new Car();
}
} // 测试
public class IOCTest_LifeCycle { @Test
public void test01() {
// 1. 创建IOC容器
AnnotationConfigApplicationContext applicationContext =
new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
System.out.println("容器创建完成"); // 关闭容器
applicationContext.close();
}
}

要控制bean对象的构造和销毁过程,可结合上述的分析进行控制。

(三)Bean生命周期的更多相关文章

  1. 金三银四,还在为spring源码发愁吗?bean生命周期,看了这篇就够了

    第一,这绝对是一个面试高频题. 比第一还重要的第二,这绝对是一个让人爱恨交加的面试题.为什么这么说?我觉得可以从三个方面来说: 先说会不会.看过源码的人,这个不难:没看过源码的人,无论是学.硬背.还是 ...

  2. Spring Bean 生命周期2

    在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Sin ...

  3. 【不懂】spring bean生命周期

    完整的生命周期(牢记): 1.spring容器准备 2.实例化bean 3.注入依赖关系 4.初始化bean 5.使用bean 6.销毁bean Bean的完整生命週期可以認為是從容器建立初始化Bea ...

  4. spring(二、bean生命周期、用到的设计模式、常用注解)

    spring(二.bean生命周期.用到的设计模式.常用注解) Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的. ...

  5. Spring-IOC bean 生命周期之 Lifecycle 钩子

    Lifecycle callbacks Initialization callbacks.Destruction callbacks 要与容器的bean生命周期管理交互,即容器在启动后和容器在销毁前对 ...

  6. Spring中Bean生命周期

    Spring中的bean生命周期是一个重要的点,只有理解Bean的生命周期,在开发中会对你理解代码是非常有用的.对于Bean的周期,个人认为可以分为四个阶段.第一阶段:Bean的实例化,在该阶段主要是 ...

  7. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(6):Spring IOC容器学习(概念、作用、Bean生命周期)

    一.IOC控制反转概念 控制反转(IOC)是一种通过描述(在Java中可以是XML或者是注解)并通过第三方去生产或获取特定对象的方式. 主动创建模式,责任在于开发者,而在被动模式下,责任归于Ioc容器 ...

  8. Spring Bean 生命周期之destroy——终极信仰

    上一篇文章 Spring Bean 生命周期之我从哪里来 说明了我是谁? 和 我从哪里来? 的两大哲学问题,今天我们要讨论一下终极哲学我要到哪里去? 初始化 Spring Bean 有三种方式: @P ...

  9. 一步步剖析spring bean生命周期

    关于spring bean的生命周期,是深入学习spring的基础,也是难点,本篇文章将采用代码+图文结论的方式来阐述spring bean的生命周期,方便大家学习交流.  一  项目结构及源码 1. ...

随机推荐

  1. 自己实现一个 DFA 串模式识别器

    自己实现一个 DFA 串模式识别器 前言 这是我编译原理课程的实验.希望读完这篇文章的人即便不知道 NFA,DFA 和正规表达式是什么,也能够对它们有一个简单的理解,并能自己去实现一个能够识别特定模式 ...

  2. 开源运动的"圣经"——《大教堂与集市》读书笔记

    作者:Eric S. Raymond 一.黑客圈简史 1.早期 (1)MIT 与 ITS "黑客"一词大约就起源于MIT的计算机文化. 从PDP-1时代开始,黑客文化的命运就和DE ...

  3. AJ学IOS(20)UI之UIPickerView_点菜系统

    AJ分享,必须精品 先看效果图 ## UIPickerView控件 UIPickerView用处: 用来展示很多行(row) 很多列(component )的数据,多用于电子商务的点菜,城市选择等等. ...

  4. 如何用 Python 绘制玫瑰图等常见疫情图

    新冠疫情已经持续好几个月了,目前,我国疫情已经基本控制住了,而欧美国家正处于爆发期,我们会看到很多网站都提供了多种疫情统计图,今天我们使用 Python 的 pyecharts 框架来绘制一些比较常见 ...

  5. 【three.js第二课】页面自适应

    1.在[three.js第一课]的基础上加入以下代码,改变窗口大小时,页面内容会自适应 //加入事件监听器,窗口自适应 window.addEventListener('resize', functi ...

  6. 杭电 逃离迷宫 BFS

    给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位 ...

  7. sysbench安装和使用

    sysbench是一款测试工具 主要包括以下几种方式的测试: 1.cpu性能 2.磁盘io性能 3.调度程式性能 4.内存分配及传输速度 5.POSIX线程性能 6.数据库性能(OLTP基准测试)现在 ...

  8. pytorch 矩阵数据增加维度unsqueeze和降低维度squeeze

    增加一个维度 out.unsqueeze(-1) 降低一个维度 out.squeeze(dim=1)

  9. php中垃圾回收机制

    php中垃圾回收机制 我们可能在开发中经常会听到gc,是的gc就是垃圾回收容器,全称Garbage Collection. 此篇文章中“垃圾”的概念:如果一个变量容器能被减少到0,说明他就已经没有被引 ...

  10. memcache---mongodb---redis比较

    Memcached的优点: Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key.value的字节大小以及服务器硬件性能,日常环境中QPS高峰大约在4-6w左右). ...