品读 泰戈尔 飞鸟集 之一二零 留点空间给想象

文章探讨了黑夜带来的恐怖与想象的魅力之间的关系,通过比喻黑夜中的妇人之美,阐述了想象的空间如何创造幸福感。强调了在无尽的想象中,黑夜给予人们释放创造力与欲望的机会,最终引领读者领略到黑夜的美学价值。
黑夜呀,我感觉得你的美了,你的美如一个可爱的妇人,当她把灯熄灭了的时候。

I feel thy beauty, dark night, like that of the loved woman when she has put out the lamp.

老师解读:

妇人,尤其可爱的妇人,而又是熄灯时节的可爱的妇人,恰如贾平凹或赵本山或古籍删节本上搞的此处删去××字外加空格若干一样令人跌足长叹——
不要做类似不健康的想象哦,但泰翁的确在说想象的魅力啊。
黑夜带来恐怖,多因为它给居于其间的生物以自失之感,无法掌控自我的危机感。许多妄想也就油然而生。
如果能把狂想的内容做一些美化,那它给人带来的幸福感一定令人流连忘返。因为黑夜是无,给想象预留的空间就是无穷。所谓想的美正当时也。
在此点上,黑恰如白,有云:一张白纸可以画出最美的图画。
既然给了你想象的权利,你又何必再去苦苦追寻自己的伤心?

signed by 赵亚:

老师风度依旧,学生又学习了 。删节处的xx并无什么不健康,xx是最美的,人类欲望的终极发泄。有什么能比xx更让人释怀呢?然而一跟社会学,伦理学联系起来,最美的事就变成最丑了...完全失重是最美的状态,即便在牛顿定律中它也是一个亘古不变的真理。茫然中有所思,迷茫中欲求解,面对白纸想作画,仰望蓝天欲作诗,这些都有所遗憾,不能让人释怀。只有黑夜,完整的黑夜,让你的视觉,听觉完全失效的黑夜,才能使你彻底摆脱肉身的感觉,忘掉外在的刺激,忘掉仅对官感的影响,完全沉浸在自我的遐想之中,美丽无可形容,香气无法嗅探,沁人心脾。完全失重,从尼亚加拉瀑布一跃而下的失重之感,正如黑夜之美,正如熄灯妇人之美...


