SpringBoot快速入门

SpringBoot介绍

参考百度百科:https://baike.baidu.com/item/Spring%20Boot/20249767?fr=aladdin
Spring Boot是由Pivotal团队提供的全新框架, 其设计目的是用来简化新Spring应用的初始搭建以及开发过程。

人们把Spring Boot 称为搭建程序的脚手架。其最主要作用就是帮我们快速的构建庞大的spring项目,并且尽可能的减少一切xml配置,做到开箱即用,迅速上手,让我们关注与业务而非配置。

该框架非常火,目前新开项目几乎都是基于SpringBoot搭建,非常符合微服务架构要求,企业招聘大多都要求有SpringBoot开发经验,属于面试必问的点。

优缺点

优点:

  1. 创建独立运行的Spring应用程序
  2. 嵌入的Tomcat,无需部署war文件
  3. 简化Maven配置
  4. 自动配置Spring
  5. 提供生产就绪型功能,如:日志,健康检查和外部配置等
  6. 不要求配置 XML
  7. 非常容易和第三方框架集成起来

缺点:

  1. 版本更新较快,可能出现较大变化
  2. 因为约定大于配置,所以经常会出现一些很难解决的问题

SpringBoot快速入门

方式1:使用idea创建SpringBoot工程

SpringBoot建议使用官方提供的工具来快速构建项目,网站:https://start.spring.io/ ,IDEA自带该功能,但需要联网使用

注意:官方提供的构建工具默认只能选择固定的版本,有些版本之间的差异非常大,所以如果需要选择某个版本建议项目构建后,自行在pom.xml文件中修改版本。

方式2:创建普通Maven工程

添加依赖

<!-- 打包方式jar包 -->
<packaging>jar</packaging>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.6.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

程序代码

@Controller
public class HelloController {

    @RequestMapping("/hello")
    @ResponseBody
    public String hello() {
        return "Hello Spring Boot";
    }
}
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

然后通过main方法启动程序,观察控制台输出内容,最后浏览器中输入http://localhost:8080/hello验证效果

案例分析

父工程坐标
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.3.RELEASE</version>
</parent>

SpringBoot提供了一个名为spring-boot-starter-parent的工程,里面已经对各种常用依赖(并非全部)的版本进行了管理,我们的项目需要以这个项目为父工程,这样我们就不用操心依赖的版本问题了,需要什么依赖,直接引入坐标即可

web启动器

这是SpringBoot提供的web启动器 , 是一个快速集成web模块的工具包 , 包含springmvc,jackson相关的依赖

以及嵌入了Tomcat9服务器,默认端口8080

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

需要注意的是,我们并没有在这里指定版本信息。因为SpringBoot的父工程已经对版本进行了管理了。

傻瓜式配置的工具包

SpringBoot非常优秀的地方在于提供了非常多以spring-boot-starter-* 开头的开箱即用的工具包,常见工具包有以下一些:

spring-boot-starter:核心的工具包,提供了自动配置的支持,日志和YAML配置支持;

spring-boot-starter-activemq:针对快速集成ActiveMQ的工具包;

spring-boot-starter-aop:提供了快速集成SpringAOP和AspectJ的工具包;

spring-boot-starter-data-redis:提供了快速集成Redis和Jedis的工具包;

spring-boot-starter-freemarker:提供了快速集成Freemarker的工具包;

spring-boot-starter-mail:提供了快速集成邮件发送的工具包;

spring-boot-starter-test:提供了对Springboot应用的测试工具包;

spring-boot-starter-web:提供了对web开发的工具包,包括基于SpringMVC的RESTful应用开发,内置的tomcat服务器等;

spring-boot-starter-actuator:提供了对生产环境中应用监控的工具包;

spring-boot-starter-logging:提供了对日志的工具包,默认使用Logback;

独立运行

对于SpringBoot项目来说无论是普通应用还是web应用,其打包方式都是jar即可,默认Maven的打包方式是不能正常的打包SpringBoot项目,需要添加额外的打包插件才能正常打包。

<!-- pom.xml中添加插件 -->
<build>
    <plugins>
        <!-- SpringBoot打包插件 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

使用

  1. 使用Maven的package命令进行打包
  2. 该项目的字节码编译目录中会有打包好的 jar
  3. 用命令运行该jar包java -jar xxx.jar

SpringBoot基本使用

