SpringBoot快速上手

Spring Boot

1. springboot的引言

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的 初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不 再需要定义样板化的配置。通过这种方式,Spring
Boot致力于在蓬勃发展的快速应 用开发领域(rapid application development)成为领导者。
springboot(微框架) = springmvc(控制器) + spring(项目管理)

2. springboot的特点

  1. 创建独立的Spring应用程序

  2. 嵌入的Tomcat,无需部署WAR文件

  3. 简化Maven配置

  4. 自动配置Spring

  5. 没有XML配置

3. springboot的环境搭建

环境要求:

  1. MAVEN 3.x+
  2. Spring FrameWork 5.x+
  3. JDK8.x +
  4. Spring Boot 2.2.x+
3.1 项目中引入依赖
<!--继承springboot的父项目-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
    </parent>

    <dependencies>
        <!--引入springboot的web支持-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
3.2 引入配置文件

项目中src/main/resources/application.yml

server:
  port: 8989                 #用来指定内嵌服务器端口号
  servlet:
    context-path: /scaffold  #用来指定项目的url访问路径
3.3 建包并创建控制器
//在项目中创建指定的包结构
/*
	 com
	    +| dasuan
	    		+| controller */ 
                  @Controller
                  @RequestMapping("/hello")
                  public class HelloController {
                    @RequestMapping("/hello")
                    @ResponseBody
                    public String hello(){
                      System.out.println("======hello world=======");
                      return "hello";
                    }
                  }
3.4 编写入口类
//在项目中如下的包结构中创建入口类 Application
/*
	com
		+| dasuan    */
            @SpringBootApplication
            public class Application {
                public static void main(String[] args) {
                    SpringApplication.run(Application.class,args);
                }
            }
3.5 运行main启动项目
o.s.j.e.a.AnnotationMBeanExporter:Registering beans for JMX exposure on startup
s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8989 (http)
com.baizhi.Application : Started Application in 2.152 seconds (JVM running for 2.611)
//说明:  出现以上日志说明启动成功
3.6 访问项目
//注意: springboot的项目默认没有项目名
//访问路径:  http://localhost:8989/scaffold/hello/hello

4. springboot相关注解说明

Spring boot通常有一个名为 xxxApplication的类,入口类中有一个main方法, 在main方法中使用SpringApplication.run(xxxApplication.class,args)启动springboot应用的项目。

@SpringBootApplication 注解等价于: @SpringBootConfiguration 标识注解,标识这是一个springboot的配置类 @EnableAutoConfiguration
自动与项目中集成的第三方技术进行集成 @ComponentScan 扫描入口类所在子包以及子包后代包中注解

5.springboot自动配置原理

springboot自动配置原理

6. springboot中配置文件的拆分

#说明: 在实际开发过程中生产环境和测试环境有可能是不一样的 因此将生产中的配置和测试中的配置拆分开,是非常必要的在springboot中也提供了配置文件拆分的方式. 这里以生产中项名名称不一致为例:
	
	生产中项目名为: dasuan
	测试中项目名为: springboot
	端口同时为:   8080
	当前使用的配置文件为:测试

拆分如下:
	#主配置文件:
			application.yml	#用来书写相同的的配置
				server:
					port: 8080 #生产和测试为同一个端口
                spring:
                    profiles:
                         active:dev #选择使用哪个配置文件
    #生产配置文件:
    	  application-pord.yml
    			server:
    				context-path: /dasuan
    #测试配置文件:
    		application-dev.yml
    			server:
    				context-path: /springboot

7.springboot 分页

方法很简单,分为两步,第一 导入依赖;第二 配置文件
a.导入依赖

<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.12</version>
</dependency>

b.编写配置文件

pagehelper:
  helper-dialect: mysql   #指明数据库 4.0.0以后不需要设置此属性
  reasonable: true   #启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页
  support-methods-arguments: true  #支持通过Mapper接口参数来传递分页参数
  params: count=countSql #设置为true时,使用RowBounds分页会进行count查询

c.基本使用

