文章目录

  • IOC加载
  • Bean生命周期
    • Demo
  • Spring拓展点
    • XxxAware
    • Bean初始化前后:BeanPostProcessor
    • 所有BeanDefinition注册后:BeanFactoryPostProcessor
      • @PostConstruct失效
    • 所有Bean就绪后:ApplicationListener、CommandLineRunner
  • @Import
  • 找到多个Bean时不报错
  • @Autowared和@Resources
  • @Autowared自动装配过程
  • @Configuration
  • Spring注册Mybatis的Mapper为Bean
  • SpringMVC处理json
  • SSM中的父子容器
  • SpringBoot

IOC加载

IOC加载过程就是bean的创建过程

  • 通过@Bean <bean/> @Component 去定义一个bean (概念态)
  • 实例化ApplicationContext对象,读取Bean的定义信息@Bean <bean/> @Component
  • 创建Bean工厂
  • 调用bean工厂的后置处理器,可自定义修改bean定义,注册成BeanDefinition(定义态)

invokeBeanFactoryPostProcessors(beanFactory)

  • 判断beanDefiniton是否符合生产标准(是不是抽象的,单例,懒加载)
  • 通过反射实例化对象(纯净态)(循环依赖
  • 生命周期钩子函数
  • 创建完成,put到单例池子 ConcurrentHashMap<String,Object>

Bean生命周期

  • Bean的实例化阶段

  • Bean的设置属性阶段

    • 循环依赖
    • 在设置属性阶段后,postProcessBeforeInitialization方法执行前,会执行很多Aware类型的接口,这种类型接口作用是加载资源到Spring容器中,Aware前面的名字就对应哪种资源,依次加载的是:
      BeanNameAware
      BeanClassLoaderAware
      BeanFactoryAware
      EnvironmentAware
      ResourceLoaderAware
      ApplicationEventPublisherAware
      ApplicationContextAware
  • Bean的 初始化阶段

    • InitializingBean的afterPropertiesSet方法
    • @PostConstruct注解标注的方法
    • 配置的init-method
    • 上面的三个方法效果都是一样的
  • Bean的销毁阶段

    • preDestroy注解标注的方法
    • DisposableBean接口的destroy方法
    • 配置的destroy-method

初始化阶段,有个特别重要的接口BeanPostProcessor,在初始化前、后调用。

Demo

借用一个博主的demo

测试类

public class BeanLifeTest {@Testpublic void test(){System.out.println("Spring容器初始化===========================");ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");System.out.println("Spring容器初始化完毕========================");System.out.println("从容器中获取Bean");IocBeanLifeService service = context.getBean("iocBeanLifeService", IocBeanLifeService.class);System.out.println(service.toString());System.out.println("Spring容器准备关闭==========================");context.close();System.out.println("Spring容器完成关闭===========================");}
}

所有Bean在初始化前后都会执行

public class CustomerBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("【步骤10】执行BeanPostProcessor中postProcessBeforeInitialization方法,beanName=" + beanName);return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("【步骤14】执行BeanPostProcessor的postProcessAfterInitialization方法,beanName=" + beanName);return bean;}
}

Demo Bean

