1.springBoot特性
Spring Boot将很多魔法带入了Spring应用程序的开发之中,其中最重要的是以下四个核心。
自动配置:针对很多Spring应用程序常见的应用功能,Spring Boot能自动提供相关配置。
起步依赖:告诉Spring Boot需要什么功能,它就能引入需要的库。
命令行界面:这是Spring Boot的可选特性,借此你只需写代码就能完成完整的应用程序,
无需传统项目构建。
Actuator:让你能够深入运行中的Spring Boot应用程序,一探究竟。
2. springBoot的项目构建
1. 新建一个maven项目
2. 配置pom文件
springboot的pom文件,首先要配置parent
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.3.RELEASE</version>
</parent>
然后添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
3. 配置application.properties
server.port=8080
4. 编写启动类
@SpringBootApplication
@MapperScan("com.wzz.sb")
public class Main {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(Main.class, args);
}
}
注意:启动类要放在项目包的最外层,因为他会自动扫描他之下的所有包和类
3. 一部分说明
1. springBoot启动方式
Spring Boot可以把Web应用程序变为可自执行的JAR文件,不用部署到传统Java应用服务器里就能在命令行里运行。
Spring Boot在应用程序里嵌入了一个Servlet容器(Tomcat、Jetty或Undertow),以此实现这一功能。
此种方式可以在配置文件中配置tomcat的端口。
2. application.properties配置文件的说明
springBoot支持两种配置文件,一种是properties配置,一中yml配置,具体百度。
配置端口号例如:
server.port=8888
2. @SpringBootApplication注解的说明
实际上, @SpringBootApplication 将三个有用的注解组合在了一起。
Spring的 @Configuration :标明该类使用Spring基于Java的配置。虽然本书不会写太多配置,但我们会更倾向于使用基于Java而不是XML的配置。
Spring的 @ComponentScan :启用组件扫描,这样你写的Web控制器类和其他组件才能被自动发现并注册为Spring应用程序上下文里的Bean。本章稍后会写一个简单Spring MVC控制器,使用 @Controller 进行注解,这样组件扫描才能找到它。
Spring Boot 的 @EnableAutoConfiguration: 这 个 不 起 眼 的 小 注 解 也 可 以 称 为@Abracadabra,就是这一行配置开启了Spring Boot自动配置的魔力,让你不用再写成篇的配置了。
4. 配置方式
1. 配置参数
Spring Boot应用程序有多种设置途径。Spring Boot能从多种属性源获得属性,包括如下几处。
(1) 命令行参数
(2) java:comp/env 里的JNDI属性
(3) JVM系统属性
(4) 操作系统环境变量
50 第 3章 自定义配置
(5) 随机生成的带 random.* 前缀的属性(在设置其他属性时,可以引用它们,比如 ${random.long} )
(6) 应用程序以外的application.properties或者appliaction.yml文件
(7) 打包在应用程序内的application.properties或者appliaction.yml文件
(8) 通过 @PropertySource 标注的属性源
(9) 默认属性
这个列表按照优先级排序,也就是说,任何在高优先级属性源里设置的属性都会覆盖低优先级的相同属性。
2. 使用Bean配置
在配置文件中配置如:
com.bean.name = xiaoming
com.bean.age = 18
然后编写类
@Component
@ConfigurationProperties(prefix = "com.bean")
public class MyBean {
private String name;
private String age;
public MyBean() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
3. 使用profile
1. properties文件
如果你正在使用application.properties,可以创建额外的属性文件,遵循application-{profile}.properties这种命名格式,这样就能提供特定于Profile的属性了
与此同时,那些并不特定于哪个Profile或者保持默认值(以防万一有哪个特定于Profile的配置不指定这个值)的属性,可以继续放在application.properties里
2. yml文件
如果使用YAML来配置属性,则可以遵循与配置文件相同的命名规范,即创建application-{profile}.yml这样的YAML文件,并将与Profile无关的属性继续放在application.yml里
还可以如下所示
logging:
level:
root: INFO
---
spring:
profiles: development
logging:
level:
root: DEBUG
---
spring:
profiles: production
logging:
path: /tmp/
file: BookWorm.log
level:
root: WARN
这个application.yml文件分为三个部分,使用一组三个连字符( --- )作为分隔符。第二段和第三段分别为 spring.profiles 指定了一个值,这个值表示该部分配置应该应用在哪
个 Profile 里
3. 激活
$ java -jar readinglist-0.0.1-SNAPSHOT.jar --spring.profiles.active=production
或者在application.properties中设置spring.profiles.active=peer2
或者在yml中,
spring:
profiles:
active: production
4. web应用
需要引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
然后写controller即可
5. 过滤器
1. 基本使用
只要类实现Filter接口,然后变成spring的bean即可,比如加上注解@Component("myFilter")
2. 多个filter设置顺序
如下所示:
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean someFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new MyFilter());
registration.addUrlPatterns("/*");
registration.addInitParameter("paramName", "paramValue");
registration.setName("sessionFilter");
registration.setOrder(1);
return registration;
}
@Bean
public FilterRegistrationBean someFilterRegistration2() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new MyFilter2());
registration.addUrlPatterns("/*");
registration.addInitParameter("paramName", "paramValue");
registration.setName("sessionFilter2");
registration.setOrder(0);
return registration;
}
}
可以设置Order字段,来控制顺序,order越小,越先执行。但是注意,filter会在项目启动时候初始化,初始化顺序和这个字段无关
3. 其他方式
@WebFilter方式,待研究
6. 拦截器,静态资源,页面跳转
新建配置类,继承WebMvcConfigurerAdapter,并且加上@Configuration注解
1. 拦截器
新建拦截器类,实现HandlerInterceptor接口,然后重新WebMvcConfigurerAdapter的addInterceptors方法,例如
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
super.addInterceptors(registry);
}
具体执行顺序,按照添加顺序
2. 静态资源
重新WebMvcConfigurerAdapter的addResourceHandlers的方法,如
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static").addResourceLocations("classpath:/static");
super.addResourceHandlers(registry);
}
如果静态资源放在webapp下,那么addResourceLocations("/static/"),注意路径,不能写classpath
3. 页面跳转
addViewControllersaddViewControllers的方法,如
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("").setViewName("");
super.addViewControllers(registry);
}
其他此类的方法,可以自己再看看
7. 整合mybatis
1. 数据源配置
spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/sb?useUnicode=true&characterEncoding=utf-8
spring.datasource.username = root
spring.datasource.password = ******
2. mybatis配置
mybatis.mapper-locations=classpath:sql/*.xml
需要在启动类上面,加上mybatis的扫描路径@MapperScan("com.wzz.sb"),配置dao的路径
8. 集成测试
@RunWith(SpringJUnit4ClassRunner.class)// SpringJUnit支持,由此引入Spring-Test框架支持!
@SpringBootTest(classes = Main.class)// 指定我们SpringBoot工程的Application启动类
public class Tests {
@Autowired
UserDao userDao;
@Test
public void test() {
userDao.queryAll();
}
}
9. 打包部署
1. 打war包
新建类
public class ReadingListServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// TODO Auto-generated method stub
return builder.sources(Main.class);
}
}
10. 跨域配置
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true); // 允许cookies跨域
config.addAllowedOrigin("*");// 允许向该服务器提交请求的URI,*表示全部允许。。这里尽量限制来源域,比如http://xxxx:8080 ,以降低安全风险。。
config.addAllowedHeader("*");// 允许访问的头信息,*表示全部
config.setMaxAge(18000L);// 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了
config.addAllowedMethod("*");// 允许提交请求的方法,*表示全部允许,也可以单独设置GET、PUT等
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}
11. 返回json格式转换配置
@Configuration
public class DateConverConfig {
/**
* 将时间戳转为为时间格式
* @return
*/
@Bean
public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper mapper = new ObjectMapper();
//日期格式转换
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
//Long类型转String类型
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
mapper.registerModule(simpleModule);
converter.setObjectMapper(mapper);
return converter;
}
}