//分页查询
public PageInfo<User> bookPageInfo(int pageNum, int pageSize) {
    PageHelper.startPage(pageNum, pageSize);
    List<User> users = userMapper.getUsers();
    PageInfo<User> PageInfo = new PageInfo<User>(users);
    return PageInfo;
}

8.springboot中管理对象创建

8.1 管理单个对象

在springboot中可以管理自定义的简单组件对象的创建可以直接使用注解形式创建。

1.使用 @Repository @Service @Controller 以及@Component管理不同简单对象
如: 比如要通过工厂创建自定义User对象:

@Component
public class User {
  private String id;
  private String name;
  ......
}	

2.通过工厂创建之后可以在使用处任意注入该对象
如:在控制器中使用自定义简单对象创建

@Controller
@RequestMapping("hello")
public class HelloController {
    @Autowired
    private User user;
  	......
}

8.2 管理多个对象

在springboot中如果要管理复杂对象必须使用@Configuration + @Bean注解进行管理

  1. 管理复杂对象的创建
@Configuration(推荐)|@Component(不推荐)
public class Beans {
    @Bean
    public Calendar getCalendar(){
        return Calendar.getInstance();
    }
}
  1. 使用复杂对象
@Controller
@RequestMapping("hello")
public class HelloController {
    @Autowired
    private Calendar calendar;
    ......
}

注意:

  1. @Configuration 配置注解主要用来生产多个组件交给工厂管理 (注册形式)
  2. @Component 用来管理单个组件

9.springboot集成mybatis-plus

9.1引入依赖

<!--		引入mysql数据库驱动-->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.2</version>
		</dependency>
<!--		引入druid数据源-->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid-spring-boot-starter</artifactId>
			<version>1.1.17</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.1.4</version>
		</dependency>
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.4.1</version>
		</dependency>

9.2配置配置文件

spring:
  mvc:
    view:
      prefix: /
      suffix: .jsp
  datasource:
    type: org.apache.commons.dbcp.BasicDataSource   #指定连接池类型
    driver-class-name: com.mysql.jdbc.Driver        #指定驱动
    url: jdbc:mysql://localhost:3306/cmfz           #指定url
    username: root									#指定用户名
    password: root								 	#指定密码

9.3加入mybatis配置

