springboot环境搭建及入门必知
- springboot環(huán)境搭建
<!--繼承springboot父項(xiàng)目-->
<parent>
????<groupId>org.springframework.boot</groupId>
????<artifactId>spring-boot-starter-parent</artifactId>
????<version>2.0.0.RELEASE</version>
</parent>
2、導(dǎo)入web啟動(dòng)器依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
3、控制器
package rr.tt.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import rr.tt.service.UserService;
import javax.annotation.Resource;
/**
?* @author George
?* @description 控制層
?**/
@Controller
public class UserController {
????@Autowired
????private UserService userService;
????@RequestMapping("/insert")
????@ResponseBody
????public String insert(){
????????userService.insert();
????????System.out.println("控制器insert()");
????????return "index";
????}
????@RequestMapping("/insert/ddd")
????@ResponseBody
????public String bbb(){
????????userService.insert();
????????System.out.println("控制器insertddd()");
????????return "indexddd";
????}
????//由于springboot默認(rèn)不支持jsp,所以404
????@RequestMapping("/update")
????public String update(){
????????System.out.println("控制器update()");
????????return "index";
????}
}
4、主啟動(dòng)類
package rr.tt;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import rr.tt.controller.UserController;
import rr.tt.filter.SellFilter;
/**
?* @author George
?* @description springboot的應(yīng)用程序入口
?**/
@SpringBootApplication
//@ComponentScan(basePackages = "rr.tt")
public class UserApplication {
????public static void main(String[] args) {
// ???????Logger log= LoggerFactory.getLogger(UserController.class);
????????SpringApplication.run(UserApplication.class);
????}
}
5、springboot配置文件
配置文件有兩種:一是application.properties,二是application.yml
application.properties:
##服務(wù)器配置
server.port=9090
server.servlet.path=/springboot
application.yml:
##服務(wù)器配置
server:
??port: 9090
??servlet:
????path: /springboot
?
?
6、springboot中的注解
@Configuration<=>@SpringBootConfiguration
7、修改springboot的banner
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
/**
?* Hello world!
?*元注解
?*/
@SpringBootApplication//springboot核心注解,用于標(biāo)識(shí)啟動(dòng)類
public class SellerApplication
{
????public static void main( String[] args )
????{
????????//SpringApplication.run(SellerApplication.class,args);
????????SpringApplication application=new SpringApplication(SellerApplication.class);
????????//關(guān)閉banner
????????application.setBannerMode(Banner.Mode.OFF);
????????application.run(args);
????}
}
applicationContext.xml:
<?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:aop="http://www.springframework.org/schema/aop"
???????xmlns:context="http://www.springframework.org/schema/context"
???????xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
???<!--service-->
????<bean id="productServiceImpl" class="com.henu.service.UserServiceImpl"></bean>
</beans>
?
加載外部xml文件:
@SpringBootApplication//springboot核心注解,用于標(biāo)識(shí)啟動(dòng)類
@ImportResource(value={"classpath:applicationContext.xml"})
public class SellerApplication
{
????public static void main( String[] args )
????{
......
}
}
?
導(dǎo)入依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<scope>compile</scope>
</dependency>
編輯日志配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
????<!-- %m輸出的信息,%p日志級(jí)別,%t線程名,%d日期,%c類的全名,%i索引【從數(shù)字0開始遞增】-->
????<!-- appender是configuration的子節(jié)點(diǎn),是負(fù)責(zé)寫日志的組件。 -->
????<!-- ConsoleAppender:把日志輸出到控制臺(tái) -->
????<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
????????<encoder>
????????????<pattern>%d %p (%file:%line\)- %m%n</pattern>
????????????<!-- 控制臺(tái)也要使用UTF-8,不要使用GBK,否則會(huì)中文亂碼 -->
????????????<charset>UTF-8</charset>
????????</encoder>
????</appender>
????<!-- RollingFileAppender:滾動(dòng)記錄文件,先將日志記錄到指定文件,當(dāng)符合某個(gè)條件時(shí),將日志記錄到其他文件 -->
????<!-- 以下的大概意思是:1.先按日期存日志,日期變了,將前一天的日志文件名重命名為XXX%日期%索引,新的日志仍然是demo.log -->
????<!-- 2.如果日期沒有發(fā)生變化,但是當(dāng)前日志的文件大小超過1KB時(shí),對(duì)當(dāng)前日志進(jìn)行分割 重命名 -->
????<appender name="demolog"
??????????????class="ch.qos.logback.core.rolling.RollingFileAppender">
????????<File>log/demo.log</File>
????????<!-- rollingPolicy:當(dāng)發(fā)生滾動(dòng)時(shí),決定?RollingFileAppender 的行為,涉及文件移動(dòng)和重命名。 -->
????????<!-- TimeBasedRollingPolicy: 最常用的滾動(dòng)策略,它根據(jù)時(shí)間來制定滾動(dòng)策略,既負(fù)責(zé)滾動(dòng)也負(fù)責(zé)出發(fā)滾動(dòng) -->
????????<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
????????????<!-- 活動(dòng)文件的名字會(huì)根據(jù)fileNamePattern的值,每隔一段時(shí)間改變一次 -->
????????????<!-- 文件名:log/demo.2018-12-05.0.log -->
????????????<fileNamePattern>log/demo.%d.%i.log</fileNamePattern>
????????????<!-- 每產(chǎn)生一個(gè)日志文件,該日志文件的保存期限為30天 -->
????????????<maxHistory>30</maxHistory>
????????????<timeBasedFileNamingAndTriggeringPolicy
????????????????????class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
????????????????<!-- maxFileSize:這是活動(dòng)文件的大小,默認(rèn)值是10MB,測(cè)試時(shí)可改成1KB看效果 -->
????????????????<maxFileSize>1KB</maxFileSize>
????????????</timeBasedFileNamingAndTriggeringPolicy>
????????</rollingPolicy>
????????<encoder>
????????????<!-- pattern節(jié)點(diǎn),用來設(shè)置日志的輸入格式 -->
????????????<pattern>
????????????????%d %p (%file:%line\)- %m%n
????????????</pattern>
????????????<!-- 記錄日志的編碼:此處設(shè)置字符集?- -->
????????????<charset>UTF-8</charset>
????????</encoder>
????</appender>
????<!-- 控制臺(tái)輸出日志級(jí)別 -->
????<root level="info">
????????<appender-ref ref="STDOUT" />
????</root>
????<!-- 指定項(xiàng)目中某個(gè)包,當(dāng)有日志操作行為時(shí)的日志記錄級(jí)別 -->
????<!-- com.alibaba為根包,也就是只要是發(fā)生在這個(gè)根包下面的所有日志操作行為的權(quán)限都是DEBUG -->
????<!-- 級(jí)別依次為【從高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE -->
????<logger name="com.alibaba.springboot.controller" level="debug">
????????<appender-ref ref="demolog" />
????</logger>
</configuration>
?
加載日志配置文件:
##logback
logging:
??config: classpath:logback.xml
?
創(chuàng)建日志對(duì)象:
//創(chuàng)建日志對(duì)象
public static Logger log= LoggerFactory.getLogger(ProductServiceImpl.class);
?
?
?
查看是否導(dǎo)入jsp和servlet依賴:
導(dǎo)入springboot支持jsp依賴:
<!--jsp的支持的依賴-->
<dependency>
????<groupId>org.apache.tomcat.embed</groupId>
????<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
Application.yml中配置視圖跳轉(zhuǎn)信息:
##spring mvc
spring:
??mvc:
????view:
??????prefix: /
??????suffix: .jsp
?
Idea中配置jsp跳轉(zhuǎn)路徑:
打開工具欄中綠色開始圖標(biāo)的左邊一個(gè)選項(xiàng)Edit Configurations 選擇Spring boot 然后Working directorg 選擇 $MODULE_DIR$?如圖:
?
12、項(xiàng)目熱部署
?1、在Maven的pom.xml文件中添加依賴
????<!-- 熱部署 -->
????<dependency>
??????<groupId>org.springframework.boot</groupId>
??????<artifactId>spring-boot-devtools</artifactId>
??????<!-- optional=true,依賴不會(huì)往下傳遞,如果有項(xiàng)目依賴本項(xiàng)目,并且想要使用devtools,需要重新引入 -->
??????<optional>true</optional>
??????<scope>true</scope>
????</dependency>
2、繼續(xù)在Maven的pom.xml文件中添加插件的配置
<build>
????<plugins>
??????<plugin>
????????<groupId>org.springframework.boot</groupId>
????????<artifactId>spring-boot-maven-plugin</artifactId>
????????<configuration>
??????????<fork>true</fork><!-- 如果沒有該配置,熱部署的devtools不生效 -->
????????</configuration>
??????</plugin>
??????<!-- 自定義配置spring Boot使用的JDK版本 -->
??????<plugin>
????????<artifactId>maven-compiler-plugin</artifactId>
????????<configuration>
??????????<source>1.8</source>
??????????<target>1.8</target>
????????</configuration>
??????</plugin>
????</plugins>
</build>
?如果是Eclipse,配置到這里,只要重啟服務(wù),熱部署就會(huì)生效了。
但是IDEA的話,熱部署還不會(huì)生效,因?yàn)閐evTools只會(huì)在類路徑上的文件發(fā)生更改時(shí)才會(huì)自動(dòng)重啟,而IDEA默認(rèn)不會(huì)自動(dòng)編譯。
?
解決方法有兩種:
1、手動(dòng):修改完代碼,按快捷鍵Ctrl+F9,手動(dòng)構(gòu)建項(xiàng)目,或者只修改單個(gè)類文件的話,按Ctrl+Shift+F9,重新編譯該類文件,即可觸發(fā)重啟服務(wù)。
?
2、自動(dòng):
1)File -> Settings -> Compiler,勾選 Build Project automatically
?
2)按快捷鍵Ctrl+Shift+Alt+/,選擇1.Registry...
?
3)勾選 compiler.automake.allow.when.app.running 即可
?
SpringBoot單元測(cè)試目的:測(cè)試目標(biāo)方法是否能正確執(zhí)行
?<!--springboot程序測(cè)試依賴,如果是自動(dòng)創(chuàng)建項(xiàng)目默認(rèn)添加-->
?????<dependency>
?????????<groupId>org.springframework.boot</groupId>
?????????<artifactId>spring-boot-starter-test</artifactId>
?????????<scope>test</scope>
?????</dependency>
使用注解@RunWith和@SpringBootTest
?
@RunWith(SpringRunner.class)
@SpringBootTest(classes= {啟動(dòng)類.class})
public class TestApplication {
@Autowired
public XxxService servcie;
????@Test
public void testXxx() {
servcie.insert();
}
}
注解:@EnableScheduling作用于配置類,表示啟動(dòng)定時(shí)任務(wù)
注解:@Scheduled(cron="0/2 * * * * ?")作用于方法,表示按指定周期執(zhí)行該方法;cron為定時(shí)表達(dá)式,詳見文檔。
?
package rr.tt.boot;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
/**
?* @author George
?* @description
?**/
@SpringBootConfiguration
@EnableScheduling
public class SellSpringBootConfigBean {
????@Scheduled(cron = "0/2 * * * * ?")
????public void startDo(){
????????System.out.println("定時(shí)器");
????}
}
?
定義過濾器:
package rr.tt.filter;
import javax.servlet.*;
import java.io.IOException;
import java.util.logging.LogRecord;
/**
?* @author George
?* @description
?**/
public class SellFilter implements Filter {
????@Override
????public void init(FilterConfig filterConfig) throws ServletException {
????????System.out.println("init");
????}
????@Override
????public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
????????System.out.println("doFilter......");
????????filterChain.doFilter(servletRequest,servletResponse);
????}
????@Override
????public void destroy() {
????????System.out.println("destory");
????}
}
?
配置過濾器:
/**配置過濾器*/
@Bean
public FilterRegistrationBean filterRegistrationBean() {
????FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
????//指定過濾器
????filterRegistrationBean.setFilter(new SellFilter());
????//過濾器名稱
????filterRegistrationBean.setName("RestWebFilter1");
????//設(shè)置過濾器攔截路徑
????filterRegistrationBean.addUrlPatterns("/*");
????//設(shè)置過濾器執(zhí)行順序
????filterRegistrationBean.setOrder(1);
????return filterRegistrationBean;
}
package rr.tt.interceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
?* @author George
?* @description
?**/
public class SellInterceptor extends HandlerInterceptorAdapter {
????@Override
????public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
????????System.out.println("preHandle");
????????return true;
????}
????@Override
????public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
????????System.out.println("postHandle");
????}
????@Override
????public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
????????System.out.println("afterCompletion");
????}
}
?
配置攔截器:
package rr.tt.config;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import rr.tt.interceptor.SellInterceptor;
/**
?* @author George
?* @description
?**/
@SpringBootConfiguration
public class SellInterceptorConfig implements WebMvcConfigurer {
????@Override
????public void addInterceptors(InterceptorRegistry registry) {
????????registry.addInterceptor(new SellInterceptor()).addPathPatterns("/insert");
????}
}
?
【注】將preHandle???return false;
package rr.tt.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
?* @author George
?* @description
?**/
public class SellServlet extends HttpServlet {
????@Override
????protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
????????System.out.println("doget()");
????????//輸出json格式
????????PrintWriter writer = resp.getWriter();
????????writer.write("xxx");
????????writer.close();
????}
}
?
配置servlet方式一:
/***
?* 配置servlet
?* @return
?*/
@Bean
public ServletRegistrationBean servletRegistrationBean(){
????ServletRegistrationBean servletRegistrationBean=new ServletRegistrationBean(new SellServlet(),"/updateSell");
????return servletRegistrationBean;
}
配置servlet方式二:
@WebServlet("/updateSell")
public class SellServlet extends HttpServlet{
????@Override
????protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
????????System.out.println("servlet......");
????????PrintWriter out = resp.getWriter();
????????out.print("{name:admin}");
????????out.flush();
????????out.close();
????}
主類添加注解:
@SpringBootApplication//springboot核心注解,用于標(biāo)識(shí)啟動(dòng)類
@ServletComponentScan(basePackages="com.offcn.springboot.servlet")
public class SellerApplication
{
????public static void main( String[] args )
?
}
}
總結(jié)
以上是生活随笔為你收集整理的springboot环境搭建及入门必知的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无招胜有招之NIO
- 下一篇: springboot入门程序