public class IocBeanLifeService implements InitializingBean,DisposableBean,ApplicationContextAware,ApplicationEventPublisherAware, BeanClassLoaderAware, BeanFactoryAware,BeanNameAware, EnvironmentAware, ImportAware, ResourceLoaderAware{private String name;private String sex;public void setName(String name) {System.out.println("【步骤2】执行Bean的set方法,设置name属性值:" + name);this.name = name;}public void setSex(String sex) {System.out.println("【步骤2】执行Bean的set方法,设置sex属性值:" + sex);this.sex = sex;}public IocBeanLifeService(){System.out.println("【步骤1】执行Bean的无参构造函数");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("【步骤12】执行InitializingBean的afterPropertiesSet方法");}@Overridepublic void destroy() throws Exception {System.out.println("【步骤16】执行DisposableBean接口的destroy方法");}//通过<bean>的destroy-method属性指定的销毁方法public void destroyMethod() throws Exception {System.out.println("【步骤17】执行配置的destroy-method");}//通过<bean>的init-method属性指定的初始化方法public void initMethod() throws Exception {System.out.println("【步骤13】执行配置的init-method");}@PostConstructpublic void initPostConstruct(){System.out.println("【步骤11】执行PostConstruct注解标注的方法");}@PreDestroypublic void preDestroy(){System.out.println("【步骤15】执行preDestroy注解标注的方法");}@Overridepublic void setBeanClassLoader(ClassLoader classLoader) {System.out.println("【步骤4】执行BeanClassLoaderAware中setBeanClassLoader,ClassLoader的name = " + classLoader.getClass().getName());}@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("【步骤5】执行BeanFactoryAware中setBeanFactory,beanFactory中是否包含IocBeanLifeService:" + beanFactory.containsBean("iocBeanLifeService"));}@Overridepublic void setBeanName(String s) {System.out.println("【步骤3】执行BeanNameAware中setBeanName方法,beanName值:"+ s);}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {System.out.println("【步骤9】执行ApplicationContextAware的setApplicationContext方法,Bean Definition Names="+ Arrays.toString(applicationContext.getBeanDefinitionNames()));}@Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {System.out.println("【步骤8】执行ApplicationEventPublisherAware中setApplicationEventPublisher方法");}@Overridepublic void setEnvironment(Environment environment) {System.out.println("【步骤6】执行EnvironmentAware的setEnvironment方法");}@Overridepublic void setResourceLoader(ResourceLoader resourceLoader) {Resource resource = resourceLoader.getResource("classpath:applicationContext.xml");System.out.println("【步骤7】执行ResourceLoaderAware的setResourceLoader方法,Resource File Name="+ resource.getFilename());}@Overridepublic void setImportMetadata(AnnotationMetadata annotationMetadata) {System.out.println("执行setImportMetadata");}
}

Spring拓展点

XxxAware

上面的demo有

Bean初始化前后:BeanPostProcessor

场景:所有Bean在初始化前后,都会执行上面说到的BeanPostProcessor 的Before和After方法。

所有BeanDefinition注册后:BeanFactoryPostProcessor

如下,将已经注册的Definition设置为懒加载。

@Component
public class A implements BeanFactoryPostProcessor {//在所有BeanDefinition注册完之后调用。@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory factory) throws BeansException {//所有BeanDefinition名for (String beanDefinitionName : factory.getBeanDefinitionNames()) {System.out.println(beanDefinitionName);}//设置懒加载BeanDefinition beanDefinition = factory.getBeanDefinition("userService");beanDefinition.setLazyInit(true);}
}

@PostConstruct失效

主页文章:@PostConstruct 失效之(Bean实现了BeanFactoryPostProcessor)

所有Bean就绪后:ApplicationListener、CommandLineRunner

场景:在所有Bean就绪之后,执行。
是通过监听接口方式启动
两种方式

1.
@Component
public class B implements ApplicationListener<ContextRefreshedEvent> {@Overridepublic void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {System.out.println("所有Bean已经准备就绪");}
}
或者
@Component
public class B{@EventListener(ContextRefreshedEvent.class)public void onContextRefreshed(ContextRefreshedEvent contextRefreshedEvent){System.out.println("BBB");}
}
2.
@Component
public class StartPingService implements CommandLineRunner{@Overridepublic void run(String... args) throws Exception {System.out.println("所有Bean已经准备就绪");}
}

@Import

@Import的几种用法

找到多个Bean时不报错

Bean不唯一的时候,如有两个不同的Bean继承同一接口,都在容器中。
这时候获取bean报错,说bean不唯一

解决:
添加@Primary注解,将它设为主Bean

@Autowared和@Resources

一个是Spring提供,一个是JDK提供

前者先按照类型匹配,再按照名称
后者先按照名称匹配,再按照类型

@Autowared自动装配过程

@Configuration

加了@Configuration会为配置类创建cglib动态代理(保证配置类@Bean方法只执行一次来实现单例)

Spring注册Mybatis的Mapper为Bean

Mapper都是接口且没有实现类,怎么注册为Bean?

SpringMVC处理json

SSM中的父子容器

SpringBoot

是个啥

Spring和SpringBoot
Spring是一个框架,而SpringBoot是快速构建基于Spring的脚手架,为开发Spring及其它框架铺平了道路