<think>我们被要求品读Spring Boot自动配置的源码,重点在于理解其核心机制。根据之前的讨论,我们知道`AutoConfigurationImportSelector`是自动配置的核心类,但自动配置的源码阅读涉及多个方面。以下是一个系统的源码解读框架: ### Spring Boot自动配置源码核心解读 #### 1. **启动入口:`@SpringBootApplication`** ```java @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration // 开启自动配置 @ComponentScan public @interface SpringBootApplication { // ... } ``` - `@EnableAutoConfiguration`是关键,它通过`@Import`导入了`AutoConfigurationImportSelector`。 #### 2. **核心选择器:`AutoConfigurationImportSelector`** - **继承结构**:实现`DeferredImportSelector`接口,因此其导入的配置类会延迟处理(在所有`@Configuration`类处理之后)。 - **核心方法**: ```java @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { // 1. 检查是否开启自动配置(默认开启) if (!isEnabled(annotationMetadata)) { return NO_IMPORTS; } // 2. 获取所有自动配置类(带过滤条件) AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata); return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations()); } ``` - `getAutoConfigurationEntry()`方法负责加载和过滤配置类。 #### 3. **配置加载:`getAutoConfigurationEntry()`** ```java protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) { // 获取@EnableAutoConfiguration的属性(如exclude) AnnotationAttributes attributes = getAttributes(annotationMetadata); // 加载候选配置类(从spring.factories) List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes); // 去重(避免重复配置) configurations = removeDuplicates(configurations); // 获取需要排除的配置类(通过exclude属性) Set<String> exclusions = getExclusions(annotationMetadata, attributes); // 检查排除的类是否合法(必须是自动配置类) checkExcludedClasses(configurations, exclusions); // 移除排除的类 configurations.removeAll(exclusions); // 应用自动配置过滤器(条件注解过滤) configurations = getConfigurationClassFilter().filter(configurations); // 触发自动配置导入事件 fireAutoConfigurationImportEvents(configurations, exclusions); return new AutoConfigurationEntry(configurations, exclusions); } ``` #### 4. **条件过滤:`AutoConfigurationImportFilter`** - 通过`spring.factories`中配置的`AutoConfigurationImportFilter`实现类进行过滤。 - 默认使用三个过滤器(位于`spring-boot-autoconfigure`包): 1. `OnClassCondition`:检查类路径是否存在指定类 2. `OnBeanCondition`:检查容器中是否存在指定Bean 3. `OnWebApplicationCondition`:检查是否Web应用 #### 5. **配置类解析:`AutoConfigurationGroup`** - 在`process()`方法中处理配置类,包括排序和分组。 #### 6. **自动配置类示例:`ServletWebServerFactoryAutoConfiguration`** ```java @Configuration(proxyBeanMethods = false) @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) @ConditionalOnClass(ServletRequest.class) @ConditionalOnWebApplication(type = Type.SERVLET) @EnableConfigurationProperties(ServerProperties.class) @Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class, ServletWebServerFactoryConfiguration.EmbeddedTomcat.class, ServletWebServerFactoryConfiguration.EmbeddedJetty.class, ServletWebServerFactoryConfiguration.EmbeddedUndertow.class }) public class ServletWebServerFactoryAutoConfiguration { // ... } ``` - 条件注解控制:只有存在`ServletRequest`且是Servlet Web应用时生效。 - 通过`@Import`导入多个具体配置(Tomcat/Jetty/Undertow)。 ### 关键设计思想 1. **约定优于配置**:通过条件注解按需加载。 2. **扩展性**:通过`spring.factories`机制允许第三方starter贡献配置。 3. **性能优化**:延迟加载、条件过滤减少不必要的配置解析。 §§相关问题§§ 1. Spring Boot 如何确保自动配置类在常规配置类之后加载? 2. 在自动配置过程中,条件注解(如@ConditionalOnClass)的解析发生在哪个阶段? 3. 如何自定义一个 AutoConfigurationImportFilter 实现自定义过滤逻辑? 4. 自动配置类中使用@ConditionalOnMissingBean 注解的作用是什么?请举例说明。 5. Spring Boot 自动配置的源码中,哪些地方使用了设计模式?</think>### Spring Boot 自动配置源码深度解析 #### 一、核心入口:`@EnableAutoConfiguration` ```java @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) // 核心入口 public @interface EnableAutoConfiguration { String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; Class<?>[] exclude() default {}; String[] excludeName() default {}; } ``` - **关键设计**:通过`@Import`动态加载`AutoConfigurationImportSelector` #### 二、核心引擎:`AutoConfigurationImportSelector` ##### 1. 配置加载机制 ```java // 扫描所有spring.factories文件 protected List<String> getCandidateConfigurations( AnnotationMetadata metadata, AnnotationAttributes attributes ) { return SpringFactoriesLoader.loadFactoryNames( EnableAutoConfiguration.class, getBeanClassLoader() ); } ``` - **扫描路径**:`META-INF/spring.factories` - **配置键**:`org.springframework.boot.autoconfigure.EnableAutoConfiguration` ##### 2. 条件过滤流程 ```java // 执行条件过滤 private List<String> filter(List<String> configurations) { AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader); return new AutoConfigurationImportFilter() .filter(configurations, autoConfigurationMetadata); } ``` - **核心过滤器**: - `OnClassCondition`:检查类路径是否存在 - `OnBeanCondition`:检查Bean是否存在 - `OnWebApplicationCondition`:检查Web环境 ##### 3. 延迟加载机制 ```java // 实现DeferredImportSelector接口 public class AutoConfigurationImportSelector implements DeferredImportSelector, ... { // 延迟到所有常规@Configuration处理完成后执行 @Override public Class<? extends Group> getImportGroup() { return AutoConfigurationGroup.class; } } ``` #### 三、配置类解析:`AutoConfigurationGroup` ```java private static class AutoConfigurationGroup implements DeferredImportSelector.Group, ... { // 实际处理配置类的方法 @Override public void process(AnnotationMetadata metadata, DeferredImportSelector selector) { // 1. 加载候选配置 // 2. 条件过滤 // 3. 触发配置导入事件 } } ``` #### 四、典型配置类示例:`DataSourceAutoConfiguration` ```java @Configuration(proxyBeanMethods = false) @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) @EnableConfigurationProperties(DataSourceProperties.class) @Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class }) public class DataSourceAutoConfiguration { @Configuration(proxyBeanMethods = false) @Conditional(EmbeddedDatabaseCondition.class) @ConditionalOnMissingBean({ DataSource.class, XADataSource.class }) @Import(EmbeddedDataSourceConfiguration.class) protected static class EmbeddedDatabaseConfiguration { } @Configuration(proxyBeanMethods = false) @Conditional(PooledDataSourceCondition.class) @ConditionalOnMissingBean({ DataSource.class, XADataSource.class }) @Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class, DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.Generic.class }) protected static class PooledDataSourceConfiguration { } } ``` - **条件注解实战**: - `@ConditionalOnClass`:检测类路径存在性 - `@ConditionalOnMissingBean`:避免Bean重复定义 - `@EnableConfigurationProperties`:绑定配置属性 #### 五、关键设计模式 1. **工厂模式**: - `SpringFactoriesLoader`加载配置 2. **策略模式**: - `Condition`接口的不同实现 3. **观察者模式**: - `AutoConfigurationImportEvent`事件通知 4. **模板方法模式**: - `AutoConfigurationImportSelector`中的处理流程 #### 六、调试技巧 1. **查看加载的配置类**: ```properties # application.properties debug=true ``` 启动时将打印: ``` Positive matches: ----------------- DataSourceAutoConfiguration matched - @ConditionalOnClass found required classes 'javax.sql.DataSource'... ``` 2. **排除特定配置**: ```java @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值