Spring继续学习: IOC、Bean、拓展点.....
文章目录
- 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、拓展点.....相关推荐
- Spring框架学习[IoC容器高级特性]
1.通过前面4篇文章对Spring IoC容器的源码分析,我们已经基本上了解了Spring IoC容器对Bean定义资源的定位.读入和解析过程,同时也清楚了当用户通过getBean方法向IoC容器获取 ...
- Spring基础学习笔记-Bean的基础知识
一. Bean的定义,初始化,使用和销毁 二.ref指定依赖的三种模式 三.Bean的五种自动装配模式(autowire) 四.Bean依赖检查的4种模式:配合atuowire使用,dependenc ...
- Spring核心技术之IOC容器(一):IOC容器与Bean简介
最近开始研究Spring框架,今天学习Spring的核心内容IOC 与 Bean 1. Spring IOC 与 Bean 简介 Inversion of Control (IoC)即控制反转,也叫 ...
- Spring整体学习笔记-IoC依赖注入-AOP代理-整合Spring-Mybatis
Spring 简介 行业春天 解决企业级开发的复杂性,使现有的技术更容易使用,本身是个大杂烩,整合了现有的技术框架 不要重复造轮子 SSH:Struct2+Spring+Hibernate SSM:S ...
- 小马哥spring编程核心思想_求小马哥讲Spring栈核心编程思想 Spring IoC+Bean+Framework教程...
这次搜集了下小马哥讲Spring栈核心编程思想 Spring IoC+Bean+Framework,最强Spring全面核心实战的视频教程,有需要的朋友可以自行下载学习. 课程简介: 小马哥出手的Sp ...
- Spring学习总结(6)——Spring之核心容器bean
2019独角兽企业重金招聘Python工程师标准>>> 一.Bean的基础知识 1.在xml配置文件中,bean的标识(id 和 name) id:指定在benafactory中管理 ...
- [死磕 Spring 21/43] --- IOC 之 Factory 实例化 bean
引用原文: https://www.cmsblogs.com/article/1391375394573258752 [死磕 Spring 21/43] - IOC 之 Factory 实例化 bea ...
- spring学习笔记 -- day02 spring基础、IOC控制反转
一:srping的介绍 1.spring的体系结构 2.spring资源 a.spring-framework-4.2.4.RELEASE:Spring Framework的官方发行包 b.sprin ...
- Spring框架学习教程,详解Spring注入bean的几种方式
首先,要学习Spring中的Bean的注入方式,就要先了解什么是依赖注入. 依赖注入是指:让调用类对某一接口的实现类的实现类的依赖关系由第三方注入,以此来消除调用类对某一接口实现类的依赖. Sprin ...
最新文章
- NeurIPS2019:新人与Bengio等大佬面对面交流,还颁发三项论文奖
- 200多位专家热议“智慧城市” 建议尽快完善标准体系
- UITableVIew的性能优化-重用原理
- 【夯实Mysql基础】mysql explain执行计划详解
- 中国大学单身 (民间)排行榜!你上榜了没
- 如何root安卓手机_你的手机你做主!免 ROOT 卸载安卓手机预装APP
- 利用MyBatis的动态SQL特性抽象统一SQL查询接口
- python博客源码下载_Python生成并下载文件后端代码实例
- OAuth2.0_授权服务配置_授权码模式_Spring Security OAuth2.0认证授权---springcloud工作笔记144
- CentOS 下的包管理工具RPM
- 开放域对话中粗粒度响应选择的上下文细到粗蒸馏
- Linux驱动开发 / 字符设备驱动内幕 (1)
- 高级商务办公软件应用【5】
- D. Binary Spiders(思维+字典树)
- java scanner输入数组_Java Scanner输入两个数组的方法
- 郎鹤焱张鹤伦计算机学院,德云社都是“低学历”?郎鹤焱、阎鹤祥都毕业于北京工业大学...
- 怎么实现文字转语音朗读?这几个小技巧快来码住
- 计算机相近相关专业职称,电子与智能化工程相关专业职称包括计算机、电子、通信、自动化、...
- William Nelson Joy
- Kotlin vs Flutter,我到底应该怎么选?
热门文章
- 微信支付----企业付款到零钱和银行卡规则
- Netty原理-Pipeline
- excel两个表格内容合并怎么做?
- MSP430F448IPZR微处理器
- 人工智能不仅玩坏了一只猫,还玩坏了整个简笔画
- 微信小程序页面跳转:wx.switchTab、wx.reLaunch、wx.redirectTo、wx.navigateTo、wx.navigateBack的使用和区别
- 【信息系统项目管理师】第十八章 组织级项目管理(考点汇总篇)
- 以太坊开发入门-开发环境准备
- 广度寻路算法C++实现
- PTA 7-62 贴“福”字