算卦网站开发,营销网站建设一薇,力洋网站建设公司,网站模板怎么套用#x1f389;#x1f389;欢迎光临#xff0c;终于等到你啦#x1f389;#x1f389;
#x1f3c5;我是苏泽#xff0c;一位对技术充满热情的探索者和分享者。#x1f680;#x1f680;
#x1f31f;持续更新的专栏《Spring 狂野之旅#xff1a;从入门到入魔》 欢迎光临终于等到你啦
我是苏泽一位对技术充满热情的探索者和分享者。
持续更新的专栏《Spring 狂野之旅从入门到入魔》
本专栏带你从Spring入门到入魔
这是苏泽的个人主页可以看到我其他的内容哦
努力的苏泽http://suzee.blog.csdn.net/ springboot帮我们做了什么
一个字--自动
通常搭建一个基于spring的web应用我们需要做以下工作
1、pom文件中引入相关jar包包括spring、springmvc、redis、mybaits、log4j、mysql-connector-java 等等相关jar ...
2、配置web.xmlListener配置、Filter配置、Servlet配置、log4j配置、error配置 ...
3、配置数据库连接、配置spring事务
4、配置视图解析器
5、开启注解、自动扫描功能
6、配置完成后部署tomcat、启动调试
......
这些都是Spring boot在背后默默为我们做的工作
那 有没有想过为什么
本文给大家来解读Spring的源码 拆解他的自动配置 一步一步解释为什么Springboot为何那么强大 进入他的细节源码之前 首先关注 ---架构 解读SpringBootApplication
Target(ElementType.TYPE) // 注解的适用范围其中TYPE用于描述类、接口包括包注解类型或enum声明
Retention(RetentionPolicy.RUNTIME) // 注解的生命周期保留到class文件中三个生命周期
Documented // 表明这个注解应该被javadoc记录
Inherited // 子类可以继承该注解
SpringBootConfiguration // 继承了Configuration表示当前是注解类
EnableAutoConfiguration // 开启springboot的注解功能springboot的四大神器之一其借助import的帮助
ComponentScan(excludeFilters { // 扫描路径设置具体使用待确认Filter(type FilterType.CUSTOM, classes TypeExcludeFilter.class),Filter(type FilterType.CUSTOM, classes AutoConfigurationExcludeFilter.class) })
public interface SpringBootApplication {
...
}Configuration
这里的Configuration 对我们来说不陌生它就是 JavaConfig 形式的 Spring Ioc 容器的配置类使用的那个ConfigurationSpringBoot 社区推荐使用基于 JavaConfig 的配置形式所以这里的启动类标注了Configuration 之后本身其实也是一个 IoC 容器的配置类。 举几个简单例子回顾下XML 跟 config 配置方式的区别
表达形式层面 基于 XML 配置的方式是这样 ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsddefault-lazy-inittrue!--bean定义--
/beans而基于 JavaConfig 的配置方式是这样 Configuration
public class MockConfiguration{//bean定义
}任何一个标注了Configuration 的 Java 类定义都是一个 JavaConfig 配置类。
注册 bean 定义层面 基于 XML 的配置形式是这样 bean idmockService class..MockServiceImpl...
/bean而基于 JavaConfig 的配置形式是这样的 Configuration
public class MockConfiguration{Beanpublic MockService mockService(){return new MockServiceImpl();}
}任何一个标注了Bean 的方法其返回值将作为一个 bean 定义注册到 Spring 的 IoC 容器方法名将默认成该 bean 定义的 id。
表达依赖注入关系层面 为了表达 bean 与 bean 之间的依赖关系在 XML 形式中一般是这样 bean idmockService class..MockServiceImplpropery name dependencyService refdependencyService /
/beanbean iddependencyService classDependencyServiceImpl/bean而基于 JavaConfig 的配置形式是这样的 Configuration
public class MockConfiguration{Beanpublic MockService mockService(){return new MockServiceImpl(dependencyService());}Beanpublic DependencyService dependencyService(){return new DependencyServiceImpl();}
}ComponentScan ComponentScan注解用于指定Spring容器扫描组件的基础包路径。它会自动扫描指定包及其子包下的类并将被Component及其派生注解标注的类识别为Spring的组件将其实例化并纳入容器管理。
// 在包com.example中定义了两个被Component注解标记的类UserService和UserRepository// UserService.java
package com.example;import org.springframework.stereotype.Component;Component
public class UserService {// ...
}// UserRepository.java
package com.example;import org.springframework.stereotype.Component;Component
public class UserRepository {// ...
}// AppConfig.java
package com.example;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;Configuration
ComponentScan(com.example) // 指定扫描的基础包路径
public class AppConfig {// 配置其他的Bean
}
ComponentScan的原理可以从源代码的角度来解释。在Spring的源代码中ComponentScan注解被解析为一个Bean扫描器。当Spring容器启动时扫描器会根据指定的包路径将带有Component及其派生注解的类解析为BeanDefinition对象并注册到BeanFactory中。这样Spring容器就知道这些类是组件并可以对其进行实例化和管理。 EnableAutoConfiguration EnableAutoConfiguration注解用于启用Spring Boot的自动配置功能。它会根据项目的依赖和配置自动加载和配置一系列的Spring Bean简化了项目的配置过程。
EnableAutoConfiguration的原理可以从源代码的角度来解释。在Spring Boot的源代码中EnableAutoConfiguration注解被解析为一个自动配置处理器。当Spring Boot应用启动时处理器会根据classpath下的META-INF/spring.factories文件中的配置加载并执行一系列的自动配置类。这些自动配置类根据约定和条件自动创建和配置相应的Bean对象完成项目的自动化配置。
Import(AutoConfigurationImportSelector.class)注解 图中看出 AutoConfigurationImportSelector 继承了 DeferredImportSelector 继承了 ImportSelector
ImportSelector有一个方法为selectImports。
Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {if (!isEnabled(annotationMetadata)) {return NO_IMPORTS;}AutoConfigurationMetadata autoConfigurationMetadata AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);AnnotationAttributes attributes getAttributes(annotationMetadata);ListString configurations getCandidateConfigurations(annotationMetadata,attributes);configurations removeDuplicates(configurations);SetString exclusions getExclusions(annotationMetadata, attributes);checkExcludedClasses(configurations, exclusions);configurations.removeAll(exclusions);configurations filter(configurations, autoConfigurationMetadata);fireAutoConfigurationImportEvents(configurations, exclusions);return StringUtils.toStringArray(configurations);}
AutoConfigurationImportSelector是Spring Boot内部的一个选择器类它会根据项目的依赖和配置选择要自动配置的类。该选择过程是基于条件注解如ConditionalOnClass、ConditionalOnProperty等进行的只有满足条件的自动配置类才会被选择。 AutoConfigurationPackage
// 在包com.example中定义了一个主配置类ApplicationConfig// ApplicationConfig.java
package com.example;import org.springframework.boot.autoconfigure.AutoConfigurationPackage;
import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication
AutoConfigurationPackage // 标注了AutoConfigurationPackage注解
public class ApplicationConfig {// 主配置类的内容// ...
}
当Spring Boot启动时它会扫描并解析主配置类ApplicationConfig。在解析过程中Spring Boot会检测到AutoConfigurationPackage注解并执行相应的处理。
AutoConfigurationPackage注解被解析为一个特殊的Bean定义处理器。处理器会读取主配置类ApplicationConfig的包路径com.example并将该包路径注册到Spring的BeanFactory中。
注册完成后Spring容器会将com.example包及其子包作为组件扫描的范围。这意味着Spring会扫描该包下的所有类并根据条件注解如ConditionalOnClass、ConditionalOnMissingBean等来决定是否自动配置相应的Bean。
通过将主配置类所在的包及其子包作为自动配置的包我们可以确保自动配置类能够正确地扫描和应用到我们的应用程序中。