《Spring Boot 源码学习系列》一、引言上篇博文《深入 ApplicationContext 初始化器实现》,Huazie 带大家详细分析了 分析 Spring Boot 中预置的应用上下文初始化器实现 那本篇就来对其中的 SharedMetadataReaderFactoryContextInitializer 【即 共享 MetadataReaderFactory 上下文初始化器】详细分析下。 ConfigurableApplicationContext> 和 Ordered 接口:ApplicationContextInitializer<ConfigurableApplicationContext> :应用上下文初始化器接口类 Ordered :实现该接口可以控制应用上下文初始化器实现类的执行顺序,有关这点我们可以查看 SpringApplication 的 getInitializers 方法。 三、总结本篇 Huazie 带大家一起分析了 spring-boot-autoconfigure 子模块中预置的 应用上下文初始化器实现 SharedMetadataReaderFactoryContextInitializer
《Spring Boot 源码学习系列》 一、引言 上篇博文《共享 MetadataReaderFactory 上下文初始化器》,Huazie 带大家详细分析了 SharedMetadataReaderFactoryContextInitializer 而在 spring-boot-autoconfigure 子模块中预置的上下文初始化器中,除了共享 MetadataReaderFactory 上下文初始化器,还有一个尚未分析。 那么本篇就来详细分析一下 ConditionEvaluationReportLoggingListener 【即 ConditionEvaluationReport 日志记录上下文初始化器】。 DEBUG【默认通过它实例化该上下文初始化器】 带 LogLevel 参数的构造方法:Assert.isTrue 是用于验证一个条件是否为真。 三、总结 本篇 Huazie 带大家一起分析了 spring-boot-autoconfigure 子模块中预置的另一个应用上下文初始化器实现 ConditionEvaluationReportLoggingListener
更有可能出现在Spring项目的代码测试,不过呢,单元测试的框架(比如 JUnit)已经提供了简单的方式,也就不建议直接实例化上下文。 因为实例化一个上下文还得要做维护,再者现在常用的是基于Web的开发,也就是常用 Spring MVC。 web项目的开发关键点在于让web容器初始化之后提醒Spring ApplicationContext 初始化,例如 tomcat 的 ServletContext 会维护一个 WebApplicationContext -- 上下文参数,在监听器中被使用,实际就是key-value,key=contextConfigLocation 写死 --> <context-param> <param-name -- 监听器配置,初始化 WebApplicationContext --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener
# 什么是上下文管理器 python中使用with来使用上下文管理器. 在使用某个资源时,可以对该资源进行初始化和资源的清理两个操作,在这两个操作之间边成为上下文。 f = open("a.txt") f.write("hello world") f.close() 使用上下文管理器 打开文件后,得到文件描述符,在with代码块中对f进行操作,结束时,会自动的进行关闭操作 . with open("a.txt") as f: f.write("hello world") # 自定义上下文管理器 # 类实现 进入上下文时,调用__enter__方法进行初始化,退出时 hello") print("world") output: 进入 hello world 释放资源 # 方法实现 使用contextlib.contextmanager 对方法实现上下文管理器
1 让对象支持上下文管理协议 在类中,实现 __enter__()和__exit__()方法,类创建的对象就支持with语句。 Connection(('www.python.org', 80)) with conn as s1: print(s1) with conn as s2: print(s2) 2 装饰器版上下文管理器 上面介绍了在类和对象中实现上下文管理协议,其实Python标准库中contextlib包的@contextmanager装饰器能够轻松实现一个上下文管理器,下例是用其实现统计代码块耗时的上下文管理器: import time from contextlib import contextmanager # 来看一个装饰器版本的上下文管理器 # 检查代码消耗时间块 @contextmanager def 上下文管理器可以应用在事务中: # 更高级的事务管理 @contextmanager def list_transaction(orig_list): working = list(orig_list
with语句会设置一个临时的上下文,交给上下文管理器对象控制,并且负责清理上下文。 Python上下文管理器对象存在的目的就是管理with语句。 实现一个上下文管理器 上下文管理器协议包含__enter__和__exit__两个方法,所以要实现一个上下文管理器,就得实现这两个方法,比如: class LookingGlass: def return True __enter__是上下文管理器的入口,在with语句开始运行时调用。 __exit__是上下文管理器的出口,在with语句运行结束后调用。 把生成器变为上下文管理器 使用@contextmanager装饰器能减少创建上下文管理器的样板代码量,只需要实现一个有yield语句的生成器,生成想让__enter__方法返回的值。
当然我们是可以通过关闭会话的方式回收资源,还有一种更为简便的方式就是使用Python的上下文管理器。 在说明TensorFlow的会话操作之前,先介绍上下文管理器和它的一个其他使用。 我们在开头定义了一个IplImage类型的变量,总要在程序结束前 cvReleaseImage它,不然就会造成内存的泄漏,而这也是1.0版本的一个很大的诟病,直到2.0版之后引入了Mat类型,而Python的上下文管理器就相当于 (这个例子可能并不准确,但是可以直观的说明上下文管理器的最大优点:简便的内存管理,异常下的内存回收) 下面举一个简单的例子,比如我们想要完成一个文件写入的任务: 1.用手动收回的方式: logger 3.使用上下文管理器 with open("log.txt", "w") as logger: logger.write('Hello ') logger.write('World') print logger.closed 是的,只需要在程序块前加上with,就可以实现上下文管理器的功能,比方法2简洁了很多。
:根据应用类型(Web或非Web)创建对应的ApplicationContext实现类 前置处理阶段:执行所有的ApplicationContextInitializer 刷新上下文阶段:调用 :注册并实例化所有的BeanPostProcessor 初始化消息源:用于国际化处理 初始化事件广播器:建立应用事件发布机制 初始化特殊Bean:实例化实现了特定接口的特殊Bean 注册监听器:注册所有的事件监听器 () - 初始化应用事件广播器 onRefresh() - 模板方法,子类可以覆盖 registerListeners() - 注册监听器 finishBeanFactoryInitialization Bean后置处理器注册 registerBeanPostProcessors()阶段负责注册所有检测到的BeanPostProcessor。这些后置处理器会在Bean实例化、初始化的不同阶段介入处理。 initApplicationEventMulticaster():初始化事件广播器 onRefresh():模板方法(Spring Boot在此处内嵌Web服务器启动) registerListeners
仅供学习,转载请注明出处 with与“上下文管理器” 如果你有阅读源码的习惯,可能会看到一些优秀的代码经常出现带有 “with” 关键字的语句,它通常用在什么场景呢? 在讲 with 的原理前要涉及到另外一个概念,就是上下文管理器(Context Manager)。 什么是上下文(context) 上下文在不同的地方表示不同的含义,要感性理解。 哦,上下文就是这样? ? 不然呢 上下文管理器 任何实现了 __enter__() 和 __exit__() 方法的对象都可称之为上下文管理器,上下文管理器对象可以使用 with 关键字。 因为 File 类实现了上下文管理器,现在就可以使用 with 语句了。 使用@contextmanager实现上下文管理器的另外方式 Python 还提供了一个 contextmanager 的装饰器,更进一步简化了上下文管理器的实现方式。
上下文管理器其实是with语句,这是为了简化try/finally模式,这可以保证一段代码在运行完之后,即使出现错误也能正确的运行。 就跟前面的系列文章所述,上下文管理器也是一种协议,包含__enter__和__exit__方法。在with语句开始运行是会调用__enter__方法,结束后会调用__exit__方法。 说了这么多,这意味着我们也可以制造一个上下文管理器,只要实现了__enter__和__exit__方法。 ExitStack", "redirect_stdout", "redirect_stderr", "suppress"] 其中,contextmanager可以把简单的生成器函数变成上下文管理器
{ 1, "Value1" }, 5 { 2, "Value2" }, 6 { 3, "Value3" } 7 }; 8 } 早C#3中引入的集合初始化器 ,可是让我们用上面的语法来在声明一个字典或者集合的时候立即初始化一些项进去,其实在C#3中这是个语法糖,实质编译后的结果是调用字典或者集合的Add方法逐一添加这些项。 索引初始化器 1 private static void Main() 2 { 3 var dictionary = new Dictionary<int, string> 4 { 5 set访问器(set_Item)。 总结 从本质来看,[xxx]=yyy这种语法,xxx可以是任意类型,凡是有索引器支持的类型,均可以使用这种语法。简单直接明了。
c#对象初始化器 以往在对对象属性进行初始化时我们一般会使用构造方法的形式对对象属性进行初始化,如 class Program { static void Main(string this.name = name; this.sex = sex; } } } 而使用对象初始化器 相同点:都可以完成对象属性的初始化 不同点 1.构造函数具有强制性,而对象初始化器没有强制性 这个强制性怎么说,首先在用构造函数时,对每个属性赋值,必须和构造函数声明的变量属性相同。 name = "java", age = 25, sex = "男" }; 2.对象初始化器只能完成属性的初始化 如构造方法可以在对象创建时读取文件,或者进行一些数据的判断,而在对象初始化器中只能进行赋值的操作 3.对象初始化器是在创建对象的时候使用,而构造方法是写在类里面 对象初始化器无需写方法一类的可以直接赋值
实际上,任何对象,只要正确实现上下文管理,就可以使用with语句。实现上下文管理是通过 __enter__ 和 __exit__ 这两个方法实现的。 2、上下文管理 上下文管理可以为我们屏蔽上下文的复杂性。例如,我们实现一个类Cat,实现其__enter__和__exit__方法。 __enter__(self): 进入上下文管理器时调用此方法,其返回值将被放入with-as语句中as说明符指定的变量中。 __exit__(self,type,value,tb):离开上下文管理器调用此方法。如果有异常出现,type、value、tb分别为异常的类型、值和追踪信息。如果没有异常, 3个参数均设为None。 Kitty enter cat named Tom hello, Kitty hello, Tom exit cat named Tom exit cat named Kitty 4、最后给出一个实例 使用上下文管理器实现
当然,上下文的管理器的作用不止于此,它内部的实现机制,能很好的处理代码异常,提升代码的复用性。 什么是上下文管理器? 上下文管理器,上下文管理器是指在一段代码执行之前,执行一些预处理的工作,代码执行之后再执行一些清理工作。 上下文管理器中有__enter__()和 __exit__() 两个方法,__enter__()方法在执行 with 后面的语句时执行,一般用来处理操作前的内容,比如一些创建对象,初始化等;__exit 上下文管理器的使用 #自定义一个上下文管理类 class MyOpen(): def __init__(self): print("初始化方法") def __enter 上下文管理器的异常处理 根据上下文管理的原理,上下文管理是实现了__enter__()和 __exit__() 这两个方法,所以我们可以根据此原理来自定义自己的上下文管理器。
以空初始化器列表({})初始化边界未知的数组。 ,使用指派初始化器列表初始化时可以直接使用联合体成员的指派初始化器进行初始化。 (example 1 ) 当初始化器以嵌套的形式初始化对象,初始化器内的数据以及初始化器子句均对应某个元素的初始化,且对应顺序为聚合体内元素的声明顺序,初始化时可以隐式转换,但是不能窄化转换。 a.x,以 2 初始化 a.b.b1,以 3 初始化 a.b.b2 a = {1, {2, 3.0}}; // error, 存在窄化转换 指派初始化器 以上其实已涉及导指派初始化器, ,当出现窄化转换会报错(example 222) 只能为联合体指定一个初始化器,无论联合体作为聚合体抑或联合体作为聚合体内元素时,均只能为其指定一个初始化器(example 223) 对于非联合体的聚合体未提供指派初始化器的元素
with语句的执行流程 在python中使用with进行上下文的管理,with语句的执行过程如下: 计算表达式的值,返回一个上下文管理器对象 加载上下文管理器对象的exit()方法,但不执行 调用上下文管理器对象的 enter()方法 如果with语句设置了目标对象,则将enter()方法的返回值赋给目标对象 执行with中的代码块 如果5中的代码正常结束,调用上下文管理器对象的exit()方法,其返回值直接忽略。 如果5中的代码发生异常,调用上下文管理器对象的exit()方法,并将异常类型、异常值和traceback传递给exit()方法。 使用生成器实现上下文管理器 如果我们只是为一个简单的函数进行上下文管理,那么定义一个类略有些麻烦。好在我们还有标准库可以使用,这个标准库是contextlib。下面是一个简单的应用例子。 在生成器实现的上下文管理器中进行异常处理 使用类的方法进行上下文管理时,异常是作为参数传递的,那使用生成器进行上下文管理时应该怎样做呢?
内容概述 “线程上下文类加载器”介绍 SPI(Service Provider Interface)探索 通过JDBC驱动加载深刻理解线程上下文类加载器机制 < br> “线程上下文类加载器”介绍 线程上下问类加载器出现的原因 有了线程上下文类加载器,也就是父类加载器请求子类加载器去完成类加载的动作(即,父类加载器加载的类,使用线程上下文加载器去加载其无法加载的类),这种行为实际上就是打通了双亲委派模型的层次结构来逆向使用类加载器 而通过给当前线程设置上下文类加载器,就可以由设置的上下文类加载器来实现对于接口实现类的加载。 在框架开发、底层组件开发、应用服务器、web服务器的开发,就会用到线程上下文类加载器。 如果我们没有对线程上下文类加载器做任何设值的话,那么当前线程的上下文类加载器就是"系统类加载器"。 ; } } 可见,初始化”com.mysql.jdbc.Driver”的过程会去: a)初始化“java.sql.DriverManager”(启动类加载器加载的)。
装饰器与上下文管理器是Python中两种强大的工具,用于增强函数、类或代码块的功能,实现诸如日志记录、性能监控、资源管理等常见任务。 在技术面试中,对装饰器与上下文管理器的理解与应用能力是评价候选者编程水平与经验的重要依据。 一、Python装饰器与上下文管理器基础装饰器装饰器是一种可调用对象,用于修改或增强其他函数、类的行为。装饰器通过在函数定义前放置@decorator语法糖实现。 使用with语句调用上下文管理器。 面对相关问题,应深入理解装饰器与上下文管理器的概念、识别并避免常见易错点,通过编写清晰、高效的装饰器与上下文管理器代码展示扎实的技术功底。
上下文管理器 上下文管理器可以对上下文进行管理,上下文管理器中有两个必须的方法:__enter__和__exit__。 当你使用上下文管理器对象调用__enter__方法时,就进入了上下文管理中,__enter__中的操作会对上下文进行影响,要停止上下文管理时,就调用__exit__方法停止上下文管理。 通过 UpperOut() 得到一个上下文管理器对象,而调用__enter__后进入上下文管理,在这之间所有的输出都是大写,在调用__exit__方法后结束上下文管理,可以看到monster的输出变为小写 with 在了解上下文管理器后,学习with就很简单了,上下文管理器对象就是用来控制with语句的。 with后面的表达式得到结果是上下文管理器对象 在as的时候会把__enter__方法返回的结果绑定到word上 在with代码块内进行上下文管理 在退出with代码块时,上下文管理器对象会自动调用__
①模板上下文处理器(context processor) 在 settings.py 中,包含了当前使用的上下文处理器。它的作用是可以给每一个 response 都提供想要添加的参数。 settings.py -> TEMPLATES -> OPTIONS -> context_processors 中使用的上下文处理器的作用: django.template.context_processors.debug ②自定义上下文处理器: 中间件 有点类似给 request 添加属性,而 上下文处理器 有点类试给 模板 添加属性。一个是向上,一个是向下。 将定义的上下文处理器放到 settings.py ->TEMPLATES->OPTIONS->context_processors 中。 ?