Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring Aware机制

Spring Aware机制

作者头像
李鸿坤
发布于 2020-07-18 10:39:24
发布于 2020-07-18 10:39:24
1K00
代码可运行
举报
文章被收录于专栏:泛泛聊后端泛泛聊后端
运行总次数:0
代码可运行

在使用Spring的过程中比较好的设计是bean不依赖于容器。在一些特殊的情况下需要感知容器的存在,使用容器的提供的资源。Spring IoC容器提供了Aware机制。

Aware机制的作用

Aware:意识,发现的意思。它的作用即是让bean感知到容器的资源。早年版本的Spring容器如果需要ApplicationContext则经常使用如下代码去先存储其引用,在容器初始化后手动调用setApplicationContext把引用set进去。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ApplicationContextHolder {
    private static ApplicationContext applicationContext = null;
    public static void setApplicationContext(ApplicationContext applicationContext) {        ApplicationContextHolder.applicationContext = applicationContext;    }
    public static ApplicationContext getApplicationContext() {        return applicationContext;    }}

如果是web场景下使用ContextLoaderListener来默认初始化容器,取得就有点困难。如果使用Spring的Aware机制则无需自己手动去获得容器的资源,而是Spring容器初始化bean后对其进行注入。上述例子可以修改为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Componentpublic class ApplicationContextHolder implements ApplicationContextAware {
    private ApplicationContext applicationContext;
    @Override    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {        this.applicationContext = applicationContext;    }
    public ApplicationContext getApplicationContext() {        return applicationContext;    }}

ApplicationContextHolder的applicationContext不再是一个静态字段。当然并不希望到处去使用ApplicationContextHolder而是需要使用到ApplicationContext的时候bean自己去ApplicationContextAware。

其它Aware接口

