在springboot项目中的启动类有以下配置:
主程序类的标志:
- @SpringBootApplication= @Configuration+@EnableAutoconfiguration+@ComponentScan
- @Configuration:经常与@Bean 组合使用,使用这两个注解就可以创建一个简单的Spring 配置类, 可以用来替代相应的XML 配置文件。
- @EnableAutoConfiguration :能够自动配置Spring 的上下文,猜测和配置用户想要的Bean类。
- @ComponentScan : 会自动扫描指定包下的全部标有@Component 的类, 并注册成Bean,包括子注解@Service 、@Repository 、@Controller。这些Bean 一般是结合@Autowired 构造函数来注入。)
- @AutoConfigurationPackage:自动配置包:
控制器中的类:
@RestController = @Controller + @ResponseBody任何一个标注了@Configuration的Java类定义都是一个JavaConfig配置类。
<beans>
<! -- bean定义 -->
</beans>
而基于JavaConfig的配置方式是这样的:
@Configuration
public class MockConfiguration{
// bean定义
}
任何一个标注了 @ Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器,方法名将默认成为该bean定义的id。
- 1. @Component Scan
@Component Scan对应XML配置形式中的<context:component-scan>元素,用于配合一些元信息Java Annotation,比如@Component和@Repository等,将标注了这些元信息Annotation的bean定义类批量采集到Spring的IoC容器中。
- 2. @PropertySource 与 @PropertySources
@PropertySource用于从某些地方加载*.properties文件内容,并将其中的属性加载到IoC容器中,便于填充一些bean定义属性的占位符(placeholder),当然,这需要PropertySourcesPlaceholderConfigurer的配合。
@Configuration
@PropertySource("classpath:1.properties")
@PropertySource("classpath:2.properties")
@PropertySource("...")
public class XConfiguration{
...
}
@PropertySources(
@PropertySource("classpath:1.properties"),
@PropertySource("classpath:2.properties"),
...
})
public class XConfiguration{
...
}
- @Import 只负责引入JavaConfig形式定义的IoC容器配置,如果有一些遗留的配置或者遗留系统需要以XML形式来配置(比如dubbo框架),
- 通 过 @ImportResource将它们一起合并到当前JavaConfig配置的容器中:
@Configuration
@Import(MockConfiguration.class)
@ImportResource("...")
public class XConfiguration {
...
}
- @SpringBootApplication是一个“三体”结构,实际上它是一个复合Annotation:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Configuration
@EnableAutoConfiguration
@Component Scan
public @interface SpringBootApplication{
...
}
SpringBoot启动类拆分为两个独立的Java类,整个形势就明朗了:
@Configuration
@EnableAutoConfiguration
@Component Scan
public class DemoConfiguration {
@Bean
public Controller controller() {
return new Controller();
}
}
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoConfiguration.class, args);
}
}
所以,启动类DemoApplication其实就是一个标准的Standalone类型Java程序的main函数启动类,没有什么特殊的。
- @EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器,@EnableAutoConfiguration作为一个复合Annotation,其自身定义关键信息如下:
-
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(EnableAutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration { ... }
借助于SpringFactoriesLoader的支持,@EnableAutoConfiguration可以“智能”地自动配置功效才得以大功告成!
那么什么是springFactoriesLoader
其主要功能就是从指定的配置文件META-INF/spring.factories加载配置,spring.factories是一个典型的java properties文件,配置的格式为Key = Value形式,只不过Key和Value都是Java类型的完整类名(Fully qualified name)example.MyService=example.MyServiceImpl1, example.MyServiceImpl2
在@EnableAutoConfiguration的场景中,它更多是提供了一种配置查找的功能支持,即根据@EnableAutoConfiguration的完整类名org.springframework.boot.autoconfigure.EnableAutoConfiguration作为查找的Key,获取对应的一组@Configuration类:
@EnableAutoConfiguration自动配置的魔法其实就变成了:从classpath中搜寻所有META-INF/spring.factories配置文件, 并将其中org.spring-framework.boot.autoconfigure.EnableAutoConfiguration对应的配置项通过反射(Java Reflection)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类, 然后汇总为一个并加载到IoC容器。
- @Component Scan 的功能其实就是自动扫描并加载符合条件的组件或bean定义,最终将这些bean定义加载到容器中。
加载bean定义到Spring的IoC容器,我们可以手工单个注册,不一定非要通过批量的自动扫描完成,所以说@Component Scan是可有可无的。
@ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个个指定
松散绑定(松散语法) 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持
- 1、properties配置文件在idea中默认utf-8可能会乱码
- 2、 @PropertySource&@ImportResource&@Bean
@PropertySource:加载指定的配置文件;
@PropertySource(value="classpath:person.properties")
@ImportResource:导入spring的配置文件,让配置文件加载到让其生效
不推荐使用:
@ImportResource(locations = {"classpath:beans.xml"}) 导入Spring的配置文件让其生效
<?xml version="1.0" encoding="UTF‐8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema‐instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring‐beans.xsd">
<bean id="helloService" class="com.atguigu.springboot.service.HelloService">
</bean>
</beans>
推荐使用:给容器中添加组件:@Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件
在配置文件中用<bean><bean/>标签添加组件 * */
@Configuration
public class MyAppConfig {
//将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
@Bean
public HelloService helloService02(){
System.out.println("配置类@Bean给容器中添加组件了...");
return new HelloService();
} }
配置文件加载顺序:(互不配置)
springboot启动会扫描以下的位置的application.properties或者application.yml文件
-file:./config/
-file:./
-classpath:/config/
-classpath:/
以上是按照优先级从高到低顺序被加载,所有的位置的都会被加载,高优先级覆盖低优先级
可以通过spring.config.location来改变默认的文件的配置
项目打包后可以通过命令行参数的形式,启动项目时指定配置文件的新的位置指定的配置文件和默认的共同生效
以上便是springboot中的配置文件形式,下篇深入介绍他和yml的结合使用