官网:http://www.springsource.org/
下载:http://repo.spring.io/release/org/springframework/boot/
Eclipse的Spring插件:
springsource-tool-suite-3.9.x.RELEASE-e4.x.x-updatesite
或者直接下载集成插件的Eclipse:(https://spring.io/tools3/sts/legacy)
spring-tool-suite-3.9.x.RELEASE-e4.x.x-win32-x86_64
一、Spring4+和Spring boot都推荐使用java配置的方式(零配置)
Java配置方式主要是通过 @Configuration 和 @Bean 这两个注解实现的:
1、@Configuration 作用于类上,相当于一个xml配置文件,可理解为spring的xml里面的标签;
2、@Bean 作用于方法上,相当于xml配置中的;
3、@ComponentScan(basePackages=“com.cssl”) 扫描包
4、@PropertySource(value=“classpath:mysql.properties”)|@Value读取配置文件
5、@EnableTransactionManagement 开启事务支持
二、SpringBoot入门
SpringBoot2 基于 Java 8,支持 Java 9,Maven 3.2+
SpringBoot2 针对Quartz调度器提供了支持。
SpringBoot2 基于Spring5构建,本次SpringBoot的升级,同时也升级了部分其依赖的第三方组件
主要的几个有:
Tomcat 8.5
Flyway 5 数据库版本控制 svn|git
Hibernate 5.2 ORM框架
Thymeleaf 3 模板引擎
对响应式应用更好的支持
SpringBoot:解决Java开发繁多的配置,低下的开发效率、复杂的部署流程及很难集成第三方技术
优点:
1、快速构建项目
2、对主流开发框架无配置集成
3、独立运行,无需依赖外部容器
4、极大提高开发、部署效率
5、与云计算等的天然集成
6、SpringCloud天然搭档
Maven配置:
1、设置spring boot的parent:包含了大量默认的配置,大大简化了我们的开发
org.springframework.boot
spring-boot-starter-parent
2.x.x.RELEASE
2.x.x必须jdk1.8+
<java.version>1.8</java.version>
2、导入spring boot的支持:核心SpringBoot starter,包括自动配置支持,日志和YAML
(可选:可以通过spring-boot-starter-web传递依赖)
org.springframework.boot
spring-boot-starter
3、导入spring boot的web支持:包括Tomcat、spring-webmvc,还自动依赖spring-boot-starter
org.springframework.boot
spring-boot-starter-web
4、添加Spring boot的插件:(可选:可以通过插件启动程序)
org.springframework.boot
spring-boot-maven-plugin
5、添加打war包插件:(可选:可以将项目打成war包发布)
maven-war-plugin
3.0.0
6、添加Spring boot对jsp|jstl的支持:(可选)
由于Spring boot使用的内嵌的tomcat,而内嵌的tomcat是不支持jsp页面的,需要导入额外的包才能解决
@SpringBootTest:SpringBoot的测试注解
@SpringBootApplication:SpringBoot的核心注解,主要目的是开启自动配置,扫描本包及其子包bean
@ConditionalOnXxx:条件注解
@SpringBootApplication注解组合了以下注解:
1、@SpringBootConfiguration:默认扫描@SpringBootApplication所在类的同级目录以及它的子目录
2、@EnableAutoConfiguration:启用自动配置,该注解会使Spring Boot根据项目中依赖的jar包自动配置项目的配置项,如:我们添加了spring-boot-starter-web的依赖,项目就会引入SpringMVC的依赖,Spring Boot就会自动配置tomcat和SpringMVC
3、@ComponentScan:扫描包
如果想关闭某个自动配置:
@SpringBootApplication(exclude=RedisAutoConfiguration.class)
启动SpringBoot:SpringApplication.run(MainApplication.class, args);
注意:主类必须放在包中,不能直接放java目录,否则异常
自定义Banner:
1、拷贝生成的字符到一个文本文件中,并且将该文件命名为banner.txt
2、将banner.txt拷贝到项目的resources目录中
3、如果不想看到任何的banner,也是可以将其关闭的:setBannerMode(Banner.Mode.OFF)
全局配置文件:
Spring Boot项目使用一个全局的配置文件application.properties或者是application.yml,在resources目录下
访问静态资源:进入规则为 /
如果进入SpringMVC的规则为/时,Spring Boot的默认静态资源的路径为:
classpath:/META-INF/resources/,classpath:/resources/,
classpath:/static/,classpath:/public/
也可以通过Spring指定:
spring.mvc.static-path-pattern=/**
spring.resources.static-locations=classpath:/templates/,classpath:/META-NF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
注意:
1、指定后默认的就失效了
2、配置了templates则可以直接访问模板文件,否则只能通过controller转发
3、templates下的模板也可以链接static下的css、js等静态资源,反之也可以
4、无论什么时候都不能重定向访问模板文件,因为重定向不使用模板视图解析器
5、没有配置视图解析有时候报post请求不支持?(bug)
热部署(修改代码自动部署)
导入依赖
org.springframework.boot
spring-boot-devtools
修改idea设置(见设置文档)
三、SpringBoot和Mybatis整合的两种方式:
第一种:使用mybatis-spring整合的方式,也就是我们传统的方式
优点:我们可以手动控制MyBatis的各种配置
导入依赖
org.mybatis
mybatis
3.5.1
org.mybatis
mybatis-spring
2.0.1
使用lombok:(jdk9以上版本需要1.16.21以上版本)
org.projectlombok
lombok
1.16.20
1、创建Mybatis的配置类:
@Configuration
public class MyBatisConfiger {
@Autowired
private Environment env;
@Bean
public DataSource dataSource() {
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName(env.getProperty("jdbc.driver"));
ds.setUrl(env.getProperty("jdbc.url"));
ds.setUsername(env.getProperty("jdbc.username"));
ds.setPassword(env.getProperty("jdbc.password"));
return ds;
}
@Bean
@ConditionalOnMissingBean
public SqlSessionFactoryBean sqlSessionFactory(){
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
factory.setDataSource(dataSource);
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource resource = resolver.getResource("classpath:mybatis-config.xml");
factory.setConfigLocation(resource);
return factory;
}
}
2、创建Mapper接口的扫描类MapperScannerConfig:
@Configuration
@AutoConfigureAfter(MyBatisConfiger.class)
public class MapperScannerConfig {
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer mapper = new MapperScannerConfigurer();
mapper.setBasePackage(“com.example.dao”);
return mapper;
}
}
或者直接使用注解扫描dao接口产生代理:@MapperScan(basePackages=“com.example.dao”)
事务管理:
在Spring Boot中推荐使用注解来声明事务
@EnableTransactionManagement
@Transactional
首先需要导入依赖:
org.springframework.boot
spring-boot-starter-jdbc
当引入jdbc依赖之后,SpringBoot会自动默认分别注入DataSourceTransactionManager或JpaTransactionManager,所以我们不需要任何额外配置就可以用@Transactional注解进行事务的使用
第二种:使用mybatis官方提供的Spring Boot整合包实现,地址:https://github.com/mybatis/spring-boot-starter
导入依赖
(自动导入mybatis、mybatis-spring、spring-jdbc、spring-tx等包)
(自动读取数据库配置产生DataSource(HikariDataSource)、SqlSessionFactory及事务管理类)
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.0.x
yml:
mybatis:
config-location: classpath:mybatis-config.xml
或者:
mybatis:
type-aliases-package: com.cssl.pojo
configuration:
auto-mapping-behavior: full
use-generated-keys: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#log-impl: org.apache.ibatis.logging.log4j.Log4jImpl:这个不打印查询结果
DAO接口产生代理只需要扫描:@MapperScan(basePackages=“com.cssl.dao”)或者在接口上用@Mapper
注意:
新版本2.1+默认使用数据库驱动8.0+
1、driver:com.mysql.cj.jdbc.Driver
2、url要加时区:jdbc:mysql:///mydb?serverTimezone=UTC
四、分页插件PageHelper的使用:
方式一:使用原生的PageHelper
com.github.pagehelper
pagehelper
5.1.x|4.1.x
Java配置代码:
@Bean
public PageInterceptor pageInterceptor(SqlSessionFactoryBean factory){
//分页插件5.x
Properties properties = new Properties();
properties.setProperty(“helperDialect”, “mysql”);
properties.setProperty(“reasonable”, “true”);
properties.setProperty(“pageSizeZero”, “true”);
PageInterceptor interceptor = new PageInterceptor();
interceptor.setProperties(properties);
//添加插件
factory.setPlugins(new Interceptor[]{interceptor});
return interceptor;
}
@Bean
public PageHelper pageHelper(SqlSessionFactoryBean factory){
//分页插件4.x
PageHelper pageHelper = new PageHelper();
Properties properties = new Properties();
pageHelper.setProperties(properties);
//添加插件
factory.setPlugins(new Interceptor[]{pageHelper});
return pageHelper;
}
方式二:使用PageHelper的starter(PageHelper5.1.8)
com.github.pagehelper
pagehelper-spring-boot-starter
[1.2.5,)
#pagehelper分页插件配置(不是必须)
pagehelper:
helperDialect: mysql
reasonable: true
pageSizeZero: true
五、加密
SpringBoot资源文件中的内容通常情况下是明文显示,安全性比较低。打开application.properties或application.yml,mysql登陆密码,redis登陆密码以及第三方的密钥等等一览无余,这里介绍一个加解密组件,提高属性配置的安全性。
jasypt由一个国外大神写了一个springboot下的工具包
。
1、首先引入jar
com.github.ulisesbocchio
jasypt-spring-boot-starter
2.0.0
如果用2.1.0必须导全三个(没有传递依赖,2.1.1版本不兼容)
com.github.ulisesbocchio
jasypt-spring-boot-starter
2.1.0
2、application.yml配置文件中增加如下内容(加解密时使用)
#jasypt加密的密匙(这种方式也有安全隐患)
jasypt:
encryptor:
password: EbfYkitulv73I2
#在JVM启动参数中设置
-Djasypt.encryptor.password=EbfYkitulv73I2
3、在测试用例中生成加密后的秘钥
org.springframework.boot
spring-boot-starter-test
test
@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
public class JTest {
@Autowired
StringEncryptor encryptor;
@Test
public void getPass() {
String url = encryptor.encrypt("jdbc:mysql:///mydb2?serverTimezone=GMT");
String name = encryptor.encrypt("你的数据库用户名");
String password = encryptor.encrypt("你的数据库密码");
System.out.println(url);
System.out.println(name);
System.out.println(password);
}
}
GBQBRUVmTEqu/zpH33M639Kj0IqXVDMoWahGp70z9vPHH3eASU3ZoFff/80gfZwC
1JLSxqte89sAZs9El1u0Pg==
otVXGXBVUrebggKOgEKQpA==
4、将上面生成的name和password替换配置文件中的数据库账户和密码,替换后如下:
spring:
#数据库相关配置
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: ENC(GBQBRUVmTEqu/zpH33M639Kj0IqXVDMoWahGp70z9vPHH3eASU3ZoFff/80gfZwC)
username: ENC(1JLSxqte89sAZs9El1u0Pg==)
password: ENC(otVXGXBVUrebggKOgEKQpA==)
六、Web开发的自动配置类:org.springframework.boot.autoconfigure.web.WebMvcConfigurer
1、Spring Boot添加MVC配置:实现接口WebMvcConfigurer
@Component
public class MyMvcConfig implements WebMvcConfigurer {
//添加拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
HandlerInterceptor hi = new HandlerInterceptor() {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle...");
return true;
}
};
registry.addInterceptor(hi).addPathPatterns("/**");
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
//没有添加默认也是这个视图解析器
//默认配置:org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration
registry.viewResolver(new InternalResourceViewResolver("/", ".jsp"));
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
StringHttpMessageConverter sh = new StringHttpMessageConverter(Charset.forName ("utf-8"));
//没有添加默认也有该消息转换器
converters.add(sh);
}
...
}
2、SpringBoot使用监听器|过滤器:
@ServletComponentScan(“com.cssl.web”)
或者使用
new ServletRegistrationBean(new XxxServlet)
new FilterRegistrationBean(new XxxFilter)
new ServletListenerRegistrationBean(new XxxListener)
3、MVC异常处理:(和SpringMVC一样)
a、Advice异常处理
@ControllerAdvice
public class ExceptionHandlerAdvice {
@ExceptionHandler(Exception.class)
public String handleException(Exception e) { ... }
}
b、父级Controller异常处理
定义父类 BaseController:
public class BaseController {
@ExceptionHandler(Exception.class)
public String handleException(Exception e) { ... }
}
注意:
1、SpringBoot默认使用日志:logback
2、maven项目中,手动创建的webapp目录不能访问,要使用webapp骨架或者手动添加Web资源目录
3、IDEA的maven项目中,默认源代码(src/main/java)目录下的xml等资源文件并不会在编译的时候一块打包进classes文件夹,而是直接舍弃掉(Eclipse打war包也会丢弃java目录下的xml)
解决这个问题有两种方式:
第一种是建立src/main/resources文件夹,将xml等资源文件放置到这个目录中。maven工具默认在编译的时候,会将resources文件夹中的资源文件一块打包进classes目录中。
第二种解决方式是配置maven的pom文件配置,在pom文件中找到<build>节点,添加下列代码:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
七、SpringBoot项目发布到独立的tomcat中运行:
在开发阶段我们推荐使用内嵌的tomcat进行开发,因为这样会方便很多,但是到生产环境,希望在独立的tomcat容器中运行,因为我们需要对tomcat做额外的优化,这时我们需要将工程打成war包发布
1、工程的打包方式为war
war
2、添加servlet|jsp|jstl依赖,注意provided
javax.servlet
javax.servlet-api
3.1.0
provided
org.apache.tomcat.embed
tomcat-embed-jasper
provided
javax.servlet
jstl
provided
3、将spring-boot-starter-tomcat的范围设置为provided(spring-boot-starter-web自带Tomcat)
设置为provided是在打包时会将该包排除,因为要放到独立的tomcat中运行,是不需要的
org.springframework.boot
spring-boot-starter-tomcat
provided
也可以在导入spring-boot-starter-web时配置:
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-tomcat
4、修改编译设置(idea默认加载插件)
maven-war-plugin
3.2.0
5、修改代码,设置启动配置
需要集成SpringBootServletInitializer,然后重写configure,将SpringBoot的入口类设置进去。
public class ExampleApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(ExampleApplication.class);
}
}
注意:SpringBoot1.x和2.x的包路径不同
6、打war包
Eclipse:工程右键->Run As->Maven build (Goals输入:clean package)
IDEA:
1、Edit Configurations->“+”->maven->directory(选择路径)|Command line(clean package)
2、在Maven视图plugins右键运行
3、也可以直接jsp右键运行会自动打war包
7、将war包复制到webapps下,启动