spring
文章平均质量分 70
司青-已停止更新
本博客已停更;
展开
-
基于JMS消息中间件的分布式系统初探究(二) - 服务端反射调用组件方法
在上一篇文章中,我们解决了子系统之间的通讯问题,并跑起来了一个模型项目。这里我们要详细实现服务端程序。我们在服务端运行Spring,利用Spring的IoC容器来管理所有的Service组件,然后根据接收到的JMS消息通过反射动态调用Service方法。首先要先设计一下协议:public class MessageProtocol implements Serializable { /**原创 2015-03-25 02:46:02 · 2109 阅读 · 0 评论 -
Intellij Idea下运行Spring Boot关于provided依赖不加入classpath的bug与解决方案
在 Intellij Idea 15 中使用maven时,所有 scope 为 provided 的依赖都是不会被加入到 classpath 中的,目前该bug尚未被修复(bug report)。如果你的web应用是部署到容器中的,那么这个bug不会影响使用,因为web应用中provided的依赖在容器运行时会被提供。如果你做Spring Boot开发,有带provided的依赖时,直接在IDE中运原创 2016-03-18 16:27:59 · 30352 阅读 · 6 评论 -
集群环境下使用Shiro的技术方案(With Redis)
在此之前,我是使用自己编写的web安全框架完成基于角色role的权限验证的,在集群环境中只需要将session中的信息存放到redis中即可。然而换成Shiro后,我发现事情麻烦了很多,因为需要学习Shiro的文档,自定义SessionDAO实现Redis的Session存储,但是这里面还是有一些坑。通过Reids实现Shiro Session共享首先在集群环境下,我们不能使用 servlet 规范原创 2016-03-09 23:00:09 · 5522 阅读 · 1 评论 -
Spring Boot Web应用的异常处理
Web应用在处理请求时可能会出现多种错误,如请求参数不正确、URL不存在、请求方法错误、内部未知错误等。SpringMVC有多种异常处理方式,使用某种方式的判断标准是,你的异常是在请求处理的哪个阶段发生的。在执行@RequestMapping方法时发现的异常这也是最常见的异常了,处理业务逻辑时可能会发生各种问题,如数据库报错、请求参数格式错误/缺失/值非法等。此类异常的捕获方法有两种,对于提供RES原创 2016-04-07 23:19:54 · 11856 阅读 · 1 评论 -
Spring Boot: HttpMediaTypeNotAcceptableException: Could not find acceptable representation原因及解决方法
错误场景使用Spring Boot的Web项目,在其 resources/static/目录下存在login.html静态文件,同时还有一个处理/login请求的控制器方法(该方法会返回JSON格式的数据)。此时如果访问localhost:8080/login.html,用户期望返回login.html页面,但框架却报错:org.springframework.web.HttpMediaTypeNo原创 2016-06-01 18:05:13 · 63929 阅读 · 2 评论 -
Spring Cloud与分布式系统
本文不是讲解如何使用Spring Cloud的教程,而是探讨Spring Cloud是什么,以及它诞生的背景和意义。背景2008年以后,国内互联网行业飞速发展,我们对软件系统的需求已经不再是过去”能用就行”这种很low的档次了,像抢红包、双十一这样的活动不断逼迫我们去突破软件系统的性能上限,传统的IT企业”能用就行”的开发思想已经不能满足互联网高并发、大流量的性能要求。系统架构走向分布式已经是服务器原创 2016-07-15 17:26:57 · 18000 阅读 · 18 评论 -
Spring Cloud(Netflix) Feign: 以Dubbo暴露服务的方式使用Feign
需求场景在微服务架构中,服务的请求者以何种方式调用远程服务是一项核心问题。在Spring Cloud(Netflix)技术栈中,每个微服务是以HTTP REST接口的形式暴露的,这样在执行远程调用时,正常情况下需要使用一个HTTP客户端,然后向服务发起HTTP请求。实际上,如果使用Netflix的Feign作为Http Client的话,我们就可以做到像Dubbo一样,服务的调用者直接调用接口方法调原创 2016-08-11 11:18:29 · 22533 阅读 · 4 评论 -
JDK反序列化时修改类的全限定性名
应用场景Spring Security OAuth2有一个奇葩的设计,那就是它将与access_token相关的所有属于都封装到OAuth2AccessToken中,然后保存时会直接将该对象序列化成字节写入数据库。我们在资源服务器中想要直接读数据库来取出access_token来验证令牌的有效性,然而又不想引入Spring Security的相关依赖污染jar包。这时可以将Spring Securi原创 2016-09-14 16:47:39 · 8999 阅读 · 1 评论 -
使用Spring Cloud Security OAuth2搭建授权服务
Spring Cloud Security OAuth2 是 Spring 对 OAuth2 的开源实现,优点是能与Spring Cloud技术线无缝集成,如果全部使用默认配置,开发者只需要添加注解就能完成 OAuth2 授权服务的搭建。添加依赖授权服务是基于Spring Security的,因此需要在项目中引入两个依赖: <dependency> <groupId>org.spri原创 2016-09-14 17:58:03 · 131383 阅读 · 88 评论 -
如何裸写或利用Spring扫描出指定包下的所有类名
在很多Java框架中都有组件扫描功能,即给出一个注解,框架能够把所有标注了此注解的类找出来。这种操作的本质是给出一个名包,能获取到此包下的所有类名,然后再通过反射判断是否加了指定的注解。无论是什么框架,包括Spring, 完成这个功能底层都是用的ClassLoader.getResources()或ClassLoader.getSystemResources()方法实现的,即先找出指定classp...原创 2018-09-30 16:16:55 · 7188 阅读 · 0 评论 -
Spring Boot + Mybatis + Log4j2开发环境搭建
近些年来由于微服务架构越来越受欢迎,基于JVM平台的”微框架”也如雨后春笋般涌现:小清新的如Spark Framework, 重量级的如Spring Boot。Spring Boot相比其它微框架来说,有以下几点优势:自带实时监控、开发者工具与Spring无缝集成社区活跃配置依赖首选我们的web项目需要从spring-boot-starter-parent父项目中继承而来:<parent>原创 2016-03-04 14:56:13 · 9284 阅读 · 1 评论 -
MySQL主从复制和读写分离
我们知道应用对数据库的访问通常情况下大部分都是读操作,写只占很少一部分。因此读写分离(read-write-splitting)能有效降低主库压力,从而解决网站发展过程中遇到的第一次数据库瓶颈。主从复制首先必须开启master库的bin-log,因为mysql的主从复制是异步的,所以master库必须将更新操作记录下来以供slave库读取。 假设现在有A, B两台机器,A为master, B为sl原创 2015-07-16 16:39:52 · 1584 阅读 · 1 评论 -
Spring MVC不要在@Service bean中保存状态
先看这么一段代码:原创 2014-11-11 21:33:38 · 2040 阅读 · 0 评论 -
Spring MVC的单元测试和集成测试(不使用mock)
文章要点:1. 为Controller编写测试,不需要应用服务器环境2. 为Service编写测试,不需要应用服务器环境原创 2014-11-05 09:11:59 · 6308 阅读 · 0 评论 -
Spring源码分析: SpringMVC启动流程与DispatcherServlet请求处理流程
Spring版本: 4.0.X 注:这里的分析只关注整个处理流程的大致过程,省略与流程无关的代码。应用根上下文(Root ApplicationContext)的启动在一个web项目中使用SpringMVC时,需在web.xml中配置一个监听器:<listener> <listener-class>org.springframework.web.context.ContextLoa原创 2015-03-11 23:54:20 · 3236 阅读 · 0 评论 -
SpringMVC: web.xml中声明DispatcherServlet时一定要添加load-on-startup标签
游历SpringMVC源码后发现,在web.xml中注册的ContextLoaderListener监听器只是初始化了一个根上下文,仅仅完成了组件扫描和与容器初始化相关的一些工作,并没有探测到具体每个URL应当map到哪个Controller, 哪个方法上。而剩一下的这些复杂工作都是由DispatcherServet来完成的,即应用服务器加载DispatcherServlet调用init()方法时才原创 2015-03-12 20:58:38 · 3564 阅读 · 1 评论 -
基于JMS消息中间件的分布式系统初探究(一) - 通过JMS实现Web服务器与服务框架的通讯
在一个大型网站中,如果要把整个业务拆分成N个子业务,每个业务单独部署到一台服务器上,那么需要解决的问题有:自身的部署。是部署到JavaEE容器中随容器启动,还是做为一个standalone程序单独启动?子系统如何暴露服务接口(如何与其它系统进行通讯)。服务请求者直接通过Socket直连,还是通过Web Service, RMI等技术?这里我们尝试通过standalone方式部署,通过JMS中间原创 2015-03-24 00:47:48 · 3093 阅读 · 0 评论 -
SpringMVC拦截器中通过反射得到Controller方法注解时ClassCastException解决方案
错误应用场在Controller中,我们自定义了一个@Auth注解来实现权限控制功能,如:@Auth(verifyLogin=false,verifyURL=false) @RequestMapping("/login") public ModelAndView login(HttpServletRequest request,HttpServletResponse respons原创 2015-06-11 16:19:42 · 13273 阅读 · 0 评论 -
Spring AOP + Redis缓存数据库查询
应用场景我们希望能够将数据库查询结果缓存到Redis中,这样在第二次做同样的查询时便可以直接从redis取结果,从而减少数据库读写次数。需要解决的问题操作缓存的代码写在哪?必须要做到与业务逻辑代码完全分离。如何避免脏读? 从缓存中读出的数据必须与数据库中的数据一致。如何为一个数据库查询结果生成一个唯一的标识?即通过该标识(Redis中为Key),能唯一确定一个查询结果,同一个查询结果,一定能映原创 2015-07-09 00:42:34 · 11527 阅读 · 17 评论 -
在Servlet Filter中使用Spring容器
定义一个filter, 实现ApplicationContextAware接口:public class CacheFilter implements Filter, ApplicationContextAware { private static ApplicationContext ctx; // 必须声明为static @Override public void init原创 2015-06-14 22:46:29 · 2115 阅读 · 1 评论 -
SpringMVC通过Redis实现缓存主页
首先,缓存主页的目的并不是提高性能,而是减少数据库访问压力,有效推迟数据库I/O瓶颈的到来。实现主页缓存的方法有很多,但是鉴于项目中使用了Redis对数据库读写做了缓存,因此把顺便也就把主页也缓存了吧。实现思路编写一个过滤器,在过滤器中拦截对主页的访问请求。此时向Redis服务器查询主页html的缓存,如果有则直接返回给客户端,如果没有,则在过滤器中截获JSP的渲染结果,放到Redis缓存中,以供下原创 2015-06-14 23:41:40 · 2970 阅读 · 1 评论 -
spring-kafka的线程模型与spring.kafka.listener.concurrency参数
在spring应用中如果需要订阅kafka消息,通常情况下我们不会直接使用kafka-client, 而是使用更方便的一层封装spring-kafka。不过,它可不是简单的封装了kafka-client, 这里面有很多需要注意的问题,比如下面这个参数:spring.kafka.listener.concurrency=3它并不像参数名那样简单,背后挺复杂的。如果你用jstack把线程dump...原创 2019-04-23 17:53:34 · 16963 阅读 · 12 评论