Springboot应用的基本结构

Springboot应用的热部署

除了使用JRebel来实现热部署,还可以使用Springboot提供的spring-boot-devtools包来完成Springboot应用热部署;

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>

原理
SpringBoot重启是reload重启,通过监控classpath的变化,如果classpath中的文件发生变化,即触发重启。springboot通过两个classpath来完成reload,一个basic classloader中加载不变的类,一个restart classloader中加载classpath中的类,重启的时候,restart classloader中的类丢弃并重新加载;

SpringBoot参数配置

参数来源
  1. 命令行启动项目时传入的参数, 如: java -jar xxx.jar --server.port=80

  2. application.properties或者YAML文件

    一般用的比较多的就是直接在application.properties或者YAML配置 , 其次是命令行启动方式

    application.properties语法

    server.port=80  
    server.session-timeout=30  
    server.tomcat.uri-encoding=UTF-8  
      
    spring.datasource.url = jdbc:mysql://localhost:3306/crm
    spring.datasource.username = root  
    spring.datasource.password = mymysql  
    spring.datasource.driverClassName = com.mysql.jdbc.Driver  
    

    application.yml语法

    server:  
      port: 80
      session-timeout: 30  
      tomcat.uri-encoding: UTF-8  
      
    spring:  
      datasource:  
        url : jdbc:mysql://localhost:3306/crm  
        username : root  
        password : mymysql  
        driverClassName : com.mysql.jdbc.Driver
    
  3. 参数加载顺序

    1. 命令行参数;
    2. ServletConfig和ServletContext;
    3. 操作系统环境变量;
    4. application-{profile}.properties或者YAML文件;
    5. application.properties或者YAML文件;
单个获取参数

配置:
application.properties:

app.myvalue=value

获取:

@Value("${app.myvalue}")
private String value;
批量参数获取

使用@ConfigurationProperties绑定参数对象:

配置:
application.properties:

propbind.host=host
propbind.username=username
propbind.password=password
propbind.timeout=10000

获取:

@ConfigurationProperties(prefix = "propbind")
@Component
public class PropBind {
	private String host;
	private String username;
	private String password;
	private Long timeout;

}

设置banner

springboot 比较搞笑的一个功能:banner
1,可以直接在classpath下添加一个banner.txt文件即可;
http://patorjk.com/software/taag
http://www.network-science.de/ascii/
http://www.degraeve.com/img2txt.php
https://blog.csdn.net/vbirdbest/article/details/78995793

2:如果不想要直接关闭即可
#application.properties
spring.main.banner-mode=off #关闭banner

SpringBoot的web开发

静态资源

默认情况下,Springboot会从classpath下的/static、/public、/resources、/META-INF/resources下加载静态资源;

可以通过修改spring.resources.staticLocations来修改静态资源加载地址;

