spring boot初步尝试
第一次知道spring boot这个项目是为在学习spring的时候,在官网上看到的,那个时候不知道这个项目是干嘛的,也就没再继续关注了
这些天实习没什么事做,一直没用spring框架了,就想着去官网上看看有什么变化,再次看到spring boot这个项目,决定进去看看,反正开学要交的课程设计也就是对数据库的增删改查做个看的过去的小网站,于是就决定在官网上看看怎么用,然后完成课程设计,期间还遇到了不少问题,加上用百度搜索spring boot 结果基本都是hello world,所以遇到一个问题得花很长世间解决,不过为发现在stackoverflow上倒是有不少解决spring boot的问题。
先说下spring boot是用来干嘛的吧,官网上说的是 用来快速构建项目的一个工具(大概是这么个意思)
spring boot基本上是用的注解配置,当然也可以使用xml配置,但是推荐使用注解配置,我认为,如果想使用xml配置的话,就没必要使用sprong boot了
spring boot的注解配置很简单,虽然spring mvc 也有全注解配置,但是为感觉挺复杂的,之前准备学习spring mvc的全注解配置的,但是百度搜索了一下,结果很坑爹,全是使用xml配置,然后再代码里面使用注解 注入 和IOC,这就算是全注解了,对于百度搜索技术问题,我已经要崩溃了,而且接近十年前的结果还保留着,为也真是醉了(吐槽下)
反正个人觉得spring mvc的注解配置比较复杂,spring boot的注解配置挺简单
然后,使用spring boot 推荐使用项目管理工具,我使用的是maven,这样,spring boot就能统一管理jar包了,这也是为比较喜欢的地方,终于不在有jar包冲突了,终于不会再少包了,比如想要使用spring aop的功能,只需要在pom.xml中加上一句
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
然后它就会把aop使用的jar包都会弄下来,就不用自己一个一个的依赖了,这对于那些对aop不熟的同学非常方便了(比如说我),不用考虑jar包导全美,声明一句就可以直接使用了,为查了下spring aop貌似还有依赖aspectj这个项目,要是对这个不熟悉,少了个jar包,到时候报错了都不知道怎么处理了
ok,说了这么多,先说下为是怎么学习的吧,我是先去官网上,按照上面的quick start,弄一个hello world出来,(百度spring boot得到的结果基本也是别人弄个hello world)
然后我就把spring boot 的reference简单的扫视了一遍,有个大概的了解,然后直接去github上把spring boot 的项目拉下来,里面有各种示例,照着里面学确实挺简单的,遇到问题就去stackoverflow上搜索一下,基本都能够解决
然后就能基本使用spring boot了
之前学习spring mvc 也是在官网上学习的,然后经过这次学习为发现,学习这些技术上的东西去官网上看也不怎么很难看懂(简单使用),因为书上讲的基本都能在官网上学到,为刚开始学习web的时候也是买了一本java web的书学习,首先书上的版本就不是很新,(貌似实际的项目用的版本都不是很新),然后书上讲的也都是一些比较浅显的应用。我认为还是去官网上看,然后把官方的例子代码下载下来看,学习 这样比较有效率
这次学习spring boot 我也学习到了一些其他的知识,比如说aop,这次在里面加了个日志模块,就是想学习下aop,使用的jpa,这个对于小的课程设计是非常方便的,当然,肯定会存在效率问题,但是对于课程设计不存在这些问题。这次在项目里面基本上都打印了log,方便找问题,页面使用的是freemarker,这个在使用spring boot的时候遇到了不少问题,现在还存在的一个问题是session的值在页面中去不到,于是为就在类里面弄了个静态变量,保存,在拦截器post那个方法里面每次都再设置进去,还使用了redis保存了session的值,但是redis在启动的时候,好像是没初始化,一直报错,因此还是只能用静态变量了,看以后可不可以解决,然后使用了spring test,我之前就接触过spring test了
觉得挺好用的(主要是有回滚)
说了这么多,为也把spring boot 的配置弄上来,以后好做个参照
首先是pom的依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.2.5.RELEASE</version> </parent>
在pom中加上这个,spring boot推荐这么做,如果项目已经是某个项目的子项目了,也是有解决方案的,官网上有写,为没仔细看,所以也没记住怎么解决
然后想要用spring mvc的话 继续在pom中添加依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
这样有关mvc的jar包就全部下载下来了
然后就是Hello World了,为就把官网上的例子复制下来
package hello; import org.springframework.boot.*; import org.springframework.boot.autoconfigure.*; import org.springframework.stereotype.*; import org.springframework.web.bind.annotation.*; @Controller @EnableAutoConfiguration public class SampleController { @RequestMapping("/") @ResponseBody String home() { return "Hello World!"; } public static void main(String[] args) throws Exception { SpringApplication.run(SampleController.class, args); } }
然后运行这个main方法,在浏览器里面输入localhost:8080就能看到Hello World了
spring boot的所有项目都是从main方法启动的,mvc默认使用tomcat,默认端口8080,tomcat不需要自己配置,它会自动下载tomcat的jar包
想换成jetty启动的话,在pom里面添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency>
然后再重新启动下,就可以发现是jetty启动了(看打印的日志)
说到tomcat 和jetty 我就不得不吐槽了,不知道为发现的这个问题是不是存在,还是我自己使用错,当为使用tomcat的时候如果有一个action的key是 /user/login(controller上mapping "user", 方法上mapping "login"),另一个action也一样,key为 /goods/add 如果为已经触发了/user/login,并且进入了相应的页面,页面中有个链接触发action(url为 /goods/add) 实际上并不会触发/goods/add 而是请求错误,实际的url看地址栏里面是 /user/goods/add 所以我就无语 首字母为/ 不是代表着根目录吗?所以以前使用tomcat的时候都是在页面上加上上下文地址.
在使用jetty之后,为发现上面这个问题解决了,所以,为现在一直使用jetty启动项目,貌似网上也是都推荐使用jetty的
说远了,继续spring boot
spring 的默认配置文件为application.properties,一些配置和参数都可以写在里面
比如
#freemarker spring.freemarker.suffix=.html spring.freemarker.content-type=text/html spring.freemarker.expose-session-attributes=true spring.freemarker.expose-request-attributes=true spring.freemarker.expose-spring-macro-helpers=true spring.freemarker.request-context-attribute=request spring.freemarker.allow-request-override=true spring.freemarker.enabled=true #datasource spring.datasource.url=jdbc:mysql://127.0.0.1:3306/design?characterEncoding=utf8 spring.datasource.username=root spring.datasource.password=luolei1994 #jpa spring.jpa.show-sql=false #server server.port=8080 server.tomcat.uri-encoding = UTF-8 # REDIS (RedisProperties) spring.redis.host=127.0.0.1 spring.redis.password=luolei spring.redis.port=6379 spring.redis.pool.max-idle=8 spring.redis.pool.min-idle=0 spring.redis.pool.max-active=8 spring.redis.pool.max-wait=-1 #logger logging.path= logging.file= logging.config= #key key = luolei #test index=luolei
这样的话,修改项目的配置是非常方便的
当然,之前的Hello World 配置类上那么多注解也都是不必要了
可以这样写
@SpringBootApplication public class Application extends WebMvcConfigurerAdapter { public static void main(String[] args) { SpringApplication.run(Application.class,args); } @Override public void addInterceptors(InterceptorRegistry registry) { super.addInterceptors(registry); registry.addInterceptor(new LoginInterceptor()); } }
可以不用继承任何类,我是因为要添加interceptor,所以继承了WebmvcConfigAdapter
官网上解释 @SpringBootApplication 这个注解,== @Configuration + @EnableAutoConfiguration + @ConponentScan 这三个注解
不过要注意配置类的位置,要在项目的最外层,不然无法扫描到全包
默认的静态文件夹为resourcs 下的static,或者public(可以看官网,不止这两个名字),把一些静态资源(js,css,images)放在里面是不会被拦截的,这样就解决了spring mvc静态资源被拦截的问题了(虽然解决很简单)
今天就说到这里了,都这个点了,还在公司里写博客,
为发现自己的话变多了,没有像之前的几篇博客里面都是代码了,这样挺好的,纯代码没多大意思,重要的是自己的理解,继续努力,争取大四上找个好工作,加油