springmvc自动配置原理

Springboot 这个工具中集成了很多框架,每个框架都有一个xxxAutoConfiguration。

在自动配置jar包中的Spring.facroties中有很多xxxAutoConfiguration对应的就是,每个xxxAutoConfiguration都对应了一个框架的自动配置。

以springmvc框架为例,springmvc框架他对应了一个WebMvcAutoConfiguration

image-20230711203503951

image-20230713092924880

@Configuration    该注解写在哪个类上面 spring容器启动时就会首先创建这个类的对象 然后从这个类上面开始读取注解 同时会调用这个类中所有使用了@Bean注解的方法  将其返回值存放到spring容器中

如果检测到路径中有了Servlet  DispatcherServlet  WebMvcConfigurer(我们导入了springmvc相关的依赖)   @Configuration才会开始工作
否则@Configuration不工作

该类中包含的springmvc四大对象

image-20230711204031326

image-20230711204104823

image-20230711204129917image-20230711204612814

@SpringBootApplication

@SpringBootApplication
public class SpringbootWorkApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootWorkApplication.class, args);
    }
}

主要包含三个注解

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
@SpringBootConfiguration(里面就是@Configuration,标注当前类为配置类,其实只是做了一层封装改了个名字而已)
@EnableAutoConfiguration(开启自动配置)
@ComponentScan(包扫描)

@SpringBootConfiguration

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {
    @AliasFor(
        annotation = Configuration.class
    )
    boolean proxyBeanMethods() default true;
}

该注解写在哪个类上面 spring容器启动时就会首先创建这个类的对象 然后从这个类上面开始读取注解 同时会调用这个类中所有使用了@Bean注解的方法 将其返回值存放到spring容器中

@ComponentScan

@ComponentScan:用于扫描启动类所在目录的包及子包下所有spring注解。
Spring ioc: 创建对象和给属性注入值
----- 创建对象----- 
@Controller
@Service
@Repository
@Component
----- 属性注入----- 
@Value
@Autowired
@Qualier
@Resource
@Configuration
@Bean
Spring aop注解
@Aspect 切面
@Before  前置通知
@After 最终通知
@AfterReturning  后置通知
@AfterThrowing 异常通知
@Around 环绕通知
@Transactional  事务
Springmvc注解 也全部启用
@RestController
@ResponseBody 把Java的数据类型转换成json格式
@RequestBody 把json格式转换成Java数据类型
@PathVariable restful风格传参用 (传单个参数)
@RequestMapping 请求路径和要调用的方法进行对应
@RequestParam ?id=1 表格同步传参 名称对不上时使用
@MapperScan() 扫描数据访问层接口所在的包 给你创建数据访问层对象 
@Valid: Hibernate Validate 他的注解  写在controller方法的入参   

@EnableAutoConfiguration

@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 {};
}

他会检查我们导入了哪些框架的依赖,然后去spring.factories中去找见对应框架的xxAutoConfiguration,执行其中的代码 完成自动配置(其实就是创建这个框架需要的对象)

在这个注解源码中通过@Import({@AutoConfigurationImportSelector.class})这行代码导入了一个AutoConfigurationImportSelector.class类。
在这个类中通过SpringFactoriesLoader类的静态方法loadFactoryNames方法,读取
Springboot自动配置jar包下的META-INF文件夹中的spring.factories中的指定的类名称。

以SpringMvc为例:
配置文件中org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
配置了SpringMvc的配置。

这个类中配置了注解@Configuration代表当前类为一个配置类。
@ConditionOnClass会监测启动器中是否导入了相关的启动器依赖。
@EnableConfigurationProperties中自动加载了括号中配置类的配置(ServerProperties包含网络端口,地址之类的,配置存放在与spring.factories同级目录中xxx-xxx-metadata.json)

如果@ConditionOnClass监测到启动器已经配置相关依赖会实例化这个类中的需要被配置的对象。
当前类中通过spring ioc注解@Bean实例化如
ResourceResolver,RequestMappingHandlerAdapter,ReuqestMappingHandlerMapping,这三个springmvc需要配置的对象的实例化方法(DispatcherServletAutoConfiguration单独引用)。当前配置类中创建的对象会保存到spring容器中,等待需要时使用。 
posted @ 2023-07-13 21:08  YxinHaaa  阅读(21)  评论(0编辑  收藏  举报