文档章节

220.详细整理学习spring boot

Lucky_Me
 Lucky_Me
发布于 04/23 23:34
字数 3587
阅读 130
收藏 5

1.springboot是什么? 有什么用?

1.1 是什么

   一个整合常用第三方框架,简化xml配置,完全采用注解形式,内置tomcat容器,帮助开发者快速实现项目搭建,spring boot 的web组件默认集成的是springMVC框架

注意:spring boot 是一个开发框架  并不是微服务

  1.2 作用

   (1)、简化项目搭建难度

  (2) 、简化jar配置

  (3)、大大减少xml 配置

  (4)、内容tomcat容器,开发者无需配置,且端口修改特别容易

2.开发环境要求

工具(建议):idea

jdk:    Java1.8及以上

spring版本:Spring Framework 4.1.5及以上

本文采用 Spring Boot 2.1.4 版本调试通过。

3. spring boot与springMVC  及  spring boot与spring cloud的区别

3.1 spring boot 与springMVC

SpringBoot 是一个快速开发的框架,能够快速的整合第三方框架,简化XML配置,全部采用注解形式,内置Tomcat容器,帮助开发者能够实现快速开发,SpringBoot的Web组件 默认集成的是SpringMVC框架。

SpringMVC只是控制层框架。

3.2 spring boot 与spring cloud

            SpringBoot 是一个快速开发的框架,能够快速的整合第三方框架,简化XML配置,全部采用注解形式,内置Tomcat容器,帮助开发者能够实现快速开发,SpringBoot的Web组件 默认集成的是SpringMVC框架。

            SpringCloud依赖与SpringBoot组件,使用SpringMVC编写Http协议接口,同时SpringCloud是一套完整的微服务解决框架

4.spring boot入门案例

4.1 下载配置 idea 环境

https://my.oschina.net/springMVCAndspring/blog/3032360#h1_52

4.2  springboot入门demo

 

 

 

 

 

   创建的项目 初始化样式:

编写功能类

这里只是controller层

 

 

 

效果:

 

相关代码:

主函数:

        

package cn.ma.spring_demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

//发现@SpringBootApplication是一个复合注解,
// 包括@ComponentScan,和@SpringBootConfiguration,@EnableAutoConfiguration。
//该注解扫面的是该类所在包下面的所有内容 就是 @ComponentScan("cn.ma.spring_demo")
@SpringBootApplication//所以 如何要访问的类包路径高于启动类的包路径是无法被访问到的
public class SpringDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringDemoApplication.class, args);
    }

}

 

相关方法:

/**
 * 公司:
 * 文件名:SpringDemoController
 * 作者:  18392
 * 时间: 2019/4/24 0:07
 * 描述:
 */
package cn.ma.spring_demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController//只能返回字符串  @RestController = @RespnoseBody+ @Controller
public class SpringDemoController {
    /*
    *1.spring boot 入门案例
    * http://localhost:8080/springDemoFunction
     * @Author sunshine
     * @Description //TODO
     * @Date 0:11 2019/4/24
     * @Param []
     * @return java.lang.String
     **/
    @RequestMapping("/springDemoFunction")
    public String springDemoFunction(){
        return "我是spring boot 入门demo";
    }
}

pom中的相关配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.ma</groupId>
    <artifactId>spring_demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring_demo</name>
    <description>Demo project for Spring Boot</description>
    <!--1.spring-boot-starter-parent 依赖管理  是借用了maven的继承特点-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <!--2.导入相关jar-->
    <dependencies>
        <!--2.1 springweb 核心组件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--2.2 测试相关jar-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <!--3.jdk版本控制-->
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <!--4.能够以Maven的方式为应用提供Spring Boot的支持,即为Spring Boot应用提供了执行Maven操作的可能-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

 

5.springboot中常用注解

(1) @RestController
                在上加上RestController 表示修饰该Controller所有的方法返回JSON格式,直接可以编写Restful接口

列如下图:

            

(2)@EnableAutoConfiguration

    作用在于让 Spring Boot   根据应用所声明的依赖来对 Spring 框架进行自动配置
这个注解告诉Spring Boot根据添加的jar依赖猜测你想如何配置Spring。由于spring-boot-starter-web添加了Tomcat和Spring MVC,所以auto-configuration将假定你正在开发一个web应用并相应地对Spring进行设置。

(3) @SpringBootConfiguration

            继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中,并且实例名就是方法名。

 

