spring
文章平均质量分 72
绝世好阿狸
这个作者很懒,什么都没留下…
展开
-
【SpringMVC(十七)】静态资源
在SpringMVC中,如果对静态资源不做特殊处理,如果找不到会返回404.原因是,我们在web.xml中会这样配置dispatcherServlet的url-pattern: <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/&l...原创 2020-04-06 19:17:28 · 519 阅读 · 0 评论 -
【SpringMVC(十六)】分片上传 例子
对于大文件的上传,客户端可以多线程分片上传,加快速率,服务端需要merge分片并存储。常见思路:通过status预上传接口获取一个key,再调用分片接口上传每一个分片,上传完调用publish接口完成上传。status接口的key用于串联整个过程。一个简单的示例:@RestController@RequestMapping("/rest/n/testApi")public c...原创 2020-04-05 20:27:36 · 258 阅读 · 0 评论 -
【SpringMVC(十五)】HttpRange 分片下载 断点续传
基于http协议实现断点续传。请求部分,需要在请求头里加入Range头,表示本次请求的byte数组的开始和结束位置。https://tools.ietf.org/html/rfc7233#section-3.1格式为:Bytes=开始-结束。如果不填表示0或者最后。对于要支持断点续传的服务器,需要处理这个请求头,如果发现有Range头部,需要对响应特殊处理。body:返回Ran...原创 2020-04-05 20:12:26 · 2805 阅读 · 0 评论 -
【SpringMVC(十四)】HttpMessageConverter
接口定义:public interface HttpMessageConverter<T> { boolean canRead(Class<?> clazz, @Nullable MediaType mediaType); boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType)...原创 2020-04-05 19:19:22 · 320 阅读 · 0 评论 -
【SpringMVC(十三)】ResponseEntity 使用 及 原理
使用ResponseEntity可以作为controller的返回值,比如对于一个处理下载二进制文件的接口,可以这么定义: @RequestMapping("/download") public ResponseEntity<byte[]> download(@RequestParam String fileName) throws IOException {...原创 2020-04-05 17:22:53 · 40862 阅读 · 1 评论 -
【SpringMVC(十二)】@ControllerAdvice 异常处理 使用 及 原理
我们在写web应用时,有一个很常见的需求就是:业务层可能会抛出各种各样的异常,我们希望可以在最终接口返回时,根绝异常类型自动映射为一个errorcode以及errormsg,下发给客户端。具体看下:以登录为例,我们有一个userService,可以通过客户端的token反解出user信息。如果token不合法,则抛出一个业务异常,终止当前请求:@Servicepublic clas...原创 2019-11-02 14:38:13 · 861 阅读 · 0 评论 -
【SpringMVC(十一)】xml默认配置文件位置
今天想写一个springmvc的demo程序,但是一直在报找不到applicationContext.xml配置文件的错误。我当时将配置文件放在了classpath下,以为spring启动时默认是在classpath下寻找的,但是实际上不是,这里做一个记录。如果使用xml配置方式,那么默认会使用XmlWebApplicationContext类型的容器。该容器实现了loadBeanDefi...原创 2019-11-02 13:29:09 · 1370 阅读 · 0 评论 -
【Spring(十五)】Resource
Java中处理资源的核心接口是InputStream和OutputStream,但是用起来不是特别方便,spring在此基础上做了进一步的封装,形成了以Resource接口为核心的一套资源体系。首先看下Resource接口:public interface Resource extends InputStreamSource { boolean exists(); boolean...原创 2019-10-20 22:30:48 · 284 阅读 · 0 评论 -
【SpringBoot(二)】@Condition 注解
在springboot的自动化配置中,这个注解起到了相当重要的作用。其一般与@Bean注解一起使用,作用就是满足一定条件才将@Bean修饰的bean注入容器。下面看一个例子,仅仅当classpath下有某一个类才注入bean。定义一个Condition接口的实现:public class MyCondition implements Condition { @Ove...原创 2019-08-25 00:50:15 · 534 阅读 · 0 评论 -
【Spring(八)】父子容器
Spring的容器具可以具有父子关系。具体含义就是:如果两个容器具有父子关系,那么在查找bean时,会先从子容器中查找,如果没有就查找父容器。但是父容器不能查找子容器的bean。这个特性有什么意义?比如,现在有一个应用,确实需要隔离不同的bean在不同的容器中,所以需要创建多个spring容器。但是,这些容器的bean可能都需要一些基础的bean,比方说数据访问层的bean,那总不能每一个...原创 2019-09-21 18:23:47 · 731 阅读 · 0 评论 -
【Spring(九)】Aware 接口
Spring中很多接口带有Aware后缀,具体什么含义呢?Aware本身就是一个接口:public interface Aware {}字面意思是通知,本身其实是回调接口,也带有标记接口的意味。Spring会把检测实现了Aware接口的bean,然后调用其接口方法。接口方法一般是设置某一个变量的回调,也就是spring回调实现方的aware方法,将某一个变量回传。比如说App...原创 2019-09-26 00:26:20 · 374 阅读 · 0 评论 -
【Spring(十)】事件机制
Spring的高级容器接口继承了ApplicationEventPublisher接口,说明其具备了事件发布的能力,这里就介绍下Spring的事件功能。不过说实话,这个功能貌似很鸡肋,没见过使用场景。但是不影响我们抱着学习的态度研究下。首先看下接口定义:@FunctionalInterfacepublic interface ApplicationEventPublisher {...原创 2019-09-26 21:56:15 · 118 阅读 · 0 评论 -
【Spring(十一)】国际化
Spring的国际化是通过接口MessageSource来定义的。先看下该接口:public interface MessageSource { @Nullable String getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage, Locale locale); Str...原创 2019-09-29 00:11:11 · 530 阅读 · 0 评论 -
【Spring(十二)】EnvironmentCapable
首先,带有Capable后缀的接口在Spring中带有getXXX的含义,也就是实现了这个接口,就可以通过该接口的实例获取到XXX,这个和Aware接口很类似。所以,这里的EnvironmentCapable接口就是可以获得一个Environment实例。看下接口定义:public interface EnvironmentCapable { /** * Return the ...原创 2019-09-30 18:21:27 · 2630 阅读 · 1 评论 -
【Spring(十三)】ApplicationContext 容器体系 介绍
Spring容器集成体系很复杂,初看源码时很容易一头雾水,不过到目前为止,也看了不少Spring的源码了,这里对Spring容器体系做一个总结。这一篇介绍下高级容器部分。我们先从基本的非web以及非注解的容器看起,比如说ClassPathXmlApplicationContext体系。1.ApplicationContext这是Spring高级容器的接口,继承了若干其他接口,这个接口定...原创 2019-10-02 01:17:34 · 466 阅读 · 0 评论 -
【Spring(七)】BeanFactoryPostProcessor
先回顾下spring高级容器中最重要的方法refresh:先构建一个DefaultListableBeanFactory容器实例,内部会注册一次bean;再调用postProcessBeanFactory方法及invokeBeanFactoryPostProcessors方法,这里是spring的一个扩展点:BeanFactoryPostProcessor接口。因为之前已经注册过一次bea...原创 2019-08-18 21:10:33 · 231 阅读 · 0 评论 -
【Spring(五)】AnnotationConfigApplicationContext 原理
对于main函数中使用spring的场景,有两个常见的高级容器。一个是ClassPathXmlApplicationContext,基于classpath下的xml配置文件;另一种是AnnotationConfigApplicationContext,基于java配置文件。各自的使用在这篇里有讲:https://blog.csdn.net/u010900754/article/details/...原创 2019-08-18 20:16:27 · 21775 阅读 · 1 评论 -
【Java】Spring IOC 使用
Spring支持三种类型的bean配置:1.xml;2.自动装配;3.java config;下面分别看下。 xml方式:分为 基于构造方法的和基于属性的注入。首先定义一个xml文件存放bean的定义,每一个bean都用标签<bean>来表示,里面要有bean的类型,一般是类名的全限定。可选的是bean的name,一般都要指定,这是比较好的做法,但是如果...原创 2018-08-09 00:28:09 · 168 阅读 · 0 评论 -
【Spring(三)】AOP
1.概述AOP全称是aspect oriented programming,中文是面向切面编程。怎么理解这个概念呢?在接触AOP之前,我们的编程模式是OOP,即面向对象编程。经常有这样的场景,我们很多的业务对象都需要实现相同附加逻辑,但是呢,这些附加逻辑与业务逻辑不相关的。这时,我们需要为每一个业务对象加一遍附加逻辑,这时重复代码,其次呢,我们业务对象的关注点也随之变多了,需要主动调用...原创 2019-04-27 23:39:58 · 163 阅读 · 0 评论 -
【Spring(一)】概述
spring作者是Rod Johnson,这一套框架是为了简化java开发。主要从以下四个方面:基于依赖注入和接口实现松耦合;引入aop编程,基于切面编程;引入模板,减少了样板代码;基于POJO,减少代码侵入性;spring的两大核心技术:依赖注入;面向切面编程;spring基于以上特性,已经推出了一个spring的生态圈,主要包含:spring核心容器;...原创 2019-04-24 23:15:57 · 206 阅读 · 0 评论 -
【Spring(二)】依赖注入 以及 bean的配置方式
依赖注入依赖注入的目的是降低对象之间的耦合度。任何一个程序都是有很多对象协作完成任务的。不可能每一个对象都没有关联。我们希望对象之间的耦合方式越松越好(不是越少越好)。那么什么是紧耦合?比方说A依赖B,那么直接在A的构造器或者任何初始化方法里面构建B的方式就是紧耦合,因为A的依赖已经写死在A的代码里面,如果所有的依赖都按照这种方式来写,那么整个程序就不是松耦合的。这样的坏处在于,一旦我们要修改...原创 2019-04-24 23:39:37 · 2866 阅读 · 0 评论 -
【Spring(三)】IOC 容器实现
Spring IOC可以帮助我们管理对象之间的依赖,那么内部又是如何实现的?首先看下IOC相关的接口定义:BeanFactory:最顶层的bean接口,主要定义了容器最基本的功能,比如根据bean的name或者type来获取bean。接着是三个扩展的接口,都继承了BeanFactory。HierarchicalBeanFactory定义了bean容器可以有父子关系。Li...原创 2019-06-16 17:38:05 · 237 阅读 · 0 评论 -
【Spring】autowired NullPointerException
代码:@Servicepublic class Api { @Autowired private ServiceA serviceA; private String name = serviceA.getName();}@Servicepublic class ServiceA { public String getName(){ ...原创 2019-06-16 18:25:40 · 1191 阅读 · 0 评论 -
【SpringMVC(一)】父子容器 web应用 容器启动 原理
之前介绍了spring ioc容器的基本原理,这里介绍下spring ioc容器在web场景下的原理。主要从以下几个方面:1.web应用容器概述2.web应用父容器启动过程;3.web应用父容器与servletContext的关系;4.dispatcherServlet中子容器启动过程;5.dispatcherServlet的子容器与父容器的关系;6.两个容器的配置文件;...原创 2019-06-16 21:57:50 · 1032 阅读 · 2 评论 -
【Java】Spring init-method和@PostConstruct 原理
我们知道如果想要自定义bean的初始化行为,有两种方法:1)使用xml配置在bean的xml定义中指定init-method属性。2)注解配置在bean的class定义中添加@PostConstruct注解。例子:xml如下配置:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http:...原创 2019-07-07 20:21:18 · 20036 阅读 · 0 评论 -
【Java】Spring 属性注入 @Autowired 原理
主要分两块,一是xml文件定义的bean,另一个是@Autowired。1. xml文件bean定义的读取入口还是在bean定义的解析与注册上,这里省略前面部分直接看XmlBeanDefinitionReader的解析部分: @Override public int loadBeanDefinitions(Resource resource) throws BeanDefini...原创 2019-07-13 22:58:45 · 1013 阅读 · 0 评论 -
【Java】Spring bean 生命周期
主要研究下spring这几个重要的点的先后顺序和原理:1.构造器;2.autowired3.init-method4.PostConstruct5.BeanPostProcessor的方法6.InitializingBean的afterPropertiesSet方法这里可以肯定的是构造器先于其他所有的。从实现上,autowired,postConstru...原创 2019-07-14 00:12:46 · 130 阅读 · 0 评论 -
【SpringMVC(七)】使用ArgumentResolver 接受 json 参数
这里介绍下如何使用一个argumentResolver预处理httpServlet里的body,并且提取出json参数,传递给controller。先定义一个标记注解:@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.PARAMETER)public @interface JsonParams {}再定义一个处理该标记...原创 2019-08-04 18:04:47 · 1078 阅读 · 0 评论 -
【SpringMVC(四)】三种 HandlerMapping
HandlerMapping是一个接口,作用是通过httprequest中的url找到合适的handler:HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;其中就只有这一个方法。目前有三种实现:1.BeanNameUrlHandlerMapping需要在配置文件中配置c...原创 2019-08-05 20:05:34 · 393 阅读 · 0 评论 -
【SpringMVC(六)】ArgumentResolver 使用 及 原理
ArgumentResovler是springmvc为我们提供的一个处理controller请求参数的扩展点。下面看一个常见的使用例子。现在有一个web应用,api接口需要拿到一个userId,但是这个userId又不能直接通过http参数拿,可能是传一个token,然后,根据token从服务器取出登录用户的userId。当然一种方案是在interceptor里面解析token拿到user...原创 2019-07-28 14:19:39 · 6974 阅读 · 1 评论 -
【Spring(六)】@Import 注解使用
看下注解定义: * Indicates one or more {@link Configuration @Configuration} classes to import. * * <p>Provides functionality equivalent to the {@code <import/>} element in Spring XML. * O...原创 2019-08-18 19:11:09 · 197 阅读 · 0 评论 -
【Spring】aop 例子
pom:<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache原创 2018-05-01 00:16:09 · 139 阅读 · 0 评论