springboot笔记
1,特性:
- 去除xml配置
- 全部使用注解开发
- 内嵌入tomcat
- 快速开发
2,创建项目
-
创建maven项目
-
引入依赖
<parent> <artifactId>spring-boot-starter-parent</artifactId> <groupId>org.springframework.boot</groupId> <version>2.6.7</version> </parent> <!-- parent的作用是引入一些依赖,以后引入依赖的时候就不需要版本号了 --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <!-- web引入的目的是引入spring和spring-mvc -->
-
引入这些依赖后就相当于引入了spring,springMVC,Tomcat等依赖
3,项目结构
- controller:视图层(web页面即跳转)和接口(业务逻辑)
- service:接口层(业务逻辑)
- dao:数据库访问层
4,RestController注解
- RestController注解规定了该类所有的URL映射都是返回JSON格式,由springMVC提供,协议为Http协议
- 和Controller的区别:如果使用Controller注解,那么该类如果想返回JSON格式的数据,需要再加上@ResponseBody注解,使用@RestController则不需要这一句冗余的代码,如果不加@ResponseBody,那么controller注解的类的方法返回值会默认跳转到另一个页面,即返回一个视图路由信息
- @ResponseBody:将数据传输类型变为JSON类型
5,启动方式
-
给任意类加上@EnableAutoConfigration注解,然后添加main方法,main方法代码:
public static void main(String[] args) { SpringApplication.run(HelloWorld.class, args); //两个参数,启动类的class和参数 } //这种做法只能扫描到当前类的路由信息可以在类上添加@ComponentScan()注解,在参数中添加扫描的包路径即可 //@EnableAutoConfiguration//启动类注解 //@ComponentScan("com.springboot.service")//解析路由时扫描包的注解
-
创建启动类,为启动类添加@SpringbootApplication注解,这个注解包含了@EnableAutoConfiguration和@ComponentScan注解,并且扫描包时在从同级目录开始寻找。代码:
@SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class); } }
6,静态资源访问
- 在项目中,图片,js代码,css代码常作为静态资源,使用时引入即可,这种资源放置方式为在resource目录下新建static目录,放置到static目录下即可通过ip:端口号/文件名 来访问: http://localhost:8080/img.png
7,配置文件
两种方式
-
application.properties:
user1.name =name22 user.age = 22
特点:冗余
-
application.yml
user1: name: zhh age: 23
配置方法:注解配置:
@Value("${user1.name}") private String name; @Value("${user1.age}") private String age;
8,视图跳转
-
导入freemarker依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency>
-
建立controller目录用来返回视图跳转信息
-
建立controller类:
@Controller public class freemarkerIndexController { @RequestMapping("/freemarkerIndex") public String freemarkerIndex(Map<String,String> result, HttpServletRequest request){ result.put("name","zhanghualong");//result用来存储信息,在视图中可以直接使用${var}形式来访问数据 //${var}的值为result.get(var) return "freemarkerIndex";//这里的返回值为视图名,springboot会自动在resource/templates下寻找对应的.ftlh文件 } }
-
建立视图
<html> <head> <title>Welcome!</title> </head> <body> ${name} </body> </html>
注:这里使用了freemarker引擎,这个引擎的作用是将我们写好的视图文件和后端文件一并解析为html文件,比如视图中的${name},就是freemarker负责解析,几种常见语法:
<#if sex==0> 男 <#elseif sex==1> 女 <else> 其他 </else> </#if> <#list userList as user> ${user} </#list> <!-- 注意:判断条件一定除了==其余一定要加括号比如<#if (age>17)></#if> -->
-
向视图中传值的两个方式
-
用参数传递:
public String freemarkerIndex(Map<String,Object> result){} //此时result就会被传递到视图页面中
-
用HttpServletRequest request传递
public String freemarkerIndex(HttpServletRequest request){ request.setAttribute("user1","bageyalu"); }
-
9,配置文件自动注入和装配
-
在.yml或者.properties问价中设置属性值,有两种方式可以引入实体类:
-
@Value注解:
public class HelloWorld { @Value("${user1.name}") private String name; @Value("${user1.age}") private String age; } /* yml文件: user1: name: zhanghualong age: 23 */
-
自动注入
@Component//将这个类注解为一个bean对象,其他引用这个对象可以直接用Autowired注解自动装配这个对象 @ConfigurationProperties(prefix = "user1")//参数为配置的类名 @Data//这个注解为lombok注解,为这个类提供了get和set方法,有参构造和无参构造以及tostring方法等方法 public class NiuMaEntity { private String name; private String age; private String add; }
-
-
自动配置实例:
@Component @ConfigurationProperties(prefix = "user1") @Data public class NiuMaEntity { private String name; private String age; private String add; } @RestController public class NiuMaController { @Autowired private NiuMaEntity niuMaEntity; @RequestMapping("/getNiuMa") public String getNiuMa(){ return niuMaEntity.getName() +","+niuMaEntity.getAge()+","+niuMaEntity.getAdd(); } } /* user1: name: zhl age: 22 add: 兰州 */ /*@ConfigurationProperties(prefix = "user1")注解需要注入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> */
10,配置文件占位符
-
在配置文件中,我们可以使用一些占位符来输出随机数等内容:如 r a n d o m . v a l u e 、 {random.value}、 random.value、{random.int}、${random.long}
r a n d o m . i n t ( 10 ) 、 {random.int(10)}、 random.int(10)、{random.int[1024,65536]},${app.name:默认值}
-
user1: name: zhl age: ${random.int(10)} add: 兰州
### 11,多个配置文件设置springboot访问路径:
```yml
spring:
profiles:
active: pre
在application.yml中如此配置,则会自动寻找到命名为application-pre.yml的文件
12,修改springboot项目启动端口和添加访问路径
server:
port: 8081
servlet:
context-path: /zhl
13,输出日志
-
springboot中共有三种日志,分别是info,sql和error,info用来输出系统级日志,error输出错误信息,sql记录数据库访问日志
-
添加配置信息,在resource目录下新建目录log,在log中新建logback.xml,在此文件中输入以下代码:
<configuration> <!--本文主要输出日志为控制台日志,系统日志,sql日志,异常日志--> <!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,,,, --> <!--控制台--> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d %p (%file:%line\)- %m%n</pattern> <charset>UTF-8</charset> </encoder> </appender> <!--系统info级别日志--> <!--<File> 日志目录,没有会自动创建--> <!--<rollingPolicy>日志策略,每天简历一个日志文件,或者当天日志文件超过64MB时--> <!--encoder 日志编码及输出格式--> <appender name="fileLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>log/file/fileLog.log</File> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>log/file/fileLog.log.%d.%i</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!-- or whenever the file size reaches 64 MB --> <maxFileSize>64 MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <pattern> %d %p (%file:%line\)- %m%n </pattern> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> </appender> <!--sql日志--> <appender name="sqlFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>log/sql/sqlFile.log</File> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>log/sql/sqlFile.log.%d.%i</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!-- or whenever the file size reaches 64 MB --> <maxFileSize>64 MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!--对记录事件进行格式化。负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。--> <encoder> <!--用来设置日志的输入格式--> <pattern> %d %p (%file:%line\)- %m%n </pattern> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> </appender> <!--异常日志--> <appender name="errorFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>log/error/errorFile.log</File> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>log/error/errorFile.%d.log.%i</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!-- or whenever the file size reaches 64 MB --> <maxFileSize>64 MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!--对记录事件进行格式化。负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。--> <encoder> <!--用来设置日志的输入格式--> <pattern> %d %p (%file:%line\)- %m%n </pattern> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> <!-- 日志都在这里 过滤出 error 使用 try {}catch (Exception e){} 的话异常无法写入日志,可以在catch里用logger.error()方法手动写入日志 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 日志输出级别 --> <!--All\DEBUG\INFO\WARN\ERROR\FATAL\OFF--> <!--打印info级别日志,分别在控制台,fileLog,errorFile输出 异常日志在上面由过滤器过滤出ERROR日志打印 --> <root level="INFO"> <appender-ref ref="fileLog" /> <appender-ref ref="console" /> <appender-ref ref="errorFile" /> </root> <!--打印sql至sqlFile文件日志--> <logger name="com.dolphin.mapper" level="DEBUG" additivity="false"> <appender-ref ref="console" /> <appender-ref ref="sqlFile" /> </logger> </configuration>
-
在yml文件中配置日志访问路径:
logging: config: classpath:log/logback.xml
-
日志会自动存储到当前项目路径/log下,有filelog,errorlog,sqllog三个文件夹
-
需要输出日志的类上添加@Slf4j注解,即可在类中调用log.info(),log.error(),log.debug()等方法:
log.info("user+{}",niuMaEntity.toString());//花括号代表变量,都好后写变量值即可
14,创建定时任务
@Component
public class ScheduledTasks {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Scheduled(fixedRate = 5000)//fixedRate参数可以设置执行间隔,单位为秒,也可以使用cron参数,详见https://www.bejson.com/othertools/cron/
public void reportCurrentTime() {
System.out.println("现在时间:" + dateFormat.format(new Date()));
}
}
15,全局捕获异常:
-
建立捕获异常的类,并在类上添加@ControllerAdvice注解,表明这个类是全局捕获异常的类
@ControllerAdvice public class MayiktExceptionHandler { /** * 拦截运行异常出现的错误~~~ * * @return */ @ExceptionHandler(RuntimeException.class)//注解意义为对所有在运行的类捕获异常 @ResponseBody//注解返回格式,加ResponseBody就是返回json格式,不加就是返回视图路由信息 public Map<Object, Object> exceptionHandler() { Map<Object, Object> map = new HashMap<>(); map.put("error", "500"); map.put("msg", "系统出现错误~"); return map; } }
16,打包应用程序
-
先用mvn程序将程序打包
mvn clean package//在当前路径下即可
-
用java -jar 包名运行
-
注:打包前需要在pom文件中加入如下代码指明程序的入口类,不然在运行时会报一个未能识别主清单的错误。
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> <configuration> <mainClass>com.mayikt.App</mainClass> <excludes> <exclude> <groupId>junit</groupId> <artifactId>junit</artifactId> </exclude> <exclude> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build>