(4)  @ComponentScan,扫描当前包及其子包下被@Component,@Controller,@Service,@Repository注解标记的类并纳入到spring容器中进行管理。是以前的<context:component-scan>(以前使用在xml中使用的标签,用来扫描包配置的平行支持)。所以本demo中的User为何会被spring容器管理。

(5) @SpringBootApplication

   @SpringBootApplication是一个复合注解,包括@ComponentScan,和@SpringBootConfiguration,@EnableAutoConfiguration。

也就是说我们可以用后3个来代替  @SpringBootApplication

如下图:

 

6. web端开发

6.1 静态资源访问

访问效果图:

6.2 整合web视图

6.2.1 整合freemaker

第一步:

在src/main/resources/创建一个templates文件夹,后缀为*.ftl

第二步:引入freeMarker的依赖包

<!-- 2.3 引入freeMarker的依赖包. -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

    第三步:编写后台方法

第四步:编写ftl页面

 

6.2.2   springboot整合jsp

第1步:springboot的pom中引入jsp相关jar

<!--2.4.1 springboot整合jsp-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<!-- 2.4.2 SpringBoot 外部tomcat支持 -->
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<!-- 2.4.3 jstl标签库 -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
</dependency>

第2步:配置前端位置

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

 

第三步:创建静态文件防止路径   看准路径

第四步:后台编写及jsp页面

效果:

 

7.配置全局捕获异常

7.1 自定义异常类

/**
 * 公司:马氏集团
 * 文件名:GlobalExceptionHandler
 * 作者:  18392
 * 时间: 2019/4/26 10:29
 * 描述:
 */
package cn.ma.spring_demo.err;

import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(RuntimeException.class)
    @RequestMapping("/exceptionHandler")
    public  void exceptionHandler(HttpServletResponse response) throws IOException {
        //解决乱码 及跨域
        response.setContentType("text/html; charset=utf-8");
        response.setHeader("Access-Control-Allow-Origin", "*");//解决json跨域
        HashMap<String, Object> map = new HashMap<>();
        map.put("msg","系统异常!");
        String msg = JSONObject.toJSONString(map);
        PrintWriter out = response.getWriter();
        out.println(msg);
        out.flush();
        out.close();

    }
}

 

效果:

 

8.处理日志(思想很重要  AOP)

方式有:3种   

        方式一:log4j

        方式二:使用AOP统一处理Web请求日志

        方式三:lombok插件 打印  放在一级标题 9了(原因很好用)

8.1  log4j打印日志

(1)引入相关jar

 

(2) 定义全局变量

//log4j打印日志
private static final Logger logger = LoggerFactory.getLogger(SpringDemoController.class);

      (3) 通过log4j打印

8.2 使用AOP统一处理Web请求日志

(1)导入aop相关jar

<dependency>

             <groupId>org.springframework.boot</groupId>

             <artifactId>spring-boot-starter-aop</artifactId>

    </dependency>

(2)  日志工具类(记得该切点路径

/**
 * 公司:
 * 文件名:HttpAspect
 * 作者:  18392
 * 时间: 2019/4/26 11:45
 * 描述:
 */
package cn.ma.spring_demo.utils;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.Enumeration;
/*
*   作用:获取用户请求
*       (1)访问地址URL
*       (2) 请求方式
*       (3) 请求者IP
*       (4) 请求方法的响应时长
 * @Author sunshine
 * @Description //TODO
 * @Date 13:11 2019/4/26
 * @Param
 * @return
 **/
@Aspect
@Component
public class HttpAspect {
    private static final Logger logger = LoggerFactory.getLogger(HttpAspect.class);
    //切点
    @Pointcut("execution(public * cn.ma.spring_demo.controller.*.*(..))")
    public void webLog() { }

    // System.out.println();// new Date()为获取当前系统时间
    long beginTime=0;//开始时间
    long endTime=0;//结束时间
    //前置通知
    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) throws Exception {
        //没抽取的原因是并发的时候会导致问题 这样安全性更高
        Date d = new Date();
        long time = d.getTime();
         beginTime =time;

        // 接收到请求,记录请求内容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        // 记录下请求内容
        logger.info("访问地址URL : " + request.getRequestURL().toString());
        logger.info("请求方式HTTP_METHOD : " + request.getMethod());
        logger.info("访问者IP : " + request.getRemoteAddr());
        Enumeration<String> enu = request.getParameterNames();
        while (enu.hasMoreElements()) {
            String name = (String) enu.nextElement();
            logger.info("参数name:{},参数value:{}", name, request.getParameter(name));
        }
    }
    //后置通知
    @AfterReturning(returning = "ret", pointcut = "webLog()")
    public void doAfterReturning(Object ret) throws Throwable {
        // 处理完请求,返回内容
        logger.info("返回内容RESPONSE : " + ret);

        Date d = new Date();
        long time = d.getTime();
      //  long endTime = TimeUtils.getTimeGap();//没抽取的原因是并发的时候会导致问题 这样安全性更高
       long endTime = time;
        logger.info("响应时长(单位毫秒) : " +(endTime-beginTime));
    }


}

