Spring Boot教程(11) – 理解注解@ControllerAdvice

之前,我们介绍过@ModelAttribute@ExceptionHandler,前者可以往请求的Model里加数据,后者可以接受请求处理方法抛出的异常。但是他们放在控制器(Controller)里的时候,作用范围是有限的,只管当前控制器里的方法。如果你有几百个控制器,在每个控制器里都加上类似的代码,不免有点冗余和费劲儿。Spring框架提供了@ControllerAdvice注解,帮助你将其应用到所有的控制器上。

Controller Advice字面上意思是“控制器通知”,Advice除了“劝告”、“意见”之外,还有“通知”的意思。你可以将@ModelAttribute@ExceptionHandler标记的方法提取出来,放到一个类里,并将加上@ControllerAdvice,这样,所有的控制器都可以用了:

(更多…)

继续阅读 →

Spring Boot教程(10) – 错误处理

如果你使用Spring Initializr新建一个web项目,运行并访问他的话,因为没有写控制器,你会得到一个错误页面,告诉你请求路径没找到(404错误):

页面标题为“Whitelabel Error Page”,直译为“白标错误页”,啥是白标,知乎上我搜到了这个答案:

White Label 意思是你开发了一个产品,而这个产品可以根据其他不同公司的品牌形象(品牌logo,品牌颜色,图片等等)包装成该公司自身的产品。

Gary Ma

我觉着吧,“白标错误页”的意思就是这个错误页面是个样板,你可以根据自己的需求自定义错误页面样式。

(更多…)

继续阅读 →

Spring Boot教程(9) – Model的用法

你一定知道Model类,在控制器中,数据会存放到Model对象中,当需要生成HTML的时候,模板引擎会根据名字来定位数据,向下图这样。

从广义上来说,Model指的是MVC中的M,即Model(模型)。从狭义上讲,Model就是个key-value集合。实际上,上图home方法得到的model对象就是一个 java.util.Map ,你可以将Model类型替换为Map<String, Object> ,或者ModelMap——一个实现了Model接口的java.util.HashMap

(更多…)

继续阅读 →

Spring Boot教程(8) – 理解注解@SpringBootApplication

上一篇文章说了说Spring容器的作用,这次趁热打铁,看看Spring Boot中它是怎么起作用的。

有了Spring容器之后,开发的模式简化了很多,你的注意力基本只需要集中在编写Bean上,比如@Controller类呀,@Service类呀,@Repository类呀等等。你新建了一个Spring Boot应用之后,随便编写一个控制器(Controller),他就可以用来处理网络请求了。按理说,一个控制器成为容器中的Bean,得有@ComponentScan来扫描呀,但是新建的应用也没看到有配置类,更不用说依靠在其之上的@ComponentScan注解了。这一些都要从@SpringBootApplication说起。

(更多…)

继续阅读 →

Spring Boot教程(7) – 直观地理解Spring容器

在你学习Spring之前,你肯定听说过“控制反转”、“依赖注入”、“上下文”等名词,伴随着这些名词的,是一些冗长晦涩的解释,这些解释并没有什么显著的错误,但是因为太过抽象导致初学者们无法直观地去理解它们。

废话不多说,我们通过举例或者写代码来一步一步理解它们。

在一个系统里,可能有多个业务部分,比如用户服务,订单服务,数据服务等等,在代码里,这些服务也许分布在多个类中,可能叫做UserService或者OrderService等等。为了简便,我们假设系统里有A、B、C、D四个类,他们有如下的依赖关系:

(更多…)

继续阅读 →

日UV突破50

刚才看了看百度统计的后台,UV(Unique Visitor)突破了50,这个倒不是啥值得庆幸的,只是记录下博客成长的历程。

我算是2月21回到博客的(再往前的博客文章都到了2015年了),从那个时候开始,我进行了一些刻意的写作,搜索引擎收录的还挺快,现在有很多访客是通过搜索引擎过来的。同时我还去一些博客求了友链,从这些友链过来的人也不少。

缓慢的上升趋势

今天在知乎上同步了博客上的一篇文章,不知道是触碰到了什么机制,导致这篇文章被很多人看到了,我的知乎专栏增加了一个点赞一个关注和一个评论(一般情况下发文是没人理的)。而且公众号也有了三个新增粉丝。不禁有点后悔,之前知乎上万阅读的文章后面,没有附上二维码,否则可能给公众号也带来二三十个新增。

就这吧,下次UV突破100我再来说一说。

继续阅读 →

Spring Boot教程(6) – 请求映射

之前的例子里有演示过,控制器(Controller)里的方法加上@GetMapping注解,就可以处理对应路径上的GET请求了。除了它,还有对应的@PostMapping、@PatchMapping、@PutMapping和@DeleteMapping等等。这些注解都来源于一个更通用的注解@RequestMapping,字面意思就是请求映射。我们来看看它的用法:

图中有一个名为method的注解参数,指明了@RequestMapping处理的是GET请求。如果把这个method注解删掉,那么home方法就会处理发送到”/”路径的所有请求。如果你无意在一个方法里处理多种请求的话,我建议你在注解参数里写明需要处理的HTTP请求类型,或者使用更方便的@GetMapping或者@PostMapping等。

(更多…)

继续阅读 →

Spring Boot教程(5) – 模板引擎

模板引擎,是用来生成动态网页内容的,一旦控制器(Controller)收集了足够的数据,就会把数据交给模板引擎来处理,模板引擎根据数据生成HTML,返回给浏览器。

Spring Boot支持多种模板引擎(可以自动配置),包括FreeMarkerThymeleafMustacheGroovy Templates。你可能也知道JSP,被很多人认为是过时的技术,虽然他仍然可以完成你大部分的需求,也可以在Spring Boot中使用,但是已经不被推荐了,具体你可以参考 为什么Spring Boot不推荐使用JSP? 。Thymeleaf现在被很多人采用,他的特点就是可以直接在浏览器中打开模板文件,方便前端开发。FreeMarker使用FreeMarker模板语言(ftl),跟使用JSP或者PHP的感觉有点相似,但是他并不是通用语言,只专注于在模板中展示数据。Mustache和Groovy Templates一句话两句话说不太清楚,大家看看例子就好。

(更多…)

继续阅读 →

聊一聊之前25刀买阿里股票的事

我是在2013年毕业的时候去的阿里,当时虽然离上市只有1年的时间,但是并没有人知道阿里什么时候会上市,在哪里上市。

于此同时,内网里有很多股票的交易帖子。有部分员工可能急用钱,会卖个几千股,有部分员工或者公司外部的投资者,会发帖求购,我看到这类帖子的,通常会换算成人民币,然后感叹他们真的是大手笔。我也有购买的想法,毕业第一年哪有钱呀,一千股两千股这种挺多的,少一点还有人卖500股,盯了一段时间之后,某天有位支付宝员工发帖卖300股,我想这么小的量我可以搞一搞。

(更多…)

继续阅读 →

Spring Boot教程(4) – 依赖管理

不管你熟悉不熟悉Gradle,build.gradle文件中的内容都是要去重新认识的。

上图是一个典型的,刚刚生成的build.gradle文件,添加了个Guava依赖。repositories{ mavenCentral() } 这段代码表示我们的依赖都是从中央仓库下载的。 比如这个Guava库,implementation后面跟上库的坐标就可以引入 ,之前我们说过,坐标由 groupId:artifactId:version 组成。奇怪的是,上面列出的第一个依赖,却没有版本号。因为这个版本号是由一个插件管着的,插件叫做 io.spring.dependency-management。

说到这儿,又要牵扯出很多东西了,容我深吸一口气。

(更多…)

继续阅读 →