什么是SpringBoot
SpringBoot是Spring项目中的一个子工程,与我们所熟知的Spring-framework 同属于spring的产品:
把Spring Boot称为搭建程序的脚手架。其最主要作用就是帮我们快速的构建庞大的spring项目,并且尽可能的减少一切xml配置,做到开箱即用,迅速上手,让我们关注于业务而非配置。
我们可以使用SpringBoot创建java应用,并使用java –jar 启动它,就能得到一个生产级别的web工程。
特点:
创建独立的spring应用程序
直接内嵌tomcat、jetty和undertow(不需要打包成war包部署)
提供了固定化的“starter”配置,以简化构建配置
尽可能的自动配置spring和第三方库
提供产品级的功能,如:安全指标、运行状况监测和外部化配置等
绝对不会生成代码,并且不需要XML配置
项目Demo
添加启动器:
org.springframework.boot
spring-boot-starter-web
2.1.5.RELEASE
添加测试:
@RestController
@EnableAutoConfigurationpublic classMyController {
@GetMapping("hello")publicString test(){return "HelloWorld!";
}public static voidmain(String[] args) {
SpringApplication.run(MyController.class,args);
}
}
运行后,在浏览器输入地址:http://localhost:8080/hello
结果:
注意:SpringBoot启动需要先关闭上一个再启动!
上述demo只有一个controller,可以进行优化:
启动类:
@SpringBootApplicationpublic classTestApplication {public static voidmain(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
测试类:
@RestControllerpublic classMyController {
@GetMapping("hello")publicString test(){return "First SpringBoot";
}
}
@RestControllerpublic classMyController2 {
@GetMapping("hello2")publicString test(){return "Second SpringBoot";
}
}
结果:
补充:
@EnableAutoConfiguration
开启spring应用程序的自动配置,SpringBoot基于你所添加的依赖和你自己定义的bean,试图去猜测并配置你想要的配置。比如我们引入了`spring-boot-starter-web`,而这个启动器中帮我们添加了`tomcat`、`SpringMVC`的依赖。此时自动配置就知道你是要开发一个web应用,所以就帮你完成了web及SpringMVC的默认配置了!
总结,SpringBoot内部对大量的第三方库或Spring内部库进行了默认配置,这些配置是否生效,取决于我们是否引入了对应库所需的依赖,如果有那么默认配置就会生效。所以,我们使用SpringBoot构建一个项目,只需要引入所需依赖,配置就可以交给SpringBoot处理了。
@SpringBootApplication
@SpringBootApplication其实是一个组合注解,这里重点的注解有3个:
@SpringBootConfiguration(来声明当前类是SpringBoot应用的配置类,项目中只能有一个,所以一般我们无需自己添加。)
@EnableAutoConfiguration:开启自动配置
@ComponentScan:开启注解扫描
配置文件
SpringBoot使用一个全局的配置文件,配置文件名是固定的,文件命名主要分为以下两种(任选其一):
•application.properties
•application.yml
完整项目
(Springboot+HikariCP连接池+MyBatis+Thymeleaf,实现数据查询)
项目结构:
pom.xml:
4.0.0
com.demo.myspringboot
myspringboot
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter-web
2.1.5.RELEASE
com.alibaba
druid
1.0.28
org.springframework.boot
spring-boot-starter-jdbc
2.1.5.RELEASE
mysql
mysql-connector-java
5.1.46
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.2
org.springframework.boot
spring-boot-starter-thymeleaf
2.1.4.RELEASE
pom.xml
application.properties:
# 连接四大参数
spring.datasource.url=jdbc:mysql://localhost:3306/bgblog
spring.datasource.username=root
spring.datasource.password=root
# 可省略,SpringBoot自动推断
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.hikari.idle-timeout=60000spring.datasource.hikari.maximum-pool-size=30spring.datasource.hikari.minimum-idle=10# mybatis 别名扫描
mybatis.type-aliases-package=com.demo.bean.User
# mapper.xml文件位置,如果没有映射文件,请注释掉
mybatis.mapper-locations=classpath:mappers/*.xml
#thymeleaf
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.mode=HTML
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.suffix=.html
spring.thymeleaf.cache=false
application.properties
index.html(首页):
TitleHelloWorld!
查询用户
index.html
User.html(Thymeleaf 静态页面):
首页table, th, td {border: 1px solid darkslategray;padding: 10px}
欢迎光临!
id | 姓名 | 电话 | 密码 |
---|---|---|---|
1 | 张三 | 110 | 888 |
User.html
UserMapper.xml:
/p>
PUBLIC"-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
select* from user where userId =#{id}
select*from user
insert into user VALUES (
#{userId},
#{userName},
#{phoneNum},
#{passWorld}
);
update user set userName= #{userName} where userId =#{userId};
delete from user where userId=#{id};
UserMapper.xml
TestApplication:
/*** 启动器
**/@SpringBootApplicationpublic classTestApplication {public static voidmain(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
TestApplication
User:
@Componentpublic classUser {privateString userId;privateString userName;privateString phoneNum;privateString passWorld;publicUser() {
}publicUser(String userId, String userName, String phoneNum, String passWorld) {this.userId =userId;this.userName =userName;this.phoneNum =phoneNum;this.passWorld =passWorld;
}public voidsetUserId(String userId) {this.userId =userId;
}public voidsetUserName(String userName) {this.userName =userName;
}public voidsetPhoneNum(String phoneNum) {this.phoneNum =phoneNum;
}public voidsetPassWorld(String passWorld) {this.passWorld =passWorld;
}publicString getUserId() {returnuserId;
}publicString getUserName() {returnuserName;
}publicString getPhoneNum() {returnphoneNum;
}publicString getPassWorld() {returnpassWorld;
}
@OverridepublicString toString() {return "User{" +
"userId='" + userId + '\'' +
", userName='" + userName + '\'' +
", phoneNum='" + phoneNum + '\'' +
", passWorld='" + passWorld + '\'' +
'}';
}
}
User
DefaultPage(设置默认页面):
/*** 设置默认页面
**/@Configurationpublic class DefaultPage extendsWebMvcConfigurerAdapter {
@Overridepublic voidaddViewControllers( ViewControllerRegistry registry )
{
registry.addViewController("/" ).setViewName( "forward:/index.html");
registry.setOrder( Ordered.HIGHEST_PRECEDENCE );super.addViewControllers( registry );
}
}
DefaultPage
JdbcConfiguration(获取数据源):
/*** 获取数据源
**/@Configurationpublic classJdbcConfiguration {//声明要注入的属性前缀,SpringBoot会自动把相关属性通过set方法注入到DataSource中
@Bean
@ConfigurationProperties(prefix= "spring.datasource")publicDataSource dataSource() {
DruidDataSource dataSource= newDruidDataSource();returndataSource;
}
}
JdbcConfiguration
MVCConfiguration(设置拦截器):
/*** 设置拦截器
**/@Configurationpublic class MVCConfiguration implementsWebMvcConfigurer{
@AutowiredprivateMyInterceptor myInterceptor;/*** 重写接口中的addInterceptors方法,添加自定义拦截器
*@paramregistry*/
public voidaddInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor).addPathPatterns("/**");
}
}
MVCConfiguration
MyInterceptor(拦截器对象):
/*** 拦截器
**/@Componentpublic class MyInterceptor implementsHandlerInterceptor {public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throwsException {
System.out.println("preHandle method is running!");return true;
}public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throwsException {
System.out.println("postHandle method is running!");
}public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throwsException {
System.out.println("afterCompletion method is running!");
}
}
MyInterceptor
JdbcProperties(数据源属性对象):
/*** 数据源属性获取
**/@ConfigurationProperties(prefix= "spring.datasource")public classJdbcProperties {privateString url;privateString driverClassName;privateString username;privateString password;publicString getUrl() {returnurl;
}publicString getDriverClassName() {returndriverClassName;
}publicString getUsername() {returnusername;
}publicString getPassword() {returnpassword;
}public voidsetUrl(String url) {this.url =url;
}public voidsetDriverClassName(String driverClassName) {this.driverClassName =driverClassName;
}public voidsetUsername(String username) {this.username =username;
}public voidsetPassword(String password) {this.password =password;
}publicJdbcProperties(String url, String driverClassName, String username, String password) {this.url =url;this.driverClassName =driverClassName;this.username =username;this.password =password;
}publicJdbcProperties() {
}
}
JdbcProperties
MyController:
/*** 测试Controller
**/@Controllerpublic classMyController {
@AutowiredprivateDataSource dataSource;
@AutowiredprivateUserService userService;
@RequestMapping("/user")publicString all(ModelMap model) {//查询用户
List users = this.userService.queryUserList();//放入模型
model.addAttribute("users", users);//返回模板名称(就是classpath:/templates/目录下的html文件名)
return "User";
}
}
MyController
UserService:
@Servicepublic classUserService {
@AutowiredprivateUserMapper userMapper;publicUser queryUserById(String id){
User user=userMapper.queryUserById(id);returnuser;
}public ListqueryUserList(){
List users =userMapper.queryUserList();returnusers;
}public voidinsertUser(User user){
userMapper.insertUser(user);
}public voidupdateUser(User user){
userMapper.updateUser(user);
}public voiddeleteUserById(String id){
userMapper.deleteUserById(id);
}
}
UserService
UserMapper:
@Mapper
@Componentpublic interfaceUserMapper {/*** 通过id查询user对象
*@paramid
*@return
*/User queryUserById(String id);/*** 查询所有用户
*@return
*/ListqueryUserList();/*** 插入用户
*@paramuser*/
voidinsertUser(User user);/*** 更新用户
*@paramuser*/
voidupdateUser(User user);/*** 通过id删除用户
*@paramid*/
voiddeleteUserById(String id);
}
UserMapper
数据库(Mysql):
新建库:bgblog
表数据:
CREATE TABLE `user` (
`userId` varchar(100) DEFAULT NULL,
`userName` varchar(100) DEFAULT NULL,
`phoneNum` varchar(100) DEFAULT NULL,
`passWorld` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `user` VALUES ('001', '张三', '13888888888', '123');
INSERT INTO `user` VALUES ('002', '李四', '13888888888', '456');
INSERT INTO `user` VALUES ('003', '王五', '13888888888', '789');
INSERT INTO `user` VALUES ('004', '赵六', '13888888888', '000');
页面展示:
浏览器输入:localhost:8080,进入默认页面:
点击“查询用户”,展示thymeleaf页面:
补充Thymeleaf页面标签报错/红色波浪线解决方法:
打开IDE的file->setting->左上角搜索inspections,然后在右边的搜索栏输入thy,就会显示如下页面,将Expression variables validation的√去掉,然后点击确定。