效果:

9.Spring Boot集成lombok让代码更简洁

这个插件特别好用  所以用一级标题 编写

    功能:简化getXxx/setXxx方法   可以打印日志

在idea上安装教程:

https://www.cnblogs.com/hackyo/p/7998485.html

9.1 简化getXxx/setXxx方法

效果:

 

使用教程:

       (1) 引入插件

  (2) 实体类上添加注解

@Slf4j
@Data

测试:

        

 

9.2 插件的其他注解

@Data 标签,生成getter/setter toString()等方法

@NonNull : 让你不在担忧并且爱上NullPointerException

@CleanUp : 自动资源管理:不用再在finally中添加资源的close方法

@Setter/@Getter : 自动生成set和get方法

@ToString : 自动生成toString方法

@EqualsAndHashcode : 从对象的字段中生成hashCode和equals的实现

@NoArgsConstructor/@RequiredArgsConstructor/@AllArgsConstructor

自动生成构造方法

@Data : 自动生成set/get方法,toString方法,equals方法,hashCode方法,不带参数的构造方法

@Value : 用于注解final类

@Builder : 产生复杂的构建器api类

@SneakyThrows : 异常处理(谨慎使用)

@Synchronized : 同步方法安全的转化

@Getter(lazy=true) :

@Log : 支持各种logger对象,使用时用对应的注解,如:@Log4

9.3 @AllArgsConstructor 

@AllArgsConstructor

 

10. springboot整合 mybaties

1. 搭建springboot项目

 

(2)pom中配置jar

<!--1.web-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 2.2.1 springboot与mybaties整合jar   -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.1.1</version>
</dependency>
<!--  2.2.2 MySQL 驱动jar -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 2.2.3  mybatis数据库字段类型映射,将时间类型进行转换:解决日期映射 -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-typehandlers-jsr310</artifactId>
    <version>1.0.1</version>
</dependency>
<!--2.2.4 druid连接池-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.9</version>
</dependency>
<!-- 3. fastjson插件-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.47</version>
</dependency>
<!--4.lombook-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.18</version>
</dependency>

非常重要:

<!--放行xml格式文件-->
<resources>
    <resource>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.xml</include>
        </includes>
        <filtering>true</filtering>
    </resource>
</resources>

        

(3) 配置数据源

6.0版本之前的

spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot
spring.datasource.username=root
spring.datasource.password=root

 

新版mysql:

#1.配置端口
server.port=9000
#2.连接数据源
spring.datasource.url=jdbc:mysql://localhost:3306/studydb?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#3.连接池的配置信息
spring.datasource.initialSize=5  
spring.datasource.minIdle=5  
spring.datasource.maxActive=20  
spring.datasource.maxWait=60000  
spring.datasource.timeBetweenEvictionRunsMillis=60000  
spring.datasource.minEvictableIdleTimeMillis=300000  
spring.datasource.validationQuery=SELECT 1 FROM DUAL  
spring.datasource.testWhileIdle=true  
spring.datasource.testOnBorrow=false  
spring.datasource.testOnReturn=false  
spring.datasource.poolPreparedStatements=true  
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20  
spring.datasource.filters=stat,wall,log4j  
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 
#4.统一配置实体类包路径
mybatis.type-aliases-package=cn.ma.sm.pojo
#5.开启驼峰命名
mybatis.configuration.map-underscore-to-camel-case=true

(4) 创建3层包

(5) 三层代码

  5.1 controller层

5.2 业务层 

业务层接口:

            

        业务层实现类:

持久岑:

    持久岑接口:

持久岑xml文件:

注意 配置扫包:

 

项目搭建好后的测试:

                

代码:

        码云:https://gitee.com/Luck_Me/springboot

        百度云:

                链接:https://pan.baidu.com/s/1oPJ2ms9t-6yY27HPxB11TA 
                提取码:2ovl 

11.springboot定时任务

只需要web的相关jar   不需要添加任何其他的jar

