# SpringBoot-K1
**Repository Path**: weekends/spring-boot-k1
## Basic Information
- **Project Name**: SpringBoot-K1
- **Description**: Spring 版本注解
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-05-15
- **Last Updated**: 2023-05-17
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
### 版本介绍
#### V1
* 使用`applicationContext.xml`中``标签进行引入路径注入 `Bean`
* 使用``标签进行加载其他配置文件,例如`MySQL、Redis`等配置文件
#### V2
* 使用`applicationContext.xml`中``标签进行引入路径注入`Bean`
* 使用`@Component、@Service、@Controller、@Repository`等注解标识`Bean`,然后通过 `applicationContext.xml`中``
标签进行配置扫描路径
* 使用``标签进行加载其他配置文件,例如`MySQL、Redis`等配置文件,与`v1`版本相同
#### V3
* 使用`@Configuration`注解代替`applicationContext.xml`,`@Bean`进行替代``标签
* `v3.1`版本使用`@ComponentScan`注解代替``
* 使用`@import`注解代替``标签进行加载其他配置文件,例如`MySQL、Redis`等配置文件,并且`@import`注解可以直接导入类进行注入`Bean`(不推荐)
* 使用`@Import`导入的类若实现了`ImportSelector`接口,实现类自身不会注入`Bean`容器,而实现类实现的`selectImports`方法返回的类全路径名称会动态注入到`Bean`容器(相对灵活)
* 使用`@Import`导入的类若实现了`ImportBeanDefinitionRegistrar`接口,实现类自身不会注入`Bean`容器,而实现类实现的`registerBeanDefinitions`方法可以实现动态注入`Bean`容器(更加灵活)
* `@Enable...` 注解主要是限制`@Import`使用四种元注解进行限制作用范围,其是基于`@Import`进行实现
四种元注解:`@Target`, `@Retention`, `@Documented`, `@Inherited`,负责注解其他注解。
* `@Target`:描述注解的使用范围,比如类、接口、字段等
* `@Retention`:描述的注解在什么范围内有效,比如运行时、源文件中、class 文件中
* `@Documented`:生成文档相关
* `@Inherited`:是否子类继承描述的注解
#### V4
* `@Conditional`条件注解,使得注解注入`Bean`更加灵活,与`@Import`导入实现`ImportSelector`、`ImportBeanDefinitionRegistrar`接口一样动态判断是否注入`Bean`
跨域解决方式:
* 在需要跨域访问的类和方法中设置允许跨域访问(如`Spring`中使用`@CrossOrigin`注解,非全局)
* 继承使用`Spring Web`的`CorsFilter`(适用于`Spring MVC`、`Spring Boot`)
* 实现`WebMvcConfigurer`接口(适用于`Spring Boot`)
#### V5
* `@Index`引入注解`spring-context-indexer`依赖自动内嵌`@Component`等注解中,无需单独引用。生成`target/classes/META-INF/spring.components`索引文件,运行时效率提高。
#### SPI
* `SPI`是调用方来制定接口规范,提供给外部来实现,`API`是实现方制定接口规范,提供给外部来调用
* 相关项目`MyDataBase`、`MysqlDataBase`、`OracleDataBase`,需下载并通过`Maven`进行构建(`maven intsall`)
* 通过`MyDataBase`统一定义接口,`MysqlDataBase`和`OracleDataBase`分别实现`Connection`接口
* `MysqlDataBase`和`OracleDataBase`在`resources`目录下创建`META-INFO/services/${MyDataBase项目Connection接口地址}`,赋值为`MysqlDataBase`和`OracleDataBase`实现类地址
* `SpringBoot-K1`项目`spring-api`模块引入`MysqlDataBase`或`OracleDataBase`项目依赖,通过`ServiceLoader`进行加载配置信息,可通过引入不同依赖进行使用不同的实现类