Spring继续学习: IOC、Bean、拓展点.....相关推荐

  1. Spring框架学习[IoC容器高级特性]

    1.通过前面4篇文章对Spring IoC容器的源码分析,我们已经基本上了解了Spring IoC容器对Bean定义资源的定位.读入和解析过程,同时也清楚了当用户通过getBean方法向IoC容器获取 ...

  2. Spring基础学习笔记-Bean的基础知识

    一. Bean的定义,初始化,使用和销毁 二.ref指定依赖的三种模式 三.Bean的五种自动装配模式(autowire) 四.Bean依赖检查的4种模式:配合atuowire使用,dependenc ...

  3. Spring核心技术之IOC容器(一):IOC容器与Bean简介

    最近开始研究Spring框架,今天学习Spring的核心内容IOC 与 Bean 1. Spring IOC 与 Bean 简介  Inversion of Control (IoC)即控制反转,也叫 ...

  4. Spring整体学习笔记-IoC依赖注入-AOP代理-整合Spring-Mybatis

    Spring 简介 行业春天 解决企业级开发的复杂性,使现有的技术更容易使用,本身是个大杂烩,整合了现有的技术框架 不要重复造轮子 SSH:Struct2+Spring+Hibernate SSM:S ...

  5. 小马哥spring编程核心思想_求小马哥讲Spring栈核心编程思想 Spring IoC+Bean+Framework教程...

    这次搜集了下小马哥讲Spring栈核心编程思想 Spring IoC+Bean+Framework,最强Spring全面核心实战的视频教程,有需要的朋友可以自行下载学习. 课程简介: 小马哥出手的Sp ...

  6. Spring学习总结(6)——Spring之核心容器bean

    2019独角兽企业重金招聘Python工程师标准>>> 一.Bean的基础知识 1.在xml配置文件中,bean的标识(id 和 name) id:指定在benafactory中管理 ...

  7. [死磕 Spring 21/43] --- IOC 之 Factory 实例化 bean

    引用原文: https://www.cmsblogs.com/article/1391375394573258752 [死磕 Spring 21/43] - IOC 之 Factory 实例化 bea ...

  8. spring学习笔记 -- day02 spring基础、IOC控制反转

    一:srping的介绍 1.spring的体系结构 2.spring资源 a.spring-framework-4.2.4.RELEASE:Spring Framework的官方发行包 b.sprin ...

  9. Spring框架学习教程,详解Spring注入bean的几种方式

    首先,要学习Spring中的Bean的注入方式,就要先了解什么是依赖注入. 依赖注入是指:让调用类对某一接口的实现类的实现类的依赖关系由第三方注入,以此来消除调用类对某一接口实现类的依赖. Sprin ...

最新文章

  1. NeurIPS2019:新人与Bengio等大佬面对面交流,还颁发三项论文奖
  2. 200多位专家热议“智慧城市” 建议尽快完善标准体系
  3. UITableVIew的性能优化-重用原理
  4. 【夯实Mysql基础】mysql explain执行计划详解
  5. 中国大学单身 (民间)排行榜!你上榜了没
  6. 如何root安卓手机_你的手机你做主!免 ROOT 卸载安卓手机预装APP
  7. 利用MyBatis的动态SQL特性抽象统一SQL查询接口
  8. python博客源码下载_Python生成并下载文件后端代码实例
  9. OAuth2.0_授权服务配置_授权码模式_Spring Security OAuth2.0认证授权---springcloud工作笔记144
  10. CentOS 下的包管理工具RPM
  11. 开放域对话中粗粒度响应选择的上下文细到粗蒸馏
  12. Linux驱动开发 / 字符设备驱动内幕 (1)
  13. 高级商务办公软件应用【5】
  14. D. Binary Spiders(思维+字典树)
  15. java scanner输入数组_Java Scanner输入两个数组的方法
  16. 郎鹤焱张鹤伦计算机学院,德云社都是“低学历”?郎鹤焱、阎鹤祥都毕业于北京工业大学...
  17. 怎么实现文字转语音朗读?这几个小技巧快来码住
  18. 计算机相近相关专业职称,电子与智能化工程相关专业职称包括计算机、电子、通信、自动化、...
  19. William Nelson Joy
  20. Kotlin vs Flutter,我到底应该怎么选?

热门文章

  1. 微信支付----企业付款到零钱和银行卡规则
  2. Netty原理-Pipeline
  3. excel两个表格内容合并怎么做?
  4. MSP430F448IPZR微处理器
  5. 人工智能不仅玩坏了一只猫,还玩坏了整个简笔画
  6. 微信小程序页面跳转:wx.switchTab、wx.reLaunch、wx.redirectTo、wx.navigateTo、wx.navigateBack的使用和区别
  7. 【信息系统项目管理师】第十八章 组织级项目管理(考点汇总篇)
  8. 以太坊开发入门-开发环境准备
  9. 广度寻路算法C++实现
  10. PTA 7-62 贴“福”字