Spring boot学习记录
来源:互联网 发布:网络社交方式的利与弊 编辑:程序博客网 时间:2024/05/17 02:41
Spring具有繁琐的xml配置,目前Spring从3.x过渡到4.x的版本,推荐使用Java配置取代xml配置。Spring boot并不是什么新的技术或功能,只是为Spring框架整合许多第三方的技术。
1.Spring的Java配置方式
1.1基本注解@Configuration和@Bean
java配置方式主要通过@Configuration和@Bean这两个注解来实现的。
1. @Configuration 作用于类上,相当于一个xml配置文件
2. @Bean作用于方法上,相当于xml中的<bean>标签
下面Java配置具体代码的实现,和之前xml配置不同就是多了这个文件,省去了xml的配置,其他的实体类、服务层、Controller都一样的写法
package cn.itcast.springboot.javaconfig;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;/** * * @author Weiguo Liu * @data 2017年11月27日 *///这个注解,表明该类是一个Spring的配置,相当于一个xml文件@Configuration//配置扫描包,即Spring管理的文件包路径@ComponentScan(basePackages = "cn.itcast.springboot.javaconfig")public class SpringConfig { @Bean// 通过该注解来表明是一个Bean对象,相当于xml中的<bean>标签,这里提供一个获取Dao的方法即可 public UserDAO getUserDAO() { return new UserDAO(); // 直接new对象做演示 }}
1.2 读取外部资源配置文件
以前通过xml配置是通过context:property-placeholder这个标签来配置文件地址,辅助${xx}这样方式获取具体的配置属性,在Java注解配置,用一个SpringConfiguration.java文件代替了xml,所以外部文件的引入也是在这个配置文件上做文章,外部资源文件的引入直接在Configuration类上加上 @PropertySource(value={"classpath:xxx"})
即可引入(xxx表示配置文件名,通常是”xxx.properties”的形式),然后在配置文件中配置具体属性的时候,直接在该属性上用@Value注解注入即可,和xml中的表示一样:比如 @Value("${jdbc.url}")
当然如果需要引入多个外部文件就应该写成 @PropertySource(value={"classpath:xxx","classpath:外部文件2"})
这里因为可能引入的外部文件不存在,所以通常会配置一个忽略不存在的外部文件的设置
@PropertySource(value = { "classpath:jdbc.properties" }, ignoreResourceNotFound = true)
下面是具体的典型综合配置代码
配置文件jdbc.properties还像之前那么写即可
package cn.itcast.springboot.javaconfig;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.PropertySource;import com.jolbox.bonecp.BoneCPDataSource;/** * * @author Weiguo Liu * @data 2017年11月27日 *///这个注解,表明该类是一个Spring的配置,相当于一个xml文件@Configuration//配置扫描包,即Spring管理的文件包路径@ComponentScan(basePackages = "cn.itcast.springboot.javaconfig")//引入外部配置文件,忽略不存在的文件@PropertySource(value = { "classpath:jdbc.properties" }, ignoreResourceNotFound = true)public class SpringConfig { @Bean// 通过该注解来表明是一个Bean对象,相当于xml中的<bean> public UserDAO getUserDAO() { return new UserDAO(); // 直接new对象做演示 } //获取配置文件中的一些具体的属性 @Value("${jdbc.username}") private String userName; @Value("${jdbc.password}") private String password; @Value("${jdbc.url}") private String jdbcUrl; @Value("${jdbc.driverClass}") private String driverClass; //destroyMethod="close"的作用当数据库连接不使用的时候,就把该连接重新放到数据池中,方便下次使用调用. @Bean(destroyMethod="close") //这里使用的连接池不同,所以获取的对象会有所不同,通常会写成getBoneCPDataSource //但是Spring中会默认使用方法名作为bean的id,使用getxx不太适合,故改成boneCPDataSource public BoneCPDataSource boneCPDataSource() { BoneCPDataSource boneCPDataSource = new BoneCPDataSource(); boneCPDataSource.setUsername(userName); boneCPDataSource.setPassword(password); boneCPDataSource.setJdbcUrl(jdbcUrl); boneCPDataSource.setDriverClass(driverClass); // 检查数据库连接池中空闲连接的间隔时间,单位是分,默认值:240,如果要取消则设置为0 boneCPDataSource.setIdleConnectionTestPeriodInMinutes(60); // 连接池中未使用的链接最大存活时间,单位是分,默认值:60,如果要永远存活设置为0 boneCPDataSource.setIdleMaxAgeInMinutes(30); // 每个分区最大的连接数 boneCPDataSource.setMaxConnectionsPerPartition(100); // 每个分区最小的连接数 boneCPDataSource.setMinConnectionsPerPartition(5); return boneCPDataSource; }}
2.Spring Boot
以上基于Java注解的叨叨就是为了Spring Boot的引入,它里面基本都是注解。
静态语言:先编译,再运行
动态语言:不需要编译,直接运行
Java是属于静态语言
JS属于动态语言
spring boot可以快速运行项目,之所以运行快速是因为实际上实在运行的一个jar,而不是一个工程,所以spring boot适用于开发测试(独立运行的jar,内嵌SERVLET容器(实际就是Tomcat)不需要再将它部署到Tomcat中),不太适合实际运用,但是还是可以将整个项目作为一个war包发布到生产环境中去。总而言之,在开发测试阶段运行的就是一个独立的jar包,但是在开发完之后打包成war包,丢到生产环境中,他又是一个完整的项目,非常方便,使用Spring boot可以极少使用或者不用Spring的配置(很多都已经内置了)。
2.1 Spring boot的必须引入的依赖
- spring项目必须将parent设为spring boot
它包含了大量的默认配置,大大简化了我们的开发
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> <relativePath/> </parent>
注意在其后引入的一些spring的一些模块时,不需要再写版本号version,因为这个里面已经包含了整个spring的版本号
- 如果是开发web项目,必须引入web支持
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>
- 添加spring boot的插件(可省)
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId></plugin>
2.2 简单的Spring boot应用
1.xxxApplication
一般情况下,Springboot项目都会有一个叫做xxxApplication的类,这个类就是整个项目的入口,如下:
package cn.itcast.springboot.demo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.annotation.Configuration;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;@SpringBootApplication//表明是一个Springboot的应用@Controller//表明是SpringMVC的类Contrller@Configuration//表明自身就是一个配置文件public class HelloApplication { @RequestMapping("hello") @ResponseBody//有这个注解就会使用消息转化器输出返回的字符串 public String hello() { return "hello world!"; } public static void main(String[] args) { //SpringApplication.run()方法中传入的类必须要有@SpringBootApplication注解,然后运行这个类 //这个类其实就是Spring Boot的入口方法 SpringApplication.run(HelloApplication.class, args); }}
【注意】
1. @SpringBootApplication是Spring Boot项目的核心注解,主要作用是开启自启动配置,是组合注解,里面也配置了自动扫描该App同级目录以及子目录下的所有类,如果不想让它自动配置哪个,后面可以接(execlude={xxx.class}),即可对xxx这个类不进行自动配置
2. @Configuration是设置Spring的配置类,通常spring boot项目中推荐使用@SpringBootConfiguration代替它(它的底层包含了@Configuration这个注解)
3. @Controller表示该类是一个SpringMVC的Controller控制器
4. main方法是启动一个应用,就是Spring boot应用的入口
2. spring boot项目的启动
spring boot项目中有两种启动方式,一种是直接运行xxxApplication(run As Java Application)获取右击项目RunAs–>Spring boot App;另一种是采用Maven插件的方式运行,刚刚2.1中第3部配置spring boot maven的插件就提供了这个作用,步骤如下:
右击项目–>Run As–>Run Configurations–>Maven Build–>右击new,出现如下窗口
Name随意填写,Base directory选择项目所在位置即可,Goals填入maven的启动命令:spring-boot:run即可,最后点击run便可运行。
3.启动日志
启动这个类的时候控制台会输出如下的一些信息
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) //这个是spring boot的logo,其实上是个banner,默认是这个,当然可以随意改 ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.5.2.RELEASE) //Spring Boot的版本号2017-11-27 12:51:54.247 INFO 13288 --- [ main] c.i.springboot.demo.HelloApplication : Starting HelloApplication on Mr-Lius-Computer with PID 13288 (F:\MyWork\GitHub\LocalGitRepository-Eclipse\itcast-springboot\target\classes started by Weiguo Liu in F:\MyWork\GitHub\LocalGitRepository-Eclipse\itcast-springboot)2017-11-27 12:51:54.251 INFO 13288 --- [ main] c.i.springboot.demo.HelloApplication : No active profile set, falling back to default profiles: default2017-11-27 12:51:54.748 INFO 13288 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@62db0cfc: startup date [Mon Nov 27 12:51:54 CST 2017]; root of context hierarchy2017-11-27 12:51:57.868 INFO 13288 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http) //监听8080端口2017-11-27 12:51:57.890 INFO 13288 --- [ main] o.apache.catalina.core.StandardService : Starting service Tomcat2017-11-27 12:51:57.892 INFO 13288 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.11 //内核是Tomcat,就是前面说的springboot是内嵌了Tomcat2017-11-27 12:51:58.125 INFO 13288 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext2017-11-27 12:51:58.125 INFO 13288 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 3381 ms2017-11-27 12:51:58.377 INFO 13288 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/] //初始化SpringMVC的dispatcherServlet为“/”,即web项目默认是无项目名,直接访问映射即可,所以上述的应用只需要访问http://localhost:8080/hello即可输出2017-11-27 12:51:58.383 INFO 13288 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*]2017-11-27 12:51:58.383 INFO 13288 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]2017-11-27 12:51:58.383 INFO 13288 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*]2017-11-27 12:51:58.383 INFO 13288 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*]2017-11-27 12:51:58.891 INFO 13288 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@62db0cfc: startup date [Mon Nov 27 12:51:54 CST 2017]; root of context hierarchy2017-11-27 12:51:58.988 INFO 13288 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/hello]}" onto public java.lang.String cn.itcast.springboot.demo.HelloApplication.hello()2017-11-27 12:51:58.996 INFO 13288 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)2017-11-27 12:51:58.997 INFO 13288 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)2017-11-27 12:51:59.076 INFO 13288 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]2017-11-27 12:51:59.076 INFO 13288 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]2017-11-27 12:51:59.142 INFO 13288 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]2017-11-27 12:51:59.571 INFO 13288 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup2017-11-27 12:51:59.740 INFO 13288 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)2017-11-27 12:51:59.748 INFO 13288 --- [ main] c.i.springboot.demo.HelloApplication : Started HelloApplication in 8.239 seconds (JVM running for 9.403)2017-11-27 12:53:59.515 INFO 13288 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring FrameworkServlet 'dispatcherServlet'2017-11-27 12:53:59.515 INFO 13288 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization started2017-11-27 12:53:59.535 INFO 13288 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 20 ms
4.自定义Banner
第三部启动日志中已经提供对部分做了说明,Spring Boot项目默认的Banner是一个Spring的标志,自己可以百度Banner生成器(比如:http://www.network-science.de/ascii/),输入你想做的Banner字符,然后复制下来保存到本地(比如保存到本地的banner.txt文件),然后将banner.txt文件文件复制到resources目录(即项目中的src/main/resources目录)中即可,下次启动项目的时候会自动加载,比如修改成我姓名的拼音然后按照上述流程启动将会出现下面的Banner
当然也可以关闭这玩意儿,在xxxApplication中的main方法修改成下面的即可
SpringApplication app = new SpringApplication(HelloApplication.class);app.setBannerMode(Banner.Mode.OFF);app.run(args);
2.3 Spring Boot的全局配置文件
spring boot项目可以使用一个全局的配置文件指定默认的配置,而且它的名字只能叫做application.properties或者application.yml(推荐使用,较为方便),放到resources目录下。比如:
# 1.application.properties配置,修改Tomcat的端口和映射路径(即此时访问hello的地址就不是上述的localhost:8080/hello而是localhost:8088/hello.html)server.port=8088server.servlet-path=*.html
如果使用yml语言配置就是
注意冒号后面一定要加空格
server: port: 8088 servlet-path: "*.html" #这里配置加了双引号不然报错
当然还有详细的配置选项见https://github.com/Jacksonary/CodeRepository/blob/master/spring-boot-configurationfile.pl
2.4自定springboot的一些默认配置
2.4.1 自定义静态资源位置
# 在全局配置文件中可以指定静态资源的位置spring.resources.static-locationsspring.resources.static-locations=classpath:/public/,classpath:路径2
如果不配置静态文件路径(默认为/)或者进入路径为*.xxx的,那么将静态资源直接放到webapp目录下即可访问
2.4.1自定义消息转换器
这个消息转化器编码是Controller中的return的字符编码问题,不是指jsp页面中的编码
如果页面中文乱码,可以在xxxApplication中加入自定义的消息转换器,默认是UTF-8
自定义消息转化器,只需要在@Configuration的类中添加消息转化器的@Bean到Spring的容器中,就会被Springboot自动加载到容器中
//自动加入SpringMVC的消息转换器中(取代springboot默认的消息转换器),访问页面上如果出现中文乱码,可以把这个代码片加进去 @Bean public StringHttpMessageConverter stringHttpMessageConverter() { StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8")); return converter; }
2.4.2自定SpringMVC配置
比如加一个拦截器,这时必须通过继承WebMvcConfigurerAdapter才行,而且这个类必须和xxxApplication类处在同级目录或者其所在目录的子目录下面才能被扫描。下面是简单的实现代码
package cn.itcast.springboot.demo;import java.nio.charset.Charset;import java.util.List;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.context.annotation.Configuration;import org.springframework.http.converter.HttpMessageConverter;import org.springframework.http.converter.StringHttpMessageConverter;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;@Configuration //申明这是一个配置public class MySpringMVCConfig extends WebMvcConfigurerAdapter{ // 自定义拦截器 @Override public void addInterceptors(InterceptorRegistry registry) { HandlerInterceptor handlerInterceptor = new HandlerInterceptor() { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("自定义拦截器............"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }; //其中/**表示所有的请求都会经过这个自定的拦截器 registry.addInterceptor(handlerInterceptor).addPathPatterns("/**"); } // 自定义消息转化器的第二种方法 @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8")); converters.add(converter); }}
3.Spring Boot项目中JSP页面无法访问的问题
由于Spring Boot中是内嵌Tomcat的,但是注意这个Tomcat是不支持jsp页面的,必须导入相应的依赖才能访问。
<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope></dependency>
4.发布Spring Boot项目到独立的Tomcat中(即实际生产环境中)
1.工程打包方式为war
这一点可以在创建Spring Starter Project时指定packaging类型为war而不是jar
2.设置spring-boot-starter-tomcat依赖的作用域
将spring-boot-starter-tomcat的作用域设置为provided,表示在工程打包时会自动排除这个依赖,使用生产环境中Tomcat而不是使用SpringBoot中内嵌的Tomcat,没有一定要加上(很多情况因为传递依赖并没有显式的表现出来)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope></dependency>
3.修改代码,设置启动配置
让启动类继承SpringBootServletInitializer,重写其中的configure()方法,将Spring Boot的入口类设置进去。如下代码片
public class HelloApplication extends SpringBootServletInitializer { ...... @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { //设置启动类,用于独立Tomcat的运行入口 return builder.sources(HelloApplication.class); } ......}
4.打包工程
1.打包成war包
右击项目–>Run As–>Run Configurations–>在Goals中输入命令:clean package,勾选Skip Tests–>Run即可。
这样即可打包war包,丢到Tomcat中的webapp目录下即可,运行访问会自动解压,即使没有web.xml文件,但是Spring Boot项目在第三步继承了SpringBootServletInitializer类在打包的时候会自动写一些启动类,所以不必再写web.xml文件
2.打包成jar包
因为上述建工程的时候直接选了packaging为war,所以不需要动,如果要打包成jar包,在pom.xml需要进行修改,将packaging标签改成jar
<packaging>jar</packaging>
然后执行打包命令:Run As–>Maven install即可,打包好的jar包就在项目target目录下面。运行的时候,在dos窗口下,切换到jar包所在目录,执行以下命令即可运行jar包
java -jar jar包
如下
- Spring boot学习记录
- SPRING-BOOT入门学习记录
- Spring Boot学习记录(四)--问题记录
- Spring Boot学习记录(四)--问题记录
- Spring Boot学习记录(一)--环境搭建
- Spring Boot学习记录(二)--thymeleaf模板
- Spring Boot学习记录(三)--整合Mybatis
- Spring Boot学习记录–thymeleaf模板
- Spring Boot学习记录(二)--thymeleaf模板
- Spring Boot学习记录(二)--thymeleaf模板
- Spring Boot学习记录–thymeleaf模板
- spring-boot web测试层学习记录
- spring boot使用记录
- spring boot记录
- spring boot 日志记录
- spring boot 使用redis做缓存学习记录
- spring boot 学习(三)API注解记录及测试
- SPRING-BOOT学习记录001-第一个例子
- 【JavaScript 】对象
- C#版三层之伤
- HttpClient的使用----聊聊架构那些事儿(第三谈)
- 【JavaScript 】函数
- 【第1122期】运动模式对应的心理预期
- Spring boot学习记录
- vm fusion Linux系统克隆
- 【JavaScript 】作用域
- Tomcat系统环境变量配置
- AOP底层原理解析
- sql增删改查之简单查询
- 【JavaScript 】事件
- Chapter 2.猛男的邀请函——《地与光》
- sql增删改查之高级查询