@EnableScheduling//开启spring定时任务
//  http://cron.qqe2.com/
//@Scheduled(cron="0 * * * * ?")// 间隔1分钟执行
@Scheduled(cron = "0/5 * * * * ? ") // 间隔5秒执行
public void reportCurrentTime() {
    SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
    System.out.println("现在时间:" + dateFormat.format(new Date()));
}

 

 

11.问题整理

11.1 端口被占用

 

11.2 乱码 及跨域 (重复代码 使用AOP解决

//解决乱码 及跨域
response.setContentType("text/html; charset=utf-8");
response.setHeader("Access-Control-Allow-Origin", "*");//解决json跨域

11.3 通过在application.properties中指定POJO扫描包来让mybatis自动扫描到自定义POJO

解决方案代码:

#2.统一配置实体类包路径
mybatis.type-aliases-package=cn.guang.springboot_mybites.domain

错误效果:

配置位置:

11.4 开始驼峰式命名

#3.开启驼峰命名
mybatis.configuration.map-underscore-to-camel-case=true

问题效果:

开始后的效果:

11.5 xml静态资源 扫包 及放行

扫包:

@MapperScan("cn.guang.springboot_mybites.mapper")//扫描xml文件路径

xml 资源放行:(注意代码 编写的位置)

<!--放行xml格式文件-->
<resources>
    <resource>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.xml</include>
        </includes>
        <filtering>true</filtering>
    </resource>
</resources>

 

12. springboot定时任务

@EnableScheduling//开启spring定时任务
//  http://cron.qqe2.com/
//@Scheduled(cron="0 * * * * ?")// 间隔1分钟执行
@Scheduled(cron = "0/5 * * * * ? ") // 间隔5秒执行
public void reportCurrentTime() {
    SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
    System.out.println("现在时间:" + dateFormat.format(new Date()));
}

 

13.springboot拦截器配置

效果:

13.1 自定义拦截器类

/**
 * 公司:马氏集团
 * 文件名:LoginIntercept
 * 作者:  18392
 * 时间: 2019/4/28 22:35
 * 描述:
 */
package cn.guang.boottime.utils;

import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
    /*
    *  自定义拦截器类
    *  放行注册  验证码   登录等方法
     * @Author sunshine
     * @Description //TODO
     * @Date 22:49 2019/4/28
     * @Param
     * @return
     **/

@Component
public class LoginIntercept implements HandlerInterceptor {

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        //解决乱码 及跨域
                response.setContentType("text/html; charset=utf-8");
                response.setHeader("Access-Control-Allow-Origin", "*");//解决json跨域
        //自己进行改造   到时候  判断session区域中是否存在用户  存在放行 否则到登录页面
        System.out.println("开始拦截");
        String token = request.getParameter("token");
        if (StringUtils.isEmpty(token)) {
            response.getWriter().println("请先登录");//实际上要跳转页面的
            return false;
        }
        return true;
    }

}

 

13.2 配置启动 自定义拦截器类

/**
 * 公司:马氏集团
 * 文件名:WebConfig
 * 作者:  18392
 * 时间: 2019/4/27 22:27
 * 描述:
 */
package cn.guang.boottime.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/*
* 用于配置启动 自定义拦截器类
 * @Author sunshine
 * @Description //TODO
 * @Date 22:57 2019/4/28
 * @Param
 * @return
 **/
@Configuration
public class WebConfig implements  WebMvcConfigurer  {

    @Autowired
    private LoginIntercept loginIntercept;//自己定义的

    // 这个方法是用来配置静态资源的,比如html,js,css,等等
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) { }

    // 这个方法用来注册拦截器,我们自己写好的拦截器需要通过这里添加注册才能生效
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // addPathPatterns("/**") 表示拦截所有的请求,
        // excludePathPatterns("/login", "/register") 表示除了登陆与注册之外,因为登陆注册不需要登陆也可以访问
        registry.addInterceptor(loginIntercept).addPathPatterns("/**").excludePathPatterns("/login", "/register");
    }

}

 

 

13.3  改造为登录 代码

效果:

未登录前:

 

登录成功 可以访问其他方法

 

代码编写:

(1) 配置数据源

(2) 新建 实体类

(3) 三层代码编写   controller层简单处理一下业务

 

 

附上代码

码云:https://gitee.com/Luck_Me/Interceptor/tree/master

百度云:

        链接:https://pan.baidu.com/s/1aoZAlIlr9bBVwguJ_hVGPg 
        提取码:saex 