除了ApplicationContextAware,Spring容器还默认提供了一些常用的容器相关对象发现接口。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class AwareBean implements ApplicationContextAware,         ApplicationEventPublisherAware,         BeanClassLoaderAware,         BeanFactoryAware,         MessageSourceAware,         BeanNameAware {

    @Override    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {    // 获得ApplicationEventPublisher,    // 可使用来发布Spring容器事件    }
    @Override    public void setBeanClassLoader(ClassLoader classLoader) {    // 动态bean初始化的时候使用和Spring容器一样的ClassLoader    }
    @Override    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {    // 获得 BeanFactory    }
    @Override    public void setBeanName(String beanName) {    // 获得当前bean的名称    }
    @Override    public void setMessageSource(MessageSource messageSource) {    // i18n和一些配置参数解析    }
    @Override    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {    // 获得 ApplicationContext    }}
小结

Spring容器提供了Aware机制,使Bean能够感知到容器的资源。此功能虽然是比较方便,但是使得Bean依赖于容器的API,这违背了依赖反转的初衷。因此,只有在一些需要对容器进行动态编程的基础bean才建议使用。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 泛泛聊后端 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
CG-Assignment1
Assimp能够导入很多种不同的模型文件格式,它会将所有的模型数据加载至Assimp的通用数据结构中。当Assimp加载完模型之后,就能够从Assimp的数据结构中提取所需的所有数据。
alanzeng
2025/01/14
1380
CG-Assignment1
9.opengl光照-漫反射贴图
现实世界中,物体的材质通常不止一种,比如汽车有车壳、轮胎、窗户,每一种材质都会有漫反射和环境光颜色。
公号sumsmile
2020/06/19
1.3K0
9.opengl光照-漫反射贴图
25.opengl高级光照-Gamma校正
简单理解:人对光强度的感知是非线性的。亮度的范围如果是[0,1],0是黑色,1是纯白色,那么0.5应该代表的是中间灰色吗?NO!!人能感知到的中间灰度值是亮度为0.2左右的光强。
公号sumsmile
2020/07/15
9470
35.opengl PBR-光照
这一章节就是把PBR-理论用代码实现一遍,其中球体的绘制参考一章:opengl-球体的绘制。
公号sumsmile
2020/08/28
6070
35.opengl PBR-光照
27.opengl高级光照-点光源阴影
接上一篇继续,实际中的光源几乎不会是平行光,点光比较多。点光的阴影生成原理和阴影映射基本相同,区别是阴影映射使用一张2D图作为深度缓存,点光照射是6个面,需要6个面的纹理来存储深度值
公号sumsmile
2020/07/21
1.4K0
27.opengl高级光照-点光源阴影
24.opengl高级光照-Blinn-Phong
冯氏光照在逼近真实光照和性能之间做了很好的平衡,解决了绝大部分场景的需求,也存在一些细节问题。这一章节讲Blinn-Phong通过对冯氏光照做的一些优化。
公号sumsmile
2020/07/15
1K0
32.opengl高级光照-延迟着色法
之前的章节,渲染流程从前往后,每个形状依次绘制,简单的场景这是没有问题的,而且很好理解。如果绘制复杂的场景,物体数量很大,这么做对性能消耗很大,“延迟着色法”就是针对超多元素的场景渲染的优化。
公号sumsmile
2020/08/11
1.2K0
32.opengl高级光照-延迟着色法
31.opengl高级光照-泛光bloom
bloom技术模拟现实场景中高亮光照效果,通过对光照增加模糊,形成一圈泛光,增强光照的辐射。
公号sumsmile
2020/08/11
1.3K0
31.opengl高级光照-泛光bloom
30.opengl高级光照-HDR
HDR:High Dynamic Range, 高动态范围 LDR: Low Dynamic Range, 低动态范围
公号sumsmile
2020/08/11
1.3K0
30.opengl高级光照-HDR
18.opengl高级-立方体贴图
立方体贴图在《视觉计算基础》一书中,第14章的环境贴图中有讲到,常见的环境贴图有立方体环境贴图和球体环境贴图,根据实际场景来区分使用,比如你想创建一个四四方方的房间环境,就用立方体贴图。原理也不复杂,可以根据相机视角映射到对应的纹理像素上。
公号sumsmile
2020/07/13
1.1K0
18.opengl高级-立方体贴图
14.opengl高级-模板测试
1.3 stencil test在graphics pipeline里面的位置,模板测试在深度测试之前
公号sumsmile
2020/06/28
1.2K0
14.opengl高级-模板测试
29.opengl高级光照-视差贴图
上一篇法线贴图使用了法线纹理,通过法线的变化来控制漫反射和镜面反射的强度,加强了纹理渲染的层次感,明暗渐变更符合实际情况。视差贴图在法线贴图之上,增加物体表面的凹凸感。
公号sumsmile
2020/07/28
9580
29.opengl高级光照-视差贴图
12. opengl模型加载-assimp编译(mac)
源码编译有两处坑: 2.1 Ver 3.3.1源码有笔误,编译报错,4.1+版本无此问题,亲测
公号sumsmile
2020/06/23
2.8K0
12. opengl模型加载-assimp编译(mac)
38.opengl-字体渲染
早期的文本渲染,是将需要的字符集放到一个大纹理中,这个纹理称为“位图字体”,渲染某个字符时,通过查找坐标,找到该字符对应的区域并渲染出来,再启动混合,让字符纹理的背景保持透明,非常容易理解。
公号sumsmile
2020/10/10
1.8K0
38.opengl-字体渲染
28.opengl高级光照-法线贴图
为了增加渲染的真实感,图片纹理对每个片段增加法线,渲染时根据不同的法线计算独立的光照效果。
公号sumsmile
2020/07/21
1.2K0
28.opengl高级光照-法线贴图
26.opengl高级光照-阴影映射
涉及的代码不少,其实逻辑不复杂,参考原文和代码: learnopengl-阴影映射 learnopengl-阴影映射-代码
公号sumsmile
2020/07/16
1.1K0
17.opengl高级-帧缓冲(1)
1.3. check帧缓冲状态(没有深入理解,具体需要检测哪些数据),后面的操作渲染到当前帧缓冲中,即离屏渲染(Off-screen Rendering),窗口上看不到任何变化
公号sumsmile
2020/07/10
2K0
17.opengl高级-帧缓冲(1)
21.opengl高级-几何着色器
几何着色器可以在顶点发送到着色器之前随意变换。可以这么理解:顶点着色器是接收属性,一般不做过多处理,保持原数据,算是第一层接口层;片元着色器一般处理color;如果想做些特殊处理,通过在中间加一层几何着色器把流程拆碎,分工更细致,达到工程代码高内聚低耦合,拓展性更合理。涉及的知识点不多,下面直接通过实例来说明几何着色器的使用原理
公号sumsmile
2020/07/14
1.2K0
【OpenGL】基础光照
现实世界中的光照是极其复杂,难以计算的,因此OpenGL的光照使用的是简化的模型,其中一个模型被称为冯氏光照模型(Phong Lighting Model)。
六月丶
2022/12/26
9211
【OpenGL】基础光照
22.opengl高级-实例化
绘制有共同特征,或者按照一定规则变化的图形阵列,如果挨个按照普通流程来绘制:绑定VAO、绑定纹理、设置uniform-->调用glDrawArrays(GL_TRIANGLES, 0, amount_of_vertices)性能上会比较差,opengl渲染管线流程中,CPU<-->GPU数据通信是很大的开销。
公号sumsmile
2020/07/14
8000
相关推荐
CG-Assignment1
更多 >
LV.1
这个人很懒,什么都没有留下~
作者相关精选
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
加入讨论
的问答专区 >
1程序员擅长1个领域
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
    本文部分代码块支持一键运行,欢迎体验
    本文部分代码块支持一键运行,欢迎体验