文章目录
认识springboot框架
- 解决ssm框架的繁琐配置文件,其实是spring框架的深入的应用,把ssm框架中的习惯性的配置信息作为了默认的预配置。
- 是一个spring技术的全家桶。整个web开发的技术栈基本都做了支持。
springboot简单原理
- 创建的springboot项目,是从spring-boot-starter-parent父工程继承来的。(父工程统一了各种依赖的版本)
- springboot官方提供了各种组件的启动器starter。web启动器,即把web开发需要用到的各种依赖做集成.(jar,配置文件),
- 比如web启动器:
- web开发需要依赖springMVC,spring-web,spring的核心包,jackson等各种jar包;
- web开发的默认配置类:WebMvcAutoConfiguration类中做了springMVC相关的预配置bean,比如RequestMappingHandlerMapping,静态资源,视图映射,json消息转换器等各种web层的bean对象。
- 在第三方框架,要往springboot框架中集成使用,需要提供自定义启动器。比如:Druid-spring-boot-starter,mybatis-spring-boot-starter。
springboot的预配置类(官方启动器的预配置都在spring-boot-autoconfiguration/META-INF/spring.factories中key为org.springframework.boot.autoconfigure.EnableAutoConfiguration),当加入对应的starter后,对应的配置类生效。第三方的启动器类的jar包一般都带有自定义的配置类。
springboot的启动器:(starter):配置了某个技术栈需要用到各种依赖jar包,以及配置类信息。
认识springboot的目录结构
- src/main/java:放java类
- src/main/resources/static:放静态资源,js,css,图片
- src/main/resources/templates:放视图模板(html中使用模板引擎的语法,比如jsp,比如freemarker,比如thymeleaf)
- application.properties:默认配置文件(配置服务器端口,部署路径,tomcat优化信息,数据库url,username,password等信息)
启动类认识
-
@SpringBootApplication
- @SpringBootConfiguration:表明该类是一个spring风格的配置类
- @ComponentScan:开启包扫描,具体的扫描路径由EnableAutoConfiguration来做配置。
- @EnableAutoConfiguration
- @AutoConfigurationPackage:配置包扫描路径,获取当前启动类的包名作为扫描范围。
- @Import({AutoConfigurationImportSelector.class}):通过配置类选择器,去所有jar包的META-INFO/spring.factories文件中查找key为org.springframework.boot.autoconfigure.EnableAutoConfiguration的值,这些值统统都是候选的配置类。
-
SpringApplication.run(Application.class, args)
- 初始化spring容器,加载配置类(当前类)
- 确定当前项目类型:(servlet项目)
- 错误分析器:初始化21个内置的错误分析器对象,把框架运行中产生的异常信息输出为可阅读的信息。
- Banner: Banner printedBanner = this.printBanner(environment);
- 容器初始化: context = this.createApplicationContext()
自定义的配置类放在启动类的同级或下级包下能生效;放在上级包不生效。是因为自动配置的包扫描路径是启动类的包名。
相关的加载配置
@PropertySource("classpath:jdbc.properties") // 加载自定义properties配置文件
@ImportResource("classpath:spring.xml") // 加载自定义的spring风格的xml配置文件
@Import(MyAnnotationConfig.class) // 加载自定义的spring风格的配置类
这些注解是写在配置类中的,任何一个配置类中都可以。
配置信息以Application开头的文件,会自动加载。
-
加载自定义的properties文件
- 通过PropertySource指定自定义文件的位置。
- 在任何一个bean对象中使用@Value注解获取properties文件中的数据。
- 自定义的配置信息可以放在默认的application.properties或者自定义的properties都可以,无非取数据可以通过@Value取单个数据或通过@ConfigurationProperties注解指定前缀批量获取数据。
-
默认的配置文件两种格式:yml和properties
-
properties中:集合:逗号分隔多个数据,数值:直接数字,map:key=value
-
yml:yml文件的优先级低于properties文件,写法是以缩进表示层级关系。大小写敏感。冒号后面的数据必须加空格。
-
-
配置文件可以放的位置:
-
项目下/config
-
项目下
-
项目下/resources/config
-
项目下/resources
-
部署springboot项目
- 打jar包,通过java -jar指令运行jar包。
- 打war包,把war放在服务器下的指定应用服务器tomcat,weblogic目录下。
- 指定war
- 指定war包名
- 把自带的tomcat启动器的scope指定为provided,不参与打包
- 从SpringBootServletInitializer接口重写configure方法,指定程序的入口。
<groupId>com.javasm</groupId>
<artifactId>0827boot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<build>
<finalName>0827boot</finalName>
<plugins>
<!--对springboot项目打jar使用,与maven默认的打包有区别-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class);
}
public static void main(String[] args)
{
SpringApplication app = new SpringApplication(Application.class);
app.setBannerMode(Banner.Mode.OFF);
app.run(args);
}
}
WebMvcConfigurer接口进行springMVC扩展使用
- addCorsMappings方法添加的跨域支持,在拦截器中需要对预检请求放行。
@Component
public class MyWebMvcConfigurer implements WebMvcConfigurer {
//配置视图映射,把各个处理器中用来转页面的接口统一放在此处做映射
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/gh").setViewName("hello");
registry.addViewController("/ul").setViewName("user/userlist");
// registry.addViewController("/user/gh").setViewName("hello");
}
//格式转换器,把前端传递的参数,转成我们指定的格式,日期转换,对全局生效
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new MyDateConverter());
}
//拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/user/**","/role/**");
}
//配置跨域支持
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedHeaders("*").allowedMethods("*").allowedOrigins("*").allowCredentials(true);
}
}