笔者所参考的书籍是SpringBoot实战,其理论性说得不多,内容上也不是非常详细。但是说到的内容也足够平时使用了,以下就是我根据SpringBoot实战学到的一些东西,希望分享给大家,并成为我以后回忆这门技术的笔记。
开始SpringBoot之前,我建议大家还是从Spring官网上按照自己的需要下载一个基础包,https://start.spring.io 。在这个笔记当中只需要用到web 和 websocket。
导入到项目当中,然后我们就开始小试牛刀!
一、SpringBoot Web 小试牛刀
可以看到导入之后会有一个DemoApplication的类,这个类会发现有一个@SpringBootApplication。目前这个类就是我们在上几遍说到的配置类,当然SpringBoot让我这种懒人非常兴奋,因为他将我们会用到的东西都配置上去了。而且最重要的是他的自动配置的,会根据当前有什么包和当前的环境去判断应该配置什么。目前我的maven有:
org.springframework.boot spring-boot-starter-web
显然我是一个Web项目,所以Spring已经自动帮我们配置上了SpringMVC的支持,而且我们连最基本的ComponentScan都不用配,Spring都为我们办妥了。org.springframework.boot spring-boot-starter-thymeleaf
然后我们想尝试创建一个Controller然后我们使用@ResponseBody在页面直接返回一个字符串。当然你可以直接使用@RestController 就不用写@ResponseBody了(@RestController 等于 @Controller @ResponseBody的混合体,可以这样理解)
@Controller public class TestController { @RequestMapping("/") public @ResponseBody String index(){ return "test"; } }
OK,到这里Web容器呢···· 嗯SpringBoot 在 spring-boot-starter-web 做好了一个内嵌在SpringBoot上的Tomcat,当然也可以使用其他Jetty等等的其他Web容器,这个后面说。明显看到我们的项目当中在resources目录下会有一个application.properties配置文件。springBoot基本的配置都会写到这里,例如服务器的端口和contextpath等等都会在这里去配置。
#Servlet容器配置 server.port=8080 server.context-path=/boot server.session.timeout=10800 #server.error.path=/error目前我配置了 8080端口、context-path为/boot 、session超时时间为3小时、错误页面error(但是我没有使用)
现在可以访问了一下我们的第一个测试路径了,http://localhost:8080/boot/
二、杂项配置
SpringBoot已经为我们自动配置的大部分的日常配置,还有一些自定义操作还是需要我们亲自动手。例如我们启动SpringBoot时候的console显现一个大大的Spring,又例如我们通过profile去控制当前运行环境等等。
1、配置SpringBoot的banner
配置SpringBoot的banner,我们在SpringBoot当中看的console输出可以通过在resource目录下创建banner.txt 在banner.txt中编写自己的banner。
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.5.4.RELEASE)
当然如果我们不希望有BANNER的输出,也可以通过在main方法中将banner禁用:
public static void main(String[] args) { SpringApplication application = new SpringApplication(DemoApplication.class); application.setBannerMode(Banner.Mode.OFF); application.run(args); }
2、配置SpringBoot的Profile
Profile如果不熟悉的同学可以看看我之前的笔记:SpringBoot系列(1)---无配置文件配置基础1 。
我们需要创建不同环境的application-{profile}.properties,然后配置不同profile环境的配置即可。例如我配置两个环境,开发环境和生成环境,我就会创建application-dev.properties和application-prod.properties 两个文件(在resources目录下创建)。在不同的properties文件当中配置不同的server.port 开发环境是8080 生产环境是80。
application-prod.properties
server.port=80 server.context-path=/
application-dev.properties
server.port=8080 server.context-path=/boot
最后按照当前我们的实际环境在application.properties中配置profile的值:
spring.profiles.active=dev
3、用户自定义配置
我们还可以在application.properties配置文件当中配置我们自定义的属性,然后通过@value注入到我们的bean或者是controller当中。
myprperties.developer.name=tony然后在我们的bean中配置:
@Controller public class TestController { @Value("${myprperties.developer.name}") private String developerName;
4、日志配置
SpringBoot 支持多种日志框架,默认情况下SpringBoot使用LogBack作为日志框架,配置SpringBoot 日志级别和日志文件位置,可以通过application.properties进行如下配置:
#日志配置 logging.file=/Users/yanzhichao/Desktop/log.log logging.level.org.springframework.web=DEBUG
5、配置文件导入
SpringBoot是不提倡使用xml配置文件的,当然如果你必要去使用xml配置文件也是允许的通过@ImportResource导入所需的xml配置文件,但是笔者并没有进行相关的测试,没有别的,就因为Spring不推荐我就不测这个功能了。有事件的同学可以测测然后在评论说下测试结果,看看能不能用。
@ImportResource({"classpath:application.xml"}) @SpringBootApplication public class DemoApplication extends WebMvcConfigurerAdapter {
6、favicon配置
favicon就是浏览器标签页的icon
禁用favicon,在application.properties进行如下配置:
spring.mvc.favicon.enabled=false替换自己的favicon只需要在resources目录下、resources/static目录下 、resources/public目录下 随便一个目录添加自定义的favicon.ico即可
三、Thymeleaf 模板引擎
由于SpringBoot内嵌的Tomcat对支持JSP存在问题,在SpringBoot-web目前官方推荐使用Thymeleaf模板引擎。笔者也是对这个thymeleaf不是非常熟悉,也是仅仅会用而已。不过应该已经够用了,讲解Thymeleaf不是本文的重点我也是简简单单的说一说。
当然我们当需要使用Thymeleaf的时候第一反应是需要添加一个viewResolver。但是重磅消息是,Spring已经帮我们完成了这个任务。
也许你会问我们不需要去配置资源文件或者模板的路径吗?真的不用配置,Spring在默认情况下所有静态资源一律映射到resources目录下的static目录。而模板一律映射到resources目录下的templates目录当中。所以实际上我们不需要配置任何的静态资源路径映射和thymeleaf的viewResolver。当然我们还是可以 配置一下(在application.properties上进行配置):
#Thymeleaf配置 spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.suffix=.html
在controller当中还是老规矩:
@RequestMapping("/userList.html") public ModelAndView userList(){ ModelAndView modelAndView = new ModelAndView("userList"); modelAndView.addObject("users",getUserList()); return modelAndView; }
然后在templates目录下创建userList.html的模板文件:
html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd">
xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
Title
th:each="user_item : ${users}">
th:text="${user_item.userId}">
th:text="${user_item.username}">
th:text="${user_item.userpwd}">
四、SpringMVC配置
SpringMVC在之前的笔记当中已经用了比较大的篇幅去介绍,事实上在SpringBoot当中也基本上一致。当然SpringBoot也是帮我们已经配置好常用的配置了。还记得我们以前说的WebMvcConfigurerAdapter吗?不记得就回忆一下:SpringBoot系列(3)---无配置文件SpringMVC
同理在SpringBoot当中也是继承WebMvcConfigurerAdapter然后对相应的方法进行重写来对SpringMVC进行配置,我们可以直接在配置类当中继承WebMvcConfigurerAdapter也可以另外创建一个配置类对SpringMVC进行配置,但是需要添加@Configuration的annotation。
@Configuration public class MyWebConfig extends WebMvcConfigurerAdapter { @Autowired private HttpMessageConverters httpMessageConverters; @Override public void addViewControllers(ViewControllerRegistry registry) { super.addViewControllers(registry); } @Override public void configureMessageConverters(List虽然我什么都没有配,就打个样而已。但是需要注意的是,我们通过这种方式去配置是在SpringBoot自动配置的基础上进行配置,如果我们想去除SpringBoot的默认配置需要添加@EnableWebMvc,但是一般情况下没有这个必要。> converters) { super.configureMessageConverters(httpMessageConverters.getConverters()); } }
五、静态资源
刚刚在thymeleaf讲解的时候已经说过,SpringBoot会自动映射静态资源,以下就是会映射的目录:
classpath:/META-INF/resources/index.html
classpath:/resources/index.html
classpath:/static/index.html
classpath:/public/index.html
六、Servlet\Filter\ServletListener配置
Servlet和Filter、ServletListener 就没有什么好说的,按护理画瓢吧 兄弟们~~ ServletListener我就没有测试了,自己动手丰衣足食!
// @Bean // public ServletListenerRegistrationBean listenerRegistrationBean(){ // return new ServletListenerRegistrationBean(); // } @Bean public FilterRegistrationBean myFilter(){ FilterRegistrationBean registrationBean = new FilterRegistrationBean(new MyFilter()); registrationBean.addUrlPatterns("/index"); return registrationBean; } @Bean public ServletRegistrationBean myServlet(){ return new ServletRegistrationBean(new MyServlet(),"/myServlet"); }
七、Tomcat和Servlet容器 配置
由于SpringBoot的Servlet容器是内嵌在Jar包当中的,所以我们可以通过两种手段去进行配置,第一通过application.properties 第二通过实现EmbeddedServletContainerCustomizer接口。
1、通过application.properties:
#Tomcat 配置 server.tomcat.uri-encoding=utf-8我看了一下没有什么好配置的SpringBoot默认的值已经配好了,我只是做个演示因为SpringBoot默认的encoding也是配置为UTF-8。
如果是通过intellij 进行开发的可以有提示,server.tomcat开头就有提示了,按照自己需要进行相关的配置。
2、通过代码配置
以下是通用Servlet容器的配置
@Component public class CustomServletContainer implements EmbeddedServletContainerCustomizer { @Override public void customize(ConfigurableEmbeddedServletContainer container) { container.setPort(8888); container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND,"/error_404.html")); container.setSessionTimeout(3, TimeUnit.HOURS); } }
Tomcat特定配置需要创建特定containerFactory的bean,在配置类创建bean:
@Bean public EmbeddedServletContainerFactory servletContainerFactory(){ TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory(); factory.setPort(8888); factory.setUriEncoding(Charset.forName("utf-8")); return factory; }
一般情况我们通过application.properties 已经能够满足大部分的配置了,如果有特殊的配置可以通过代码的方式进行定义。
八、启用其他WEB容器替换TOMCAT
这个也是没有什么难度改改maven就好
org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-tomcat org.springframework.boot spring-boot-starter-jetty
九、SSL配置
首先创建一个证书
keytool -genkey -alias TONY -keyalg RSA -keystore ./server.keystore
【需要注意的是,一定要指定keyalg RSA 否则会出现ERR_SSL_VERSION_OR_CIPHER_MISMATCH 错误 导致无法访问】
application.properties配置如下:
#SSL server.ssl.key-store=server.keystore server.ssl.key-store-password=123456 server.ssl.key-store-type=JKS server.ssl.key-alias=TONY server.ssl.enabled=true注意:证书文件一定要放在项目的根目录下,即和你的pom.xml文件的同级目录。
一般情况下用户不会指定访问https,所以做跳转基本上是配置SSL的标配。现在就说说这个“标配”应该怎样配。
@SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @Bean public Connector httpConnector(){ Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); connector.setScheme("http"); connector.setPort(8080); connector.setSecure(false); connector.setRedirectPort(8443); return connector; } @Bean public EmbeddedServletContainerFactory servletContainerFactory(){ TomcatEmbeddedServletContainerFactory containerFactory = new TomcatEmbeddedServletContainerFactory(){ @Override protected void postProcessContext(Context context) { super.postProcessContext(context); SecurityConstraint constraint = new SecurityConstraint(); constraint.setUserConstraint("CONFIDENTIAL"); SecurityCollection collection = new SecurityCollection(); collection.addPattern("/*"); constraint.addCollection(collection); context.addConstraint(constraint); } }; containerFactory.addAdditionalTomcatConnectors(httpConnector()); return containerFactory; } }
可以看到我们创建了一个connector 端口为8080,并重定向到8443端口。这样就能完成http跳转到https,这样对于用户HTTPS来说是透明的,不需要用户手动指定。