SpringBoot 学习笔记
文章目录
- SpringBoot
- 1 SpringBoot 的纯注解配置(了解)
- 1.1 环境搭建
- 1.1.1 jdbc配置
- 1.1.2 mybatis配置
- 1.1.3 transactional配置
- 1.1.4 service配置
- 1.1.5 springmvc配置
- 1.1.6 servlet配置
- 1.1.7 存在的问题
- 1.2 新注解说明
- 1.2.1 @Configuration
- 1.2.2 @ComponentScan
- 1.2.3 @Bean
- 1.2.4 @PropertySource
- 1.2.5 @Import
- 1.3 Spring的纯注解配置
- 1.3.1 JdbcConfig
- 1.3.2 MybatisConfig
- 1.3.3 TxConfig
- 1.3.4 SpringConfig
- 1.3.5 SpringMvcConfig
- 1.3.6 WebConfig
- 1.3.7 删除xml配置文件
- 1.3.8 修改web.xml
- 1.3.9 测试
- 2 Spring Boot入门
- 2.1 Spring Boot的介绍
- 2.1.1 什么是Spring Boot
- 2.1.2 Spring Boot 特点
- 2.2 构建 Spring Boot 项目
- 2.2.1 下载SpringBoot项目
- 2.2.2 maven构建SpringBoot项目
- 2.2.3 pom.xml
- 2.2.3.1 继承springboot父工程
- 2.2.3.2 设置编码格式
- 2.2.3.3添加启动器
- 2.2.3.4 创建启动类
- 2.2.3 SpringBoot 的 Starter
- 2.2.3.1 Starters命名
- 2.3 Spring Boot入门HelloWorld
- 2.3.1 pom.xml
- 2.3.2 创建启动类
- 2.3.3 Controller
- 2.4 Spring Boot的全局配置文件
- 2.5 Spring Boot项目的两种发布方式
- 2.5.1 方式1:通过jar包发布
- 2.5.2 方式2:通过war包发布
- 3 springboot整合全局异常处理器
- 3.1 自定义错误页面
- 3.1.1 controller
- 3.1.2 错误页面
- 3.2 整合非ajax全局异常处理器
- 3.2.1创建处理器
- 3.2.2 错误页面
- 3.3 整合ajax全局异常处理
- 3.3.1 创建全局异常处理器
- 4 springboot整合junit
- 4.1 Junit启动器
- 4.2 编写业务代码
- 4.2.1 dao
- 4.2.2 service
- 4.2.3 app
- 4.3 整合Junit
- 5 SpringBoot整合MyBatis
- 5.1 pom.xml
- 5.2 application.properties
- 3、App
- 6 SpringBoot整合拦截器
- 6.1 创建拦截器
- 6.2 配置拦截器
- 7 SpringBoot整合日期转换器
- 7.1 创建日期转换器
- 7.2 配置日期转换器
- 8 Spring Boot多环境配置
- 8.1 需求
- 8.2 运行项目:
- 8.3 单个yml方式
- 8.4 多个yml方式
- 9 logback日志记录器
- 9.1 logback介绍
- 9.2 logback.xml
- 10 SpringBoot自动配置原理
- 10.1 @SpringBootApplication
- 10.2@SpringBootConfiguration注解
- 10.3 @EnableAutoConfiguration注解
- 10.3.1 @AutoConfigurationPackage注解
- 10.3.2 @Import注解
- 10.4 @ComponentScan
- 10.3 @EnableAutoConfiguration注解
- 10.3.1 @AutoConfigurationPackage注解
- 10.3.2 @Import注解
- 10.4 @ComponentScan
SpringBoot
1 SpringBoot 的纯注解配置(了解)
1.1 环境搭建
拷贝ssm工程:
项目结构如下
1.1.1 jdbc配置
<!--引入db.properties-->
<context:property-placeholder location="classpath:db.properties"></context:property-placeholder>
<!--配置数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /><property name="driverClassName" value="${jdbc.driver}" />
</bean>
1.1.2 mybatis配置
<!--配置sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"></property>
</bean><!--配置mybatis要扫描的包,且把mybatis生成的代理类交给spring的IOC容器管理-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.by.mapper"></property><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
1.1.3 transactional配置
<!--事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property>
</bean>
<!--开启事务注解的支持-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
1.1.4 service配置
<!--配置spring要扫描的包-->
<context:component-scan base-package="com.by.service"></context:component-scan>
1.1.5 springmvc配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!--配置spirngmvc要扫描的包:把controller和方法放容器--><context:component-scan base-package="com.by.controller,com.by.exception"></context:component-scan><!--视图解析器--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/pages/"></property><property name="suffix" value=".jsp"></property></bean><!--开启springmvc注解的支持:注册HandlerMapping和HandlerAdaptorconversion-service="cs" 转换名为cs的服务--><mvc:annotation-driven conversion-service="cs"></mvc:annotation-driven><!--配置上传解析器--><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!--单位byte--><property name="maxUploadSize" value="5242880"></property><!--编码格式--><property name="defaultEncoding" value="UTF-8"></property></bean><!--配置静态资源的访问路径和位置--><mvc:resources mapping="/head/**" location="/head/"></mvc:resources><!--配置日期转换器工厂--><bean id="cs" class="org.springframework.context.support.ConversionServiceFactoryBean"><property name="converters"><set><bean class="com.by.converter.DateConverter"></bean></set></property></bean><!-- 配置拦截器--><mvc:interceptors><mvc:interceptor><!--mapping 拦截路径/**/--><mvc:mapping path="/**"/><!--不拦截路径 exclude-mapping /user/**--><mvc:exclude-mapping path="/user/**"/><bean class="com.by.interceptor.LoginInterceptor"/></mvc:interceptor></mvc:interceptors>
</beans>
1.1.6 servlet配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0">
<!--配置监听器:加载application-*.xml-->
<welcome-file-list><welcome-file>login.jsp</welcome-file>
</welcome-file-list>
<context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext-*.xml</param-value>
</context-param>
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener><!--配置前端控制器:1、接受请求 2、加载springmvc-->
<servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping><!-- 过滤器 解决中文乱码问题 -->
<filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><!-- 设置过滤器中的属性值 --><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param>
</filter>
<!-- 过滤所有请求 -->
<filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
1.1.7 存在的问题
有太多的xml文件需要配置,如果能用注解配置就可以脱离xml文件了
1.2 新注解说明
1.2.1 @Configuration
-
作用:
用于指定当前类是一个spring配置类,可替换xml配置文件,作用和在spring的xml配置文件是一样的。
-
示例代码
/*** spring的配置类*/ @Configuration public class SpringConfiguration{ }
1.2.2 @ComponentScan
-
作用:
用于指定spring在初始化容器时要扫描的包。作用和在spring的xml配置文件中的:
<context:component-scan base-package="com.by"/>
是一样的。 -
属性:
basePackages:用于指定要扫描的包。和该注解中的value属性作用一样。
-
示例代码
/*** spring的配置类*/ @Configuration @ComponentScan(basePackages = "com.by")//等价于<context:component-scan> public class SpringConfiguration{ }
1.2.3 @Bean
-
作用:
该注解只能写在方法上,表明使用此方法创建一个对象,并且放入spring容器。作用和在spring的xml配置文件中的:
<bean/>
是一样的。 -
属性:
name:给当前@Bean注解方法创建的对象指定一个名称(即bean的id)。
-
示例代码
public class Dog {private String nam;private Integer age;//set get...... }
@Bean public Dog dog(){Dog dog = new Dog();dog.setNam("二狗");dog.setAge(18);return dog; }
1.2.4 @PropertySource
-
作用:
用于加载*.properties文件中的配置。作用和在spring的xml配置文件中的:
<context:property-placeholder location="">
是一样的。 -
属性:
value[]:用于指定properties文件位置。如果是在类路径下,需要写上classpath:
-
示例代码
#config.properties nam=二狗 age=18
@PropertySource("classpath:config.properties") public class SpringConfiguration {@Value("${nam}")private String nam;@Value("${age}")private Integer age;@Beanpublic Dog dog(){Dog dog = new Dog();dog.setNam(nam);dog.setAge(age);return dog;} }
1.2.5 @Import
-
作用:
@Import注解是用来导入配置类或者一些需要前置加载的类。作用和在spring的xml配置文件中的:
<import resource=""></import>
是一样. -
属性:
value[]:用于指定其他配置类的字节码。
-
示例代码
@Configuration @ComponentScan(basePackages = "com.by") @Import({Configuration_Other.class}) public class SpringConfiguration {}@PropertySource("classpath:config.properties") public class Configuration_Other {}
1.3 Spring的纯注解配置
1.3.1 JdbcConfig
@PropertySource("classpath:db.properties")//等价于 <context:property-placeholder 也就是引入配置文件
public class JdbcConfig {//配置数据源@Value("${jdbc.url}")private String url;@Value("${jdbc.username}")private String userName;@Value("${jdbc.password}")private String password;@Value("${jdbc.driver}")private String driver;@Bean(value = "dataSource")//等价于bean标签public DataSource getDataSource(){DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName(driver);dataSource.setUrl(url);dataSource.setUsername(userName);dataSource.setPassword(password);return dataSource;}
}
1.3.2 MybatisConfig
public class MybatisConfig {@Bean//value不赋值,则使用方法名当IOC容器的keypublic SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();sessionFactoryBean.setDataSource(dataSource);return sessionFactoryBean;}@Beanpublic MapperScannerConfigurer mapperScannerConfigurer(){MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();mapperScannerConfigurer.setBasePackage("com.by.mapper");mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactoryBean");return mapperScannerConfigurer;}
}
1.3.3 TxConfig
//开启事务注解的支持
@EnableTransactionManagement//等价于 <tx:annotation-driven
public class TxConfig {@Beanpublic DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource) {DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();transactionManager.setDataSource(dataSource);return transactionManager;}
}
1.3.4 SpringConfig
@Configuration
@ComponentScan({"com.by.controller", "com.by.exception"})// <!--配置springMVC扫描的包:把controller和方法放容器-->
@EnableWebMvc//等同于<mvc:annotation-driven></mvc:annotation-driven>
public class SpringMVCConfig implements WebMvcConfigurer {//视图解析器@Beanpublic ViewResolver viewResolver() {InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();internalResourceViewResolver.setPrefix("/WEB-INF/pages/");internalResourceViewResolver.setSuffix(".jsp");return internalResourceViewResolver;}// <!--配置上传解析器-->@Beanpublic CommonsMultipartResolver multipartResolver(){CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();multipartResolver.setMaxInMemorySize(5242880);multipartResolver.setDefaultEncoding("UTF-8");return multipartResolver;}//配置日期转换器@Overridepublic void addFormatters(FormatterRegistry registry) {registry.addConverter(new DateConverter());}// <!-- 配置拦截器-->@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()).excludePathPatterns("/user/**").addPathPatterns("/**");}// <!--配置静态资源的访问路径和位置-->@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/head/**").addResourceLocations("/head/");}
}
1.3.5 SpringMvcConfig
@Configuration
@ComponentScan({"com.by.controller", "com.by.exception"})// <!--配置springMVC扫描的包:把controller和方法放容器-->
@EnableWebMvc//等同于<mvc:annotation-driven></mvc:annotation-driven>
public class SpringMVCConfig implements WebMvcConfigurer {//视图解析器@Beanpublic ViewResolver viewResolver() {InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();internalResourceViewResolver.setPrefix("/WEB-INF/pages/");internalResourceViewResolver.setSuffix(".jsp");return internalResourceViewResolver;}// <!--配置上传解析器-->@Beanpublic CommonsMultipartResolver multipartResolver(){CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();multipartResolver.setMaxInMemorySize(5242880);multipartResolver.setDefaultEncoding("UTF-8");return multipartResolver;}//配置日期转换器@Overridepublic void addFormatters(FormatterRegistry registry) {registry.addConverter(new DateConverter());}// <!-- 配置拦截器-->@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()).excludePathPatterns("/user/**").addPathPatterns("/**");}// <!--配置静态资源的访问路径和位置-->@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/head/**").addResourceLocations("/head/");}
}
1.3.6 WebConfig
public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer {//加载Spring配置类@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[]{ServiceConfig.class};}//加载SpringMVC配置类@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMVCConfig.class};}//设置SpringMVC请求地址拦截规则@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}//设置post请求中文乱码过滤器@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();encodingFilter.setEncoding("UTF-8");return new Filter[]{encodingFilter};}
}
1.3.7 删除xml配置文件
因为已经用注解代替配置文件了,所以可以删除xml配置文件,检测一下是否配置成功
1.3.8 修改web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><welcome-file-list><welcome-file>login.jsp</welcome-file></welcome-file-list>
</web-app>
1.3.9 测试
删除xml配置文件后仍然正常访问。这样就大大减少了繁琐的xml文件的配置。
2 Spring Boot入门
2.1 Spring Boot的介绍
2.1.1 什么是Spring Boot
Spring Boot是由Pivotal团队提供的全新框架,其中“Boot”的意思就是“引导”,Spring Boot 并不是对 Spring 功能上的增强,而是提供了一种快速开发 Spring应用的方式。
不是对spring功能的增强(spring+springmvc),而是提供了一种快速开发spring应用的方式(xml—>注解)
2.1.2 Spring Boot 特点
- 零xml配置
- 简化maven配置
- 内嵌tomcat
2.2 构建 Spring Boot 项目
2.2.1 下载SpringBoot项目
1、访问http://start.spring.io/
2、选择构建工具Maven Project、Spring Boot版本以及一些工程基本信息,点击“GENERETE”下载项目压缩包
参考下图所示:
2.2.2 maven构建SpringBoot项目
1、创建maven工程,不要使用骨架
2、填写项目坐标信息
3、设置项目保存位置
2.2.3 pom.xml
参考下载的springboot项目修改pom.xml
2.2.3.1 继承springboot父工程
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.2.RELEASE</version><relativePath/> <!-- lookup parent from repository -->
</parent>
2.2.3.2 设置编码格式
<!-- 项目源码及编译输出的编码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
2.2.3.3添加启动器
<dependencies><!-- springboot的web启动器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
2.2.3.4 创建启动类
package com.by;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
2.2.3 SpringBoot 的 Starter
2.2.3.1 Starters命名
-
官方启动器命名:
- 前缀:spring-boot-starter-
- 规范:spring-boot-starter-模块名
- 举例:spring-boot-starter-web、spring-boot-starter-jdbc
-
第三方启动器命名:
- 后缀:-spring-boot-starter
- 规范:模块名-spring-boot-starter
- 举例:mybatis-spring-boot-starter
2.3 Spring Boot入门HelloWorld
2.3.1 pom.xml
-
继承父工程
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.4</version><relativePath/> <!-- lookup parent from repository --> </parent>
-
添加启动器
<!-- springboot的web启动器--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency>
2.3.2 创建启动类
注意启动类所在的包:必须是controller、service和mapper的上级目录
com/by/SpringBootHelloWorldApp.java
@SpringBootApplication
public class SpringBootHelloWorldApp {public static void main(String[] args) {//通过反射判断App类上是否添加了@SpringBootApplication注解,若添加则扫描当前类所在的包(即当作启动类)SpringApplication.run(SpringBootHelloWorldApp.class,args);}
}
2.3.3 Controller
@Controller
public class HelloController {@RequestMapping("/hello")@ResponseBodypublic Map hello(){Map<String, Object> map = new HashMap();map.put("msg","你好");return map;}
}
2.4 Spring Boot的全局配置文件
- application.properties
server.port=7777
server.servlet.context-path=/springboot_helloWorld - application.yml
server:
port: 7777
servlet:
context-path: springboot_helloWorld
yml语法:
“.”------->“:回车”
“=”------->“:空格”
空格缩进
2.5 Spring Boot项目的两种发布方式
2.5.1 方式1:通过jar包发布
步骤1:在pom中添加一个SpringBoot的构建的插件
<build><plugins><plugin><groupId>org.springframework.boot</groupId><!--自动检测项目中的 main 函数--><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
步骤2:在maven视图中,选择“package”,在target中会产生xxx.jar包
步骤3:然后在cmd终端发布项目
java -jar xxx.jar
2.5.2 方式2:通过war包发布
步骤1:在pom.xml文件中将jar修改为war
<packaging>war</packaging>
步骤2:设置tomcat启动器依赖范围
maven依赖范围参考:资料/maven依赖作用范围.png
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><!--tomcat启动器依赖范围--><scope>provided</scope></dependency>
步骤3:设置war包的名字
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><configuration><warName>hello</warName></configuration></plugin>
步骤4:修改启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;@SpringBootApplication
public class Application extends SpringBootServletInitializer {@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {return builder.sources(Application.class);}public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
3 springboot整合全局异常处理器
3.1 自定义错误页面
SpringBoot默认的处理异常的机制:SpringBoot 默认的已经提供了一套处理异常的机制。一旦程序中出现了异常 SpringBoot 会向/error 的 url 发送请求。在 springBoot 中提供了一个叫 BasicErrorController 来处理/error 请求,然后跳转到默认显示异常的页面来展示异常信息
如 果我 们 需 要 将 所 有 的 异 常 同 一 跳 转 到 自 定 义 的 错 误 页 面 , 需 要 再src/main/resources/
templates 目录下创建 error.html 页面。注意:名称必须叫 error
3.1.1 controller
/*** SpringBoot处理异常方式一:自定义错误页面*/
@Controller
public class DemoController {@RequestMapping("/show")public String showInfo(){String str = null;str.length();return "index";}@RequestMapping("/show2")public String showInfo2(){int a = 10/0;return "index";}
}
3.1.2 错误页面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>错误提示页面</title>
</head>
<body>出错了,请与管理员联系。。。<span th:text="${error}"></span>
</body>
</html>
3.2 整合非ajax全局异常处理器
3.2.1创建处理器
/*** 通过实现HandlerExceptionResolver接口做全局异常处理*/
@Component
public class GlobalExceptionResolver implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,Exception ex) {ModelAndView mv = new ModelAndView();//判断不同异常类型,做不同视图跳转if(ex instanceof ArithmeticException){mv.setViewName("error1");}else if(ex instanceof NullPointerException){mv.setViewName("error2");}mv.addObject("error", ex.toString());return mv;}
}
3.2.2 错误页面
error1.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>错误提示页面-ArithmeticException</title>
</head>
<body>出错了,请与管理员联系。。。<span th:text="${error}"></span>
</body>
</html>
error2.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>错误提示页面-NullPointerException</title>
</head>
<body>出错了,请与管理员联系。。。<span th:text="${error}"></span>
</body>
</html>
3.3 整合ajax全局异常处理
3.3.1 创建全局异常处理器
@ControllerAdvice
public class AjaxGlobalExceptionHandler {/*** 处理全局异常* @param exception 异常* @return Map<String, Object>*/@ResponseBody@ExceptionHandler(value = Exception.class)public Map<String, Object> errorHandler(Exception exception) {Map<String, Object> map = new HashMapMap<>();map.put("status", 500);map.put("msg", exception.getMessage());return map;}
}
4 springboot整合junit
4.1 Junit启动器
<!--junit启动器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency>
4.2 编写业务代码
4.2.1 dao
@Repository
public class UserDaoImpl {public void saveUser(){System.out.println("insert into users.....");}
}
4.2.2 service
@Service
public class UserServiceImpl {@Autowiredprivate UserDaoImpl userDaoImpl;public void addUser(){this.userDaoImpl.saveUser();}
}
4.2.3 app
@SpringBootApplication
public class App {public static void main(String[] args) {SpringApplication.run(App.class, args);}
}
4.3 整合Junit
/*** main方法:* ApplicationContext ac=new * ClassPathXmlApplicationContext("classpath:applicationContext.xml");* junit与spring整合:* @RunWith(SpringJUnit4ClassRunner.class):让junit与spring环境进行整合* @Contextconfiguartion("classpath:applicationContext.xml") */
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes={App.class})
public class UserServiceTest {@Autowiredprivate UserServiceImpl userServiceImpl;@Testpublic void testAddUser(){this.userServiceImpl.addUser();}
}
5 SpringBoot整合MyBatis
5.1 pom.xml
添加依赖:
spring-boot-starter-web、
mybatis-spring-boot-starter、
mysql-connector-java、
druid、
spring-boot-starter-test
5.2 application.properties
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3307/springboot?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
3、App
@SpringBootApplication
@MapperScan("com.by.mapper")
public class App{.......
}
6 SpringBoot整合拦截器
6.1 创建拦截器
@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {Object user = request.getSession().getAttribute("user");if (user != null){return true;}response.sendRedirect("/");return false;}
}
6.2 配置拦截器
@Component
public class SpringMvcConfig implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/user/*").excludePathPatterns("/user/login");}
}
7 SpringBoot整合日期转换器
7.1 创建日期转换器
@Component
public class DateConverter implements Converter<String,Date> {@Overridepublic Date convert(String string) {String[] patterns = new String[]{"yyyy-MM-dd","yyyy-MM-dd hh:mm:ss","yyyy/MM/dd","yyyy/MM/dd hh:mm:ss","MM-dd-yyyy","dd-MM-yyyy"};try {return DateUtils.parseDate(string,patterns);} catch (ParseException e) {e.printStackTrace();}return null;}
}
7.2 配置日期转换器
@Component
public class SpringMvcConfig implements WebMvcConfigurer {@Autowiredprivate DateConverter dateConverter;@Overridepublic void addFormatters(FormatterRegistry registry) {registry.addConverter(dateConverter);}
}
8 Spring Boot多环境配置
- Spring Boot多环境配置
- logback日志记录器
Spring Boot的针对不同的环境创建不同的配置文件,
语法结构:application-{profile}.properties
profile:代表的就是一套环境
8.1 需求
application-dev.yml 开发环境 端口8090
application-test.yml 测试环境 端口8091
application-prod.yml 生产环境 端口8092
8.2 运行项目:
在application.yml 中激活指定的配置文件:
#激活指定的配置文件
spring.profiles.active=dev
8.3 单个yml方式
yml支持多文档块的方式:
spring:profiles:active: prod #激活dev环境
---
#开发环境
spring:profiles: dev #环境名称
server:port: 8090 #端口号
---
#开发环境
spring:profiles: test #环境名称
server:port: 8091 #端口号
---
#开发环境
spring:profiles: prod #环境名称
server:port: 8092 #端口号
8.4 多个yml方式
一个application.yml主文件,在主文件里选定要使用的文件,application-dev.yml,application-test.yml,application-prod.yml是不同的环境
application.yml
spring:profiles:active: dev #这里选定的是dev环境,自动匹配application-dev.yml的配置datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3307/springboot?characterEncoding=UTF-8username: rootpassword: 123type: com.alibaba.druid.pool.DruidDataSource
application-dev.yml,这里指定端口号为8081
server:port: 8081
application-test.yml
server:port: 8082
application-prod.yml
server:port: 8083
9 logback日志记录器
9.1 logback介绍
logback是log4j团队创建的开源日志组件,与log4j类似但是比log4j更强大,是log4j的改良版本。主要优势在于:
a) 更快的实现,logback内核重写过,是的性能有了很大的提升,内存占用也更小。
b) logback-classic对slf4j进行了更好的集成
c) 自动重新加载配置文件,当配置文件修改后,logback-classic能自动重新加载配置文件
d) 配置文件能够处理不同的情况,开发人员在不同的环境下(开发,测试,生产)切换的时候,不需要创建多个
文件,可以通过标签来实现
e) 自动压缩已经打出来的日志文件:RollingFileAppender在产生新文件的时候,会自动压缩已经打印出来的日志
文件。而且这个压缩的过程是一个异步的过程。
9.2 logback.xml
<?xml version="1.0" encoding="UTF-8" ?><configuration>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--> <property name="LOG_HOME" value="${catalina.base:-.}/logs/" /> <!-- 控制台输出 --> <appender name="Stdout" class="ch.qos.logback.core.ConsoleAppender"><!-- 日志输出编码 --> <layout class="ch.qos.logback.classic.PatternLayout"> <!--日志输出格式:%d表示日期时间,%thread表示线程名,%-5level:级别从左显示5个字符宽度%logger{50} 表示class的全名最长50个字符,否则按照句点分割%msg:日志消息%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n </pattern> </layout> </appender> <!-- 按照每天生成日志文件 --> <appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!--日志文件输出的文件名--><FileNamePattern>${LOG_HOME}/server.%d{yyyy-MM-dd}.log</FileNamePattern> <MaxHistory>30</MaxHistory></rollingPolicy> <layout class="ch.qos.logback.classic.PatternLayout"> <!--日志输出格式:%d表示日期时间,%thread表示线程名,%-5level:级别从左显示5个字符宽度%logger{50} 表示class的全名最长50个字符,否则按照句点分割%msg:日志消息%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n </pattern> </layout> <!--日志文件最大的大小--><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><MaxFileSize>10MB</MaxFileSize></triggeringPolicy></appender> <!-- 日志输出级别 --><root level="DEBUG"> <appender-ref ref="Stdout" /> <appender-ref ref="RollingFile" /> </root> <!--日志异步到数据库 -->
<!-- <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">日志异步到数据库 <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">连接池 <dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource"><driverClass>com.mysql.jdbc.Driver</driverClass><url>jdbc:mysql://127.0.0.1:3306/databaseName</url><user>root</user><password>root</password></dataSource></connectionSource></appender> --></configuration>
10 SpringBoot自动配置原理
10.1 @SpringBootApplication
springboot是基于spring的新型的轻量级框架,最厉害的地方当属**自动配置。**那我们就可以根据启动流程和相关原理来看看,如何实现传奇的自动配置
@SpringBootApplication//标注在某个类上,表示这个类是SpringBoot的启动类
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
从上面代码可以看出,Annotation定义(@SpringBootApplication)和类定义(SpringApplication.run)最为耀眼,所以要揭开SpringBoot的神秘面纱,我们要从这两位开始就可以了。
@SpringBootConfiguration//表示当前类是一个配置类
@EnableAutoConfiguration //开启SpringBoot自动装配功能
@ComponentScan(excludeFilters = {// 扫描路径设置@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes =AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
...
}
10.2@SpringBootConfiguration注解
包括了@Configuration,配合@Bean代替xml配置文件的形式注入bean:
a)xml配置文件的形式注入bean
<bean id="mockService" class="..MockServiceImpl">
...
</bean>
b)注解配置形式注入bean
@Configuration
public class MockConfiguration{/**任何一个标注了@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器,方法名将默认成该 *bean定义的id。*/@Beanpublic MockService mockService(){return new MockServiceImpl();}
}
10.3 @EnableAutoConfiguration注解
@EnableAutoConfiguration:开启SpringBoot自动装配功能
@AutoConfigurationPackage//controller、service----->IOC容器
@Import(EnableAutoConfigurationImportSelector.class)//自动配置
public @interface EnableAutoConfiguration {
...
}
10.3.1 @AutoConfigurationPackage注解
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {}
AutoConfigurationPackages.Registrar.class将启动类(@SpringBootApplication标注的类)的所在包及子包里面所有组件扫描到Spring容器;
10.3.2 @Import注解
EnableAutoConfigurationImportSelector读取META-INF/spring.factories的值,将这些值作为配置类加载到IOC容器中,帮助我们进行自动配置工作。
10.4 @ComponentScan
我们可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从@ComponentScan所在类的package进行扫描。
括了@Configuration,配合@Bean代替xml配置文件的形式注入bean:
a)xml配置文件的形式注入bean
<bean id="mockService" class="..MockServiceImpl">
...
</bean>
b)注解配置形式注入bean
@Configuration
public class MockConfiguration{/**任何一个标注了@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器,方法名将默认成该 *bean定义的id。*/@Beanpublic MockService mockService(){return new MockServiceImpl();}
}
10.3 @EnableAutoConfiguration注解
@EnableAutoConfiguration:开启SpringBoot自动装配功能
@AutoConfigurationPackage//controller、service----->IOC容器
@Import(EnableAutoConfigurationImportSelector.class)//自动配置
public @interface EnableAutoConfiguration {
...
}
10.3.1 @AutoConfigurationPackage注解
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {}
AutoConfigurationPackages.Registrar.class将启动类(@SpringBootApplication标注的类)的所在包及子包里面所有组件扫描到Spring容器;
[外链图片转存中…(img-s2HkQKE7-1719491759535)]
10.3.2 @Import注解
[外链图片转存中…(img-JX1QIRRT-1719491759535)]
[外链图片转存中…(img-Dw8I9gU3-1719491759536)]
[外链图片转存中…(img-t5djiSwd-1719491759536)]
EnableAutoConfigurationImportSelector读取META-INF/spring.factories的值,将这些值作为配置类加载到IOC容器中,帮助我们进行自动配置工作。
10.4 @ComponentScan
我们可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从@ComponentScan所在类的package进行扫描。
觉得好的话点个赞吧,谢谢啦!
相关文章:
SpringBoot 学习笔记
文章目录 SpringBoot1 SpringBoot 的纯注解配置(了解)1.1 环境搭建1.1.1 jdbc配置1.1.2 mybatis配置1.1.3 transactional配置1.1.4 service配置1.1.5 springmvc配置1.1.6 servlet配置1.1.7 存在的问题 1.2 新注解说明1.2.1 Configuration1.2.2 Component…...
Android 13 为应用创建快捷方式
参考 developer.android.google.cn 创建快捷方式 来自官网的说明: 静态快捷方式 :最适合在用户与应用互动的整个生命周期内使用一致结构链接到内容的应用。由于大多数启动器一次仅显示四个快捷方式,因此静态快捷方式有助于以一致的方式执行…...
PTA—C语言期末复习(选择题)
1. 按照标识符的要求,(A)不能组成标识符。 A.连接符 B.下划线 C.大小写字母 D.数字字符 在大多数编程语言中,标识符通常由字母(包括大写和小写)、数字和下划线组成,但不能以数字开头,…...
基于STM32的智能家用空气净化系统
目录 引言环境准备智能家用空气净化系统基础代码实现:实现智能家用空气净化系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景:空气净化管理与优化问题解决方案与优化收尾与总结 1. 引言 智能家用空气净化系…...
计算机图形学入门18:阴影映射
1.前言 前面几篇关于光栅化的文章中介绍了如何计算物体表面的光照,但是着色并不会进行阴影的计算,阴影需要单独进行处理,目前最常用的阴影计算技术之一就是Shadow Mapping技术,也就是俗称的阴影映射技术。 2.阴影映射 Shadow Map…...
电机应用相关名词介绍
1.电机转速 定义:电机转速指电机工作时旋转的速度,是衡量电机性能的重要指标之一。 单位: 每分钟转数(RPM):即Revolutions Per Minute,表示电机每分钟旋转的圈数。 每秒转数(RPS…...
哈尔滨等保测评解读
哈尔滨的信息系统安全等级保护测评(简称“等保测评”)是中国网络安全法规的一部分,旨在确保关键信息基础设施和其他重要信息系统的安全。下面是对哈尔滨等保测评的解读: 测评目的 等保测评的主要目的是评估信息系统是否满足国家规…...
python接口自动化的脚本
使用Requests库进行GET请求 Requests是Python中最常用的HTTP库,用于发送HTTP请求。下面是一个简单的GET请求示例,用于从API获取数据。 import requests url = "https://api.example.com/data" response = requests.get(url) if response.status_code == 200:prin…...
pdf转换成cad,这几个cad转换小妙招快码住!
在数字设计领域,PDF(Portable Document Format)和CAD(Computer-Aided Design)文件格式各有其独特之处。PDF常用于文件共享和打印,而CAD则是工程师和设计师们进行精确绘图和建模的必备工具。然而,…...
计算机组成原理——系统总线
题目:计算机使用总线结构便于增减外设,同时__C____。 A.减少了信息传送量 B.提高了信息传输速度 C.减少了信息传输线的条数 1. 总线的分类 1.1. 片内总线 芯片内部的总线 在CPU芯片内部,寄存器与寄存器之间、寄存器与逻辑单元ALU之间 1.1.1. 数据总线 双向传输总线 数…...
2024年6月大众点评广州餐饮店铺POI分析20万家
2024年6月大众点评广州餐饮店铺POI共有199175家 店铺POI点位示例: 店铺id k9uiFADtAvs9EdPC 店铺名称 点都德(聚福楼店) 十分制服务评分 8.6 十分制环境评分 8.3 十分制划算评分 8.5 人均价格 77 评价数量 41673 店铺地址 惠福东路470号(富临食府对面) 大…...
【最佳实践】前端如何搭建自己的cli命令行工具,让自己编码的时候如虎添翼
作为前端开发人员,搭建自己的前端CLI工具是一个有趣且有意义的事情。以下是一篇详细的教程,包括使用场景和案例。 使用场景 假设你是一个前端团队的一员,需要频繁地在不同的项目中执行一些标准化的任务,比如: 根据模…...
未来一周比特币价格及数字货币市场预测
荷月的比特币市场就像过山车一样,仅仅六月下旬就跌去-12%,本周更是暴跌-6%,至 58,378美元。在这种市场表现,应有的踩踏如期而至。德国政府今日宣布再出售750 比特币的行为继续打击多头,但是小编认为这恰恰预示着市场可…...
Qt Quick 教程(二)
文章目录 今天分析一段代码1. 注册单例类型2. 注册普通QML类型3. 注册C++类型到Qt元对象系统4.总结,具体解释5.如何在QML中使用这些注册的类型参考今天分析一段代码 // Register typesqmlRegisterSingletonType(QUrl("qrc:/StyleSheet.qml"), "Librum.style&qu…...
10个实用的Python编程实例,助你快速掌握Python技巧!
作为一门简洁易学且强大的编程语言,Python广泛应用于各个领域。本文将向大家介绍10个实用的Python编程实例,通过详细的实例代码帮助读者快速掌握Python的基础知识和常用技巧。 1. 计算阶乘 def factorial(n):if n 0:return 1else:return n * factorial…...
为什么要本地化您的多媒体内容?
当我们访问网站、应用程序和社交媒体时,体验不再局限于陈旧的文本和静态图像。现代处理能力和连接速度提高了快速加载视频、音频和动画的可能性。 这一切都提供了更具沉浸感和互动性的用户体验。多媒体是数字营销中最有效的内容之一,因为它对用户更具吸…...
MMCV【mmclassification】 从0到1 之 Docker 容器环境搭建步骤总结
🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 📙 Linux 下 Docker 安装环境检查Docker 安装 [ root 或者 sudo 权限用户可安装 ]给 普通用户 加入 Docker …...
深入探索Jetpack数据绑定(DataBinding)
Jetpack的数据绑定(DataBinding)库为我们提供了一个强大而灵活的工具,用于将UI组件与数据源绑定在一起。本文将深入探讨数据绑定的高级用法,包括双向绑定、自定义Binding Adapter、使用LiveData和ViewModel,以及如何处…...
vivado CELL_BLOAT_FACTOR、CFGBVS
CELL_BLOAT_FACTOR CELL_BLOAT_FACTOR属性用于指定添加“空白”或 增加单元格间距以增加分层单元格之间的放置距离 单元Vivado放置器会将模块中的单元隔开,以改善路由结果 设计。 当模块中的单元放置在一起时,可以使用单元膨胀,并且 从而在放…...
Linux—进程与计划管理
目录 一、程序 二、进程 1、什么是进程 2、进程的特点 3、进程、线程、携程 3.1、进程 3.2、线程 3.3、携程 三、查看进程信息 1、ps -aux 2、ps -elf 3、top 3.2、输出内容详解 3.2.1、输出第一部分解释 3.2.2、输出第二部分解释 4、pgrep 5、pstree 四、进…...
整数智能与上海数据交易所携手,共筑数据要素市场新篇章
近期,整数智能荣获上海数据交易所“数据治理服务商”证书,正式加入上海数据交易所数商生态,成为上海数据交易所官方认证的数据治理服务商。 在数字经济的浪潮中,上海数据交易所一直扮演着引领者和推动者的角色。紧扣建设国家级…...
计算机网络-自顶向下方法复习纲要
计算机网络-自顶向下方法复习纲要 第一章:计算机网络和因特网 协议:p6网络边缘:p6网络核心:p15存储转发传输机制:p16电路转发中的复用:p19-p20分组交换和电路交换的区别/对比:p18/p20分组交换…...
1.3.1 离散周期信号DFS
目录 离散周期序列的DFS表示 离散周期信号DFS的性质 线性特性 位移特性 对称特性 奇偶对称 共轭反转对称 实序列的对称特性 周期卷积 DFS——Discrete Fourier Series 傅里叶级数 离散周期序列的DFS表示 做题得到的小公式 离散周期信号DFS的性质 线性特性 位…...
springboot集成官方fastdfs以及fastdfs开启防盗链踩坑
目录 一、fastdfs原理 二、在springboot中使用fastdfs 三、fastdfs开启防盗链功能 四、fastdfs开启token验证踩坑 一、fastdfs原理 FastDFS是一个开源的轻量级分布式文件系统,它通过两个主要角色——跟踪器(Tracker)和存储节点(Storage)——来管理文件。 Tracker 主要…...
linux shell判断4g网络和有线网络状态
要在Linux中判断ppp0的4G网络和有线网络,并确保4G网络优先,可以使用以下方法: 首先,检查网络接口是否启用。可以使用ip link show命令查看网络接口的状态。 然后,使用ping命令测试网络连接。例如,可以分别ping一个有线网络和4G网络的网关,以确定哪个网络可用。 最后,根…...
[游戏开发][UE5]引擎使用学习记录
C Log和蓝图Log C Log 方法 UE_Log(参数1,参数2,参数3) //举例: UE_LOG(LogTemp, Error, TEXT("Log Info: %s"),"Test Log"); 三个参数的作用 参数1:输出窗口归类使用,你写什么它就显示什么 参数2&#x…...
微信小程序怎么使用JSON动画?
微信小程序怎么使用JSON动画? 前言: 在微信小程序中实现动画有很多种方式,今天主要讲JSON动画 css3动画jsAPI动画使用PAG素材做动画使用GIF播放动画使用JSON文件做动画 准备工作 JSON动画素材下载lottie-miniprogram插件创建微信小程序的…...
IOS Swift 从入门到精通:数组,集合,元组,对比,字典,枚举
目录 数组 集合 元组 Arrays vs sets vs tuples 字典 字典默认值 创建空集合 枚举 枚举关联值 枚举原始值 复杂类型:总结 数组 数组是存储为单个值的值的集合。例如,John、Paul、George 和 Ringo 是姓名,但数组可让您将它们分组为单个值,即 The Beatles。 在代…...
TextRank 算法
第1关:Jieba 在关键词提取中的应用 任务描述 本关任务:根据本关所学有关使用 Jieba 库进行关键词提取的知识,编写使用 Jieba 模块进行关键词提取的程序,并通过所有测试用例。 相关知识 为了完成本关任务,你需要掌握…...
压缩wsl的磁盘占用空间
本文说的是wsl 2。 1. 关闭wsl,在cmd窗口中输入如下命令: wsl --shutdown 2. 接着输入:diskpart 这个命令会弹出新的窗口 3. 在新的窗口中输入: select vdisk file"d:\vos\unbutu\ext4.vhdx" 其中的 d:\vos\unbut…...
什么是网站前置审批/广州seo排名收费
Greenberg等。(2007年)审查了有关潮汐和潮汐流模拟的足够水平分辨率的需求。 关键考虑因素如下。 潮汐运动 Δx≤(T√gH)/ n 其中Δx是网格大小;T是潮汐期;g是重力;H是平均水深;n是节…...
如何建一个公司网站/电子商务网站开发
本章节用到的命令主要有:mkfs,mke2fs,tune2fs,blkid,e2label,bc一、mkfs 命令前文中介绍了如何给磁盘分区,那么分好了区的磁盘,如何使用呢?首先需要对分区进行格式化。格…...
centos7如何安装wordpress/百度竞价广告代理
目录 题目描述:示例 :解法:题目描述: 给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。 示例 : 给定二叉树 1/ \2 3/ \ 4 5 返回 3, 它的长度是…...
一般用什么做网站首页/中小型企业网站设计与开发
迁移表空间databump使用databump导入导出,两个库用户必须一致,否则另一个库导入的时候会报错。所以两个库都是用helei用户。给两个数据库的用户分别授予dba权限,这里只是实验更清晰而已。SQL> create user helei identified by MANAGER;Us…...
vultr安装wordpress/30条新闻摘抄
最近遇到个isa无法连接配置存储的问题,最初发现设置isa策略不生效,通过日志检查到有些策略已经删除,但是还在应用,用户连接进来不通过新的策略检查isa时候发现警告:警报信息 描述: ISA 服务器无法连接到配置存储服务器…...
无代码做网站/windows优化大师是哪个公司的
原标题:Navicat for SQLite 表外键的秘密武器for SQLite 外键是在关联式表中符合另一个表主键的栏位。在外键选项卡,只需点击外键栏位即可编辑,使用外键工具栏,可创建新的、编辑或删除选定的外键栏位。Navicat for SQLite使用“名…...