Spring知识扫盲
1、bean生命周期:看BeanFactory注释

翻译成中文
Bean工厂实现应该尽可能的支持标准的Bean生命周期接口。整套初始化方法及其标准顺序如下:
BeanNameAware{@code setBeanName}
BeanClassLoaderware{@code setBeanClassLoader}
BeanFactoryAware{@code setBeanFactory}
EnvironmentAware{@code setEnvironment}
EmbeddedValueResolverAware{@code setEmbeddedValueResolver}
ResourceLoaderware{@code setResourceLoader}(仅在应用程序上下文中运行时适用)
ApplicationEventPublisherAware{@code setApplicationEventPublisher}(仅在应用程序上下文中运行时适用)
MessageSourceAware{@code setMessageSource}(仅在应用程序上下文中运行时适用)
ApplicationContextAware{@code setApplicationContext}(仅在应用程序上下文中运行时适用)
ServletContextAware{@code setServletContext}(仅在web应用程序上下文中运行时适用)
BeanPostProcessor{@code postprocessabefore initialization}方法
初始化Bean的{@code afterPropertieSet}自定义init方法定义
BeanPostProcessor{@code postProcessAfterInitialization}方法
关闭Bean工厂时,以下生命周期方法适用:
{@code postprocessabeforedisplation}销毁方法Warebean后处理器
DisposableBean的{@code destroy}
自定义销毁方法