14. 配置静态资源变量

//注入配置变量
@Value("${ip}")
private  String ip;

 

效果:

 

 

开发步骤:

(1) 配置文件中定义变量

(2) 子需要的类中注入变量对象

(3) 需要的地方调用

   

15.springboot 事务配置及应用

效果:

很简单  只要在需要事务的方法上加上事务注解即可

@Transactional//开启事务注解

16. 使用热部署插件  devtools

 

参考:

    https://www.cnblogs.com/shenlanzhizun/p/8027238.html

 

效果:当后台代码改变的时候 该插件帮助我们自动重启服务

配置步骤:

(1) 添加相关jar

<!--3.4 热加载 插件devtools-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
    <scope>true</scope>
</dependency>
<configuration>
    <fork>true</fork>
</configuration>

(2) 设置里面加上自动编译

 

效果:

© 著作权归作者所有

Lucky_Me
粉丝 17
博文 234
码字总数 89927
作品 0
美国
私信 提问
加载中

评论(1)

Lucky_Me
Lucky_Me 博主
😴
Spring Boot 最核心的 3 个注解详解

最近面试一些 Java 开发者,他们其中有些在公司实际用过 Spring Boot, 有些是自己兴趣爱好在业余自己学习过。然而,当我问他们 Spring Boot 最核心的 3 个注解是什么,令我失望的是鲜有人能答...

Java技术栈
2018/10/16
1K
0
spring boot框架学习8-【干货】spring boot的web开发(4)-自定义拦截器处理权限

本章节主要内容: 通过前面的学习,我们了解并快速完成了spring boot第一个应用。spring boot企业级框架,那么spring boot怎么读取静态资源?如js文件夹,css文件以及png/jpg图片呢?怎么自定...

中凯_凯哥java
2017/11/11
117
0
Spring Boot 2 如何优雅集成发送邮件?

点击蓝色“泥瓦匠BYSocket”,关注我哟 加个“星标”,不忘签到哦 作者:周立@IT牧场 GitHub: http://www.itmuch.com/spring-boot/send-email/ 本文基于:Spring Boot 2.1.3,理论支持Sprin...

泥瓦匠BYSocket
05/14
0
0
Spring Boot,Spring cloud加起来有385个包,学习成本太大了

相比以前的spring,核心包才十来个 虽然入门难 但是慢慢的用下来 还是积累了好多知识。 现在spring出的boot光包就有165个。写第一个hello world确实很快,但是后面的学习成本太高了。想要用好...

湖水没了
2016/11/30
4K
10
spring boot框架学习7-spring boot的web开发(3)-自定义消息转换器

http://kaigejava.com/article/list?cateid=3 本章节主要内容: 通过前面的学习,我们了解并快速完成了spring boot第一个应用。spring boot企业级框架,那么spring boot怎么读取静态资源?如...

中凯_凯哥java
2017/11/09
71
0

没有更多内容

加载失败,请刷新页面

加载更多

js如何控制table中的某一行动态置顶

两行代码搞定: $('#'+item.roadCode).fadeOut().fadeIn();//获取到需要置顶的行 $(".table").prepend($('#'+item.roadCode)); 其中,fadeOut()方法 作用 --- 从可见到隐藏 如下: prepend(......

码妞
今天
4
0
四种解决Nginx出现403 forbidden 报错的方法

我是在在本地用虚拟机中通过yum安装nginx的,安装一切正常,但是访问时报403, 于是查看nginx日志,路径为/var/log/nginx/error.log。打开日志发现报错Permission denied,详细报错如下: 1....

dragon_tech
今天
3
0
获取RestResultResponse返回的值

Springboot项目,需要调其他服务的接口,返回值类型是RestResultResponse 打断点的结果集是这个 打印出来的getData(): [{id=3336b624-8474-4dd9-bd5b-c7358687c877, paraNo=104, para=Postpo...

栾小糖
今天
4
0
【小学】 生成10以内的加减法

#!/usr/bin/env python# coding: utf-8from random import randrange# 题目的最大数值R_MAX = 10# 生成的题目的数量R_PAGE = 70# 生成减法列表def get_sub_list():...

Tensor丨思悟
今天
11
0
JavaScript设计模式——适配器模式

  适配器模式是设计模式行为型模式中的一种模式;   定义:   适配器用来解决两个已有接口之间不匹配的问题,它并不需要考虑接口是如何实现,也不用考虑将来该如何修改;适配器不需要修...

有梦想的咸鱼前端
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部