1 依赖部分
一般pom文件都有这个parent
<!-- 所有的springboot的工程都以spring父工程为父工程 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.6.RELEASE</version></parent>
这个是springboot的最基本的依赖,包含如下信息:
- 对各种常用依赖(并非全部)的版本进行了管理
- 引入了很多基本的包了,不需要我们手动去引入
2 @EnableAutoConfiguration注解
可以配合
public static void main(String[] args) {SpringApplication.run(HelloController.class, args);}
就可以启动一个既像jar又像war的springboot项目
非常类似在linux里面运行 java -jar xxxxxx.jar
3 当你继续引入依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>
这时候,SpringBoot根据spring-boot-starter-web这个依赖自动引入对应的jar包,往spring容器里面添加很多bean和配置
4 @ComponentScan注解
当把psvm里面的SpringApplication.run(HelloController.class, args)
与@RestController分开的时候
项目就不行了
原因是:缺少了注解扫描@ComponentScan
配置组件扫描的指令。提供了类似与`<context:component-scan>`标签的作用
通过basePackageClasses或者basePackages属性来指定要扫描的包。
如果没有指定这些属性,那么将从声明这个注解的类所在的包开始,扫描包及子包
在项目使用的时候:一般启动类会放在一个比较浅的包目录中
5@SpringBootApplication注解
- @SpringBootConfiguration 配置类,一般唯一的以示区分
- @EnableAutoConfiguration:开启自动配置
- @ComponentScan:开启注解扫描
6 java形式的配置类
6.1简单的配置属性用@Value
@Configuration
@PropertySource("classpath:jdbc.properties")
public class JdbcConfiguration {@Value("${jdbc.url}")String url;@Beanpublic DataSource dataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl(url);.........return dataSource;}
}
简单类型的数据比如String,Int,Double,Boolean可以用@Value注解
6.2 复杂,万能的配置属性用@ConfigurationProperties
@ConfigurationProperties(prefix = "jdbc")
public class JdbcProperties {private String url;private String driverClassName;// getters 和 setters
}
默认会读取文件名为application.properties
使用3,参数注入
@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfiguration {@Beanpublic DataSource dataSource(JdbcProperties jdbcProperties) {// ...}
}
优点:
Relaxed binding:松散绑定
不严格要求属性文件中的属性名与成员变量名一致。支持驼峰,中划线,下划线等等转换,甚至支持对象引导。比如:user.friend.name,可以把配置文件映射成对象
7spring自动装配的底层原理
比较复杂,说不清楚
第一步,启动类
SpringApplication.run(LeyouItemServiceApplication.class, args)
第二步构造函数
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources){getSpringFactoriesInstances(ApplicationContextInitializer.class)setInitializers(上面的返回值)
}
第三步 417行
private <T> Collection<T> getSpringFactoriesInstances(Class<T> type,Class<?>[] parameterTypes, Object... args) {Set<String> names = new LinkedHashSet<>(SpringFactoriesLoader.loadFactoryNames(type, classLoader));}
第四步
FACTORIES_RESOURCE_LOCATION的值是META-INF/spring.factories
private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {Enumeration<URL> urls = (classLoader != null ?classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
}
第五步
springboot会从依赖包里面找到这个文件
就扫描到这个文件里面的XXXXXXAutoConfiguration配置类文件
第六步 配置文件读取到spring里面,具体有很多细节,
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass
@ConditionalOnMissingBean
@EnableConfigurationProperties
第七步总结
1引入starter
2修改application.yml
3有时候还可以自动写@Configuration和@Bean
8 配置拦截器
自定义一些MVC配置(包括:拦截器,格式化器, 视图控制器、消息转换器 等等),你应该让一个类实现WebMvcConfigurer
,并且添加@Configuration
注解
@Component
public class MyInterceptor implements HandlerInterceptor {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(myInterceptor).addPathPatterns("/**");}
}
9 一些需要查看的工具手册
SpringBoot启动器.txt
SpringBoot全局属性.md