2、Aware接口的作用:可以理解为是个插件,如果自己创建的bean对象需要容器的内置对象,可以通过Aware接口把对象设置到这个bean里
查看代码
package beans;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
/**
* 只要实现Aware接口,就可自动注入容器内置的某些属性,比如注入ApplicationContext、beanName
*/
public class MyAwareBean implements ApplicationContextAware, BeanNameAware {
private ApplicationContext applicationContext;
private String beanName;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public ApplicationContext getApplicationContext() {
return applicationContext;
}
@Override
public void setBeanName(String name) {
this.beanName = name;
}
public String getBeanName() {
return beanName;
}
}
3、BeanFactoryPostProcessor与BeanPostProcessor
BeanFactoryPostProcessor:在refresh方法的第5步执行(invokeBeanFactoryPostProcessors方法)此时已经创建好了beanFactory,并且加载好了BeanDefinition,可以在这一阶段增强(修改)BeanDefinition属性。
BeanPostProcessor:在refresh方法的第11步执行(finishBeanFactoryInitialization方法),在这一步创建bean实例 -> 属性依赖注入 -> 初始化bean(initializeBean方法)。其中initializeBean方法包括:1、调用Aware接口方法 2、调用BeanPostProcessor.before方法 3、调用init-method方法 4、调用BeanPostProcessor.after方法 可以在这一阶段增强(修改)Bean对象属性
查看代码
package beans;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;
/**
* BeanFactoryPostProcessor 用于增强(修改)BeanDefinition
* 这里把org.springframework包下所有的bean设置了Lazy
*/
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println(beanDefinitionName);
if (beanDefinitionName.startsWith("org.springframework")) {
continue;
}
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanDefinitionName);
beanDefinition.setLazyInit(true);
}
}
}
查看代码
package beans;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
/**
* BeanPostProcessor用法
*
* 每个bean实例化之后,都会触发该方法。用于增强(修改)bean对象
*/
public class MyBeanPostProcessor implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("[BeanPostProcessor] 后置处理 " + beanName);
if (bean instanceof User) {
System.out.println(String.format("[BeanPostProcessor] 在bean初始化之后 init方法之前 beanName %s bean实例 %s 修改为 %s",
beanName, bean, "Before修改的值"));
User user = (User) bean;
user.setName("Before修改的值");
}
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof User) {
System.out.println(String.format("[BeanPostProcessor] 在bean初始化之后 init方法之后 beanName %s bean实例 %s 修改为 %s",
beanName, bean, "After修改的值"));
User user = (User) bean;
user.setName("After修改的值");
}
return bean;
}
}
4、beanFactory与factoryBean区别?
1)都是用来创建对象的
2)使用beanFactory时,必须要遵循完整的创建过程,这个过程是由spring来控制的
3)当使用factoryBean只需要调用getObject()可以返回具体的对象,对象的创建过程由自己来控制,更加灵活
查看代码
package beans;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;
/**
* 可以自定义FactoryBean来创建bean对象,避开beanFactory的创建过程
*
* 获取bean
* Object user = ctx.getBean("userFactoryBean");
* System.out.println(user);
*
* 获取FactoryBean
* Object userFactoryBean = ctx.getBean("&userFactoryBean");
* System.out.println(userFactoryBean);
*/
@Component
public class UserFactoryBean implements FactoryBean<User> {
@Override
public User getObject() throws Exception {
return new User();
}
@Override
public Class<?> getObjectType() {
return User.class;
}
}
5、父子容器概念
Spring是SpringMVC父容器,SpringMVC可以获取Spring配置的bean,反之不行。
6、循环依赖针对单例bean和原型bean会发生什么
单例bean发生循环依赖,Spring会使用三级缓存来解决。原型bean发生循环依赖,会直接报异常。
Spring知识扫盲的更多相关文章
- jQuery学习笔记 - 基础知识扫盲入门篇
jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...
- CISCO知识扫盲
cisco知识扫盲 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.vlan简介 1.什么是VLAN 简称虚拟局域网.至于英语怎么写自行百度吧. VLAN的优势: 1>.广 ...
- SIM卡是什么意思?你所不知道的SIM卡知识扫盲(详解)【转】
原文链接:http://www.jb51.net/shouji/359262.html 日常我们使用手机,SIM卡是手机的必须,没有了它就不能接入网络运营商进行通信服务.SIM卡作为网络运营商对于我们 ...
- 使用所学Spring知识,实现简易的图书查询系统功能。实现查询全部图书。 根据书籍编号查询信息。 根据书名查询书籍信息。 根据状态查询书籍信息。
相关 知识 >>> 相关 练习 >>> 实现要求: 使用所学Spring知识,实现简易的图书查询系统功能. 要求如下: 查询全部图书. 根据书籍编号查询信息. 根据 ...
- 音视频处理基础知识扫盲:数字视频YUV像素表示法以及视频帧和编解码概念介绍
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一. ...
- spring知识
Spring以IoC.AOP问主要思想,鞥协同struts,hibernate,webwork,jsf,iBatis等框架. Spring最主要的思想史IoC(Inversion of Control ...
- Spring知识汇总
Spring简介 Spring框架由Rod Johnson开发,2004年发布了Spring框架的第一版.Spring是一个从实际开发中抽取出来的框架,因此它完成了大量开发中的通用步骤,留给开发者的仅 ...
- spring知识大全(3)
4 Spring对持久层的支持 Spring对持久层的支持:① JDBC,② O/R Mapping(Hibernate,TopLink等) 一.Spring对持久层支持采用的策略: 1.Spring ...
- spring知识大全(4)
5 Spring对事务的支持 一.AOP事务的含义: 事务当作一个切面,动态地织入到目标对象,形成一个代理对象. 二.Spring的事务机制 Spring支持声明式事务. Spring使用事务服务代理 ...
- mysql基础知识扫盲
本篇主要介绍关于mysql的一些非常基础的知识,为后面的sql优化做准备. 一:连接mysql 关于mysql的下载和安装我在这里就不说了,第一步我们要连接我们的mysql服务器,打开cmd命令切换到 ...
随机推荐
- Tomcat知识点整理
从学习起就开始接触tomcat, 解压, 点击运行, 然后放文件夹里面会自动部署, 可以通过ip访问. 在这里主要记录一些tomcat相关的知识点 配置文件解析(留位置) server.xml/web ...
- spring_声明式事务: @Transactional
例子. <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://ww ...
- jmeter从文档CSV内读取参数且文件路径为相对路径
如下图,"全站链接扫描"脚本的参数化文件存储在同一目录的参数化文件夹内 预计实现读取该文件使用相对路径(非绝对路径,避免脚本在另一台电脑存在别的目录下能正常读取参数文件) 如读取& ...
- 1703. 得到连续 K 个 1 的最少相邻交换次数
1703. 得到连续 K 个 1 的最少相邻交换次数 class Solution { public int minMoves(int[] nums, int k) { List<Integer ...
- Go工程选择开源分库分表中间件可用性测试
近期在寻找Go工程可以用的开源分库分表中间件,找了3个:ShardingSphere-Proxy,Kingshard,Gaea,下面给出测试过程和对比结果 ShardingSphere-Proxy h ...
- json导出csv
let data = [] let keys = ['name', 'town', 'village', 'address', 'update_time_label', 'manager'] let ...
- TextBox输入法控制,进入输入框则启用或禁用输入法(ime),禁用后只能输入英文
有的场景需要禁止用户打开ime模式(禁止输入法输入),所以 TextBox 支持默认属性配置,效果如下: <Window x:Class="切换输入法.MainWindow" ...
- PC端自动化测试实战教程-3-pywinauto 启动PC端应用程序 - 下篇(详细教程)
1.简介 经过上一篇的学习.介绍和了解,pywinauto的强大,不言而喻吧!宏哥讲解和分享的是电脑自带和安装的应用程序.有些小伙伴或者童鞋们已经迫不及待地私信宏哥,如果在电脑中这个应用程序已经启用了 ...
- 如何用DevEco Studio的ArkUI Inspector轻松搞定鸿蒙应用UI布局
作为一名鸿蒙应用开发者,我最近遇到了一个让我头疼不已的UI问题--一个看似简单的页面布局,却在真机上出现了严重的错位问题.按钮重叠.文本溢出.图片显示不全--这些问题不仅影响了用户体验,还让我在调试过 ...
- 【记录】OJ|区间DP|石子合并(环形)
1. 题干 描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出一个算法,计算出将N堆石子 ...