因为应用是打成jar包,所以之前的src/main/webapp不会加载;
可以把静态资源打成jar包,springboot会自动加载/webjars/**下的所有jar包中的静态资源;

FreeMarker集成

1,引入spring-boot-starter-freemarker,自动引入freemarker和spring-context-support;

<!-- SpringBoot集成FreeMarker的依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

2:在application.properties中配置

#freemarker后缀
spring.freemarker.suffix=.ftl
#暴露session对象的属性
spring.freemarker.expose-session-attributes=true
#freemarker数字格式化 : 330,000
spring.freemarker.settings.number_format=0.##

其他配置

1,spring.freemarker.enabled=true:是否开启freemarker支持;

2,spring.freemarker.allow-request-override:是否允许request中的属性覆盖model中同名属性;默认false;

3,spring.freemarker.allow-session-override:是否允许session中的属性覆盖model中同名属性;默认false;

4,spring.freemarker.cache:是否支持模板缓存;默认false;

5,spring.freemarker.charset:模板编码

6,spring.freemarker.content-type=text/html:模板contenttype;

7,spring.freemarker.expose-request-attributes:是否开启request属性expose,默认false;

8,spring.freemarker.expose-session-attributes:是否开启session属性expose,默认false;

9,spring.freemarker.expose-spring-macro-helpers:是否开启spring的freemarker宏支持;默认为false;

10,spring.freemarker.prefer-file-system-access:默认为true,支持实时检查模板修改;

11,spring.freemarker.prefix:加载模板时候的前缀;

12,spring.freemarker.settings.*:直接配置freemarker参数

13,spring.freemarker.suffix:模板文件后缀;

14,spring.freemarker.template-loader-path=classpath:/templates/:模板加载地址

访问异常

静态页面方式
  1. SpringBoot默认情况下,把所有错误都重新定位到/error这个处理路径上,由BasicErrorController类完成处理;
  2. SpringBoot提供了默认的替换错误页面的路径:
    1,静态错误页面默认结构:
    src/
    resources/
    static/
    error/
    404.html
    401.html
    5xx.html
    2,也可以使用模板页面:
    src/
    resources/
    templates/
    error/
    5xx.ftl
    该路径方式是通过ErrorMvcAutoConfiguration中的DefaultErrorViewResolver完成的;
统一异常类处理方式:

@ControllerAdvice

通过使用@ControllerAdvice定义统一的异常处理类,而不是在每个Controller中逐个定义。@ExceptionHandler用来定义函数针对的异常类型。

@ControllerAdvice
public class GlobalErrorAdvice {

	@ExceptionHandler(value = Exception.class)
	public String error(Model model, Exception e) {
		model.addAttribute("ex", e);
		return "err";
	}

}

集成druid

添加依赖

<!--2个jdbc操作依赖-->

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<!-- 导入druid依赖 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.21</version>
</dependency>

application.properties 配置

#配置数据库4要素
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql:///crm?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=admin

集成mybatis

1,引入依赖:

<!--mybatis集成到SpringBoot中的依赖-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.1</version>
</dependency>

2,mybatis-spring-boot-starter提供了以下配置:

#懒加载配置
mybatis.configuration.lazy-loading-enabled=true
mybatis.configuration.lazy-load-trigger-methods=clone
#映射配置文件
mybatis.mapper-locations=classpath:cn/wolfcode/crm/mapper/*Mapper.xml
#扫描实体包
mybatis.type-aliases-package=cn.wolfcode.crm.domain

#打印SQL日志
logging.level.cn.wolfcode.crm.mapper=trace

3,扫描mapper接口:

会自动扫描指定包下的mapper接口;

@SpringBootApplication
// 会自动扫描指定包下的mapper接口;
@MapperScan(basePackages="cn.wolfcode.crm.mapper") 
public class App {
	public static void main(String[] args) {
		SpringApplication.run(App.class, args);
	}
}

事务控制

注解方式:
1,引入aop

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2, 在service实现类上贴相关注解

@Service
@Transactional  //表示给服务层添加事务
public class EmployeeServiceImpl implements IEmployeeService {
    @Autowired
    private EmployeeMapper employeeMapper;

    @Transactional(readOnly=true)
    @Override
    public List<Employee> list() {
        return employeeMapper.selectAll();
    }
    @Override
    public void save(Employee employee) {
        employeeMapper.insert(employee);
        //int i = 1/ 0;
    }

}

拦截器

1:定义一个拦截器

/**

 * 用户登录拦截
   */
   public class LoginInterceptor implements HandlerInterceptor{
   @Override
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {
       //如果是拦截的动态请求, handler 参数就是HandlerMethod类实例
       //如果是拦截是静态资源, handler 参数就是不是HandlerMethod类实例

       //instanceof  判断左边对象是不是右边类的实例, 如果是true, 反之为false
       if(!(handler instanceof HandlerMethod)){
           return  true;  //静态资源放行
       }
       //获取请求路径
       String uri = request.getRequestURI();
       //如果url路径里面包含:/user/要求登录
       if(uri.contains("/user/")){
           response.sendRedirect("/login.html");
           return false;
       }
       //放行
       return true;

   }
   }

2:配置拦截器

  1. 启动类实现一个接口WebMvcConfigurer

  2. 重写接口中addInterceptors

@SpringBootApplication
public class App implements WebMvcConfigurer{

    //自定义登录拦截器
    @Bean
    public LoginInterceptor loginInterceptor(){
        return  new LoginInterceptor();
    }
    //将自定义的拦截器加入到springmvc拦截器栈
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor())
            .addPathPatterns("/**")
            .excludePathPatterns("/css/**")
            .excludePathPatterns("/js/**")
            .excludePathPatterns("/images/**")
            .excludePathPatterns("/error/**");
    
    }

}

3:测试
http://localhost:8080/user/list
http://localhost:8080/hello

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小云很优秀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值