Spring Boot 中的 Starter
Spring核心
- Bean:Bean包装的是一个Object,说Bean可以理解有数据的对象,已经被实例化的某个类的对象。
- IOC/Context:IOC是一个容器,是存放管理Bean的地方,可以看成是Beans关系的一个集合。Context组件就是对IOC 容器的实现。
- Core:Core组件提供许多核心组件,其中定义了资源访问方式。将资源都抽象为一个借口Resource。
个人理解:IOC是Spring的一个关键点,这是他给出的盒子,被装进这个盒子的的Java类被IOC实例化后就叫Bean。IOC的作用就是把Java的某个类通过自身转化,得到一个可用的实例化对象。
注解的理解
- @Configuration:表示此类为配置类,代替XML文件,其中包含一个或多个@Bean注解的方法。
- @Bean:与@Configuration搭配使用,用于方法头部。此时,方法会产生一个Bean对象并存入IOC。
- @ConfigurationProperties(perfix="xxx"):类型安全的属性注入。定义于配置文件application.properties中前缀为xxx的属性注入到类对应属性上。
- @EnableConfigurationProperties(xxx.class):@ConfigurationProperties使得某个类的属性被注入了一些值,而这个注解则是在让这个类对应的Bean存入IOC。也可以说是让之前@ConfigurationProperties注解生效,因为这个注解虽然让类得到了值但是并没有相应的实例化对象。与之作用相同的是@Component等,但是用的地方不一样。
- @ConditionalOnClass(xxx.class):表示项目当前classPath下存在xxx类时,后面配置才生效
- @SpringBootConfiguration:Spring Boot项目启动类上都有一个。是@Configuration的派生类(不同在于@Configuration属于Spring,而它属于SpringBoot)用在某类头部表示此类是个配置类。
- @EnableAutoConfiguration:@AutoConfigurationPackage和@Import(AutoConfigurationImportSelector.class)的组合注解,表示启用Spring程序上下文的自动配置,会去读取spring.factories文件,这个文件定义了需要加载的自动化配置类。
Starter
Starter的理解
starter可以当成是一个maven依赖组,引入这个组名就引入了所有的依赖。
比如常见的Starter:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
引入这个依赖就可以满足我们日常Web接口开发,否则需要引入spring-web、spring-webmvc、spring-aop等来作为支持。也就是说一个Starter就是一系列的已做好配置文件的依赖配置。
首次建立自己的Starter
先建立一个普通的Maven项目,然后添加依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
</dependencies>
<!--打包插件-->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerVersion>1.8</compilerVersion>
</configuration>
</plugin>
</plugins>
</build>
配置好了依赖,创建一个IMProperties,为了接受配置文件注入的值
@ConfigurationProperties(prefix = "akira")
public class IMProperties {
private static final String DEFAULT_NAME = "本秋明";
private String name = DEFAULT_NAME;
public static String getDefaultName() {
return DEFAULT_NAME;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
对于DEFAULT_NAME:static修饰表示它是静态属性,所有对象共享一个值。final修饰表示它是一个属性值为常量。
定义一个IMService,再在其中写一个IM方法:
public class IMService {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String IM(){
return "I'm " + name + ".";
}
}
接下来配置AutoConfiguration类,也就是就是我们写逻辑的地方:
@Configuration
@EnableConfigurationProperties(IMProperties.class)
@ConditionalOnClass(IMProperties.class)
public class AutoConfiguration {
@Autowired
IMProperties IMProperties;
@Bean
IMService helloService(){
IMService IMService = new IMService();
IMService.setName(IMProperties.getName());
return IMService;
}
}
至此,所有类就已经配置完成了,但还需要一个spring.factories文件。Spring Boot项目启动类都含有一个@SpringBootApplication注解,注解定义:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM,
classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
}
这是一个组合注解,其中@EnableAutoConfiguration表示启用 Spring 应用程序上下文的自动配置,该注解会自动导入一个名为 AutoConfigurationImportSelector 的类,而这个类会去读取一个名为 spring.factories 的文件, spring.factories 中则定义需要加载的自动化配置类。所以在Maven 项目的 resources/META-INF/spring.factories(缺就新建)写入:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=yuri.AutoConfiguration
= 后填的是AutoConfiguration类的路径。此外,这个spring.factories文件可以通过注解的方式代替。
至此,所有工作完成。点击右边的 Maven Project ,然后选择 Lifecycle 中的 install安装,然后就能在本地仓库里看到你的自己的依赖了。
使用自建Starter
新建一个SpringBoot项目,添加自建Starter的依赖
groupId和artifactId,version一般默认是1.0-SNAPSHOT(Idea未修改的话),这里顺便讲一下groupId和artifactId的含义:
groupId和artifactId统称为坐标,保证了项目的唯一性。
groupId是项目组织的唯一标识符,分为多段。第一段为域,比如:org表示非营利组织、com表示商业组织、cn表示中国等。第二段则公司名称。
artifactId是项目唯一标示符,对应项目根路径名称。
如果你忘记了你自己Starter的Maven项目的这些属性时,你可以去你的仓库中找寻这些信息
比如我的groupId是yuri,artifactId是Starter(一般artifactId对应项目名称,但我这里不是)version是1.0-SNAPSHOT。
当依赖成功引入后,建立一个test作为我们的测试类
运行测试类得到输出
此时我们并没有往application.properties中添加属性值,所以此时输出的name是DEFAULT_NAME。现在我们向application.properties添加一句akira.name=萧瑟,则输出为:
如果上一个中文没有出现乱码,但配置application.properties后出现中文乱码,则是application.properties没有设置UTF-8编码,修改设置
还有更好的办法就是用 yaml配置文件。
参考资料:SpringBoot教程@江南一点雨