#配置mybatis规则
mybatis:
  mapper-locations: classpath:mapper/*.xml
  #配置全局配置文件,使用此配置后不能使用config-location
  configuration:
    #开启驼峰命名
    map-underscore-to-camel-case: true
    call-setters-on-nulls: true
//入口类中加入如下配置:
@SpringBootApplication
@MapperScan("com.baizhi.dao")   //必须在入口类中加入这个配置
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

10.springboot中devtools热部署

10.1引言

为了进一步提高开发效率,springboot为我们提供了全局项目热部署,日后在开发过程中修改了部分代码以及相关配置文件后,不需要每次重启使修改生效,在项目中开启了springboot全局热部署之后只需要在修改之后等待几秒即可使修改生效。

10.2 开启热部署

10.2.1 项目中引入依赖
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-devtools</artifactId>
   <optional>true</optional>
</dependency>
10.2.2 设置idea中支持自动编译
// 1.开启自动编译

	Preferences | Build, Execution, Deployment | Compiler -> 勾选上 Build project automatically 这个选项

// 2.开启允许在运行过程中修改文件
	ctrl + alt + shift + / ---->选择1.Registry ---> 勾选 compiler.automake.allow.when.app.running 这个选项

10.3开启IDEA的热部署策略

在这里插入图片描述
顶部菜单点击Edit,做如下图更改
在这里插入图片描述

10.4关闭浏览器缓存

打开浏览器,按F12,选择NetWork,把Disable cache勾选上
在这里插入图片描述
网上大部分配置完第2步就完成热部署,我是配置完第三部才实现的

11.logback日志的集成

11.1 logback简介

Logback是由log4j创始人设计的又一个开源日志组件。目前,logback分为三个模块:logback-core,logback-classic和logback-access。是对log4j日志展示进一步改进

11.2日志的级别

  • DEBUG < INFO < WARN < ERROR

  • 日志级别由低到高: 日志级别越高输出的日志信息越少

11.3 项目中日志分类

  • 日志分为两类

  • 一种是rootLogger : 用来监听项目中所有的运行日志 包括引入依赖jar中的日志

  • 一种是logger : 用来监听项目中指定包中的日志信息

11.4 java项目中使用

11.4.1 logback配置文件

logback的配置文件必须放在项目根目录中 且名字必须为logback.xml

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <!--定义项目中日志输出位置-->
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <!--定义项目的日志输出格式-->
        <!--定义项目的日志输出格式-->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern> [%p] %d{yyyy-MM-dd HH:mm:ss} %m %n</pattern>
        </layout>
    </appender>

    <!--项目中跟日志控制-->
    <root level="INFO">
        <appender-ref ref="stdout"/>
    </root>
    <!--项目中指定包日志控制-->
    <logger name="com.dasuan.scaffold.dao" level="DEBUG"/>
</configuration>
11.4.2使用默认日志配置
logging:
  level:
    root: debug
    com.baizhi.dao: debug
  path: /Users/chenyannan/aa.log
  file: bbb.log

12.拦截器

12.1开发拦截器

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
        System.out.println("======1=====");
        return true;//返回true 放行  返回false阻止
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("=====2=====");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) throws Exception {
        System.out.println("=====3=====");
    }
}

12.2配置拦截器

@Component
public class InterceptorConfig implements WebMvcConfigurer {


    //用来加入拦截器相关配置 参数1:InterceptorRegistry 拦截器注册对象
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //添加那个拦截器
        registry.addInterceptor(new MyInterceptor1())
                .addPathPatterns("/**")//拦截所有控制器请求
                .excludePathPatterns("/user/findAll","/login");//排除指定的请求;

        registry.addInterceptor(new MyInterceptor2())
                .addPathPatterns("/**")//拦截所有控制器请求
                .excludePathPatterns("/user/findAll");//排除指定的请求;
    }
}

13.全局异常配置

通过@ControllerAdvice,我们可以将对于控制器得全局配置放置在一个位置,可以使用@ExceptionHandler注解到方法上,这对所有注解了@RequestMapping的控制器内的方法有效

最简单的用法

定义一个异常配置类

@ControllerAdvice
public class ExceptionConfig {
    private Logger logger = org.slf4j.LoggerFactory.getLogger(this.getClass());

    @ExceptionHandler(value = Exception.class) 
    @ResponseBody //返回json格式
    public Result ExceptionTest(Exception e){
        return Result.fail(400,e.getMessage(),null);
    }

//    @ExceptionHandler(value = Exception.class)
//    @ResponseBody
//    public ModelAndView exception(Exception e){
//        logger.info("异常信息是: "+e.getMessage());
//        ModelAndView modelAndView = new ModelAndView("error"); //指定错误页面
//        modelAndView.addObject("errMessage",e.getMessage());
//        return modelAndView;
//    }
}

通过@ExceptionHandler的valuse属性可以设置拦截条件,在此我们可以拦截所有Exception,大家也可以根据设置过滤其他条件的异常

控制类

@Controller
public class HelloWorld {
    @RequestMapping("advice")
    @ResponseBody
    public Result hello(){
        int a=6/0;  
        return  Result.succ("成功了!");
    } 
}

返回结果集类

@Data
public class Result implements Serializable {

    private int code; // 200是正常,非200表示异常
    private String msg;
    private Object data;

    public static Result succ(Object data) {
        return succ(200, "操作成功", data);
    }

    public static Result succ(int code, String msg, Object data) {
        Result r = new Result();
        r.setCode(code);
        r.setMsg(msg);
        r.setData(data);
        return r;
    }

    public static Result fail(String msg) {
        return fail(400, msg, null);
    }

    public static Result fail(String msg, Object data) {
        return fail(400, msg, data);
    }

    public static Result fail(int code, String msg, Object data) {
        Result r = new Result();
        r.setCode(code);
        r.setMsg(msg);
        r.setData(data);
        return r;
    }
}

浏览器显示如下

在这里插入图片描述
如图则表示全局异常配置已经生效了

持续更新中…

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值