Coup de Grace

框架系列 他们怎么用开发框架

最近买了几本国产原创书,具体可以看我的书单.

框架基础实现,大概每章我都会描述一下实现思路.甭说基础不基础,其实我觉得写书来讲不犯错就挺好了.

新手教程->高手进阶,挺好的一本书,写了不少我不会的东西,只是作者语文貌似不太好.

快跑!这是本垃圾.具体可以翻看京东上的评论.

相比起来这本就用心的很,内容详实.值得一看.

前三本的内容在上一篇中.

本篇主要是最后一本的一些读后摘抄.

一直以来用的Spring版本都很低,大多是被公司封装过的..最近兴趣也不在此.


本篇内容

其中微服务实战放在pi cluster系列文章中.


高版本Spring的一些

模块化maven项目

这个随便搜索一下就好.

注解与Java Configration

应用场景:

java配置:

通过@Configuration/@Bean/@ComponentScan来实现主要功能.

通过@Enable* 系列来启用增强功能.

可以在配置类中手动完成注入等操作.

配合ApplicationContext可以迅速完成容器的bean的注册与提取,应用在测试中相当方便.

常用@Enable*系列总结:

AOP

说起来没有@Throws之类的是不是比较可惜.

Bean相关

Aware接口

使普通Bean获得容器相关的功能来控制生命周期上的活动.

独立应用上的启动与关闭hook可以在这里实现.

线程池

ThreadPoolTasjExecutor.

这比原声异步无阻塞的Vert.x就寒酸很多了.

注解与@Enable*

Spring Boot的主要内容就是组合注解与@Enable系列的默认配置.

@Conditional:

  1. 实现Condition来定义条件
  2. 配置中@Conditional来配置条件产生时的动作

组合注解不解释了:替换value内容.

@Enable*:

每个@Enable*都有一个@import注解来导入配置类:

测试

利用:

来进行简单接口测试.

MVC功能

  1. @EnableWebMVC启用功能,配置内初始化ViewResolver.
  2. 单独实现WebApplicationInitializer来替代web.xml,被Servlet容器获取配置
  3. Initializer内新建WebApplicationContext关联当前servletContext,并注册DispatcherServlet.

常用注解就不说了:

配置:

  1. 继承WebMVCConfigurerAdapter+@EnableWebMVC
  2. 定义ViewResolver的bean
  3. 静态资源映射需要注册ResourceHandlers相关在registry上
  4. 拦截器继承HandlerInterceptorAdapter覆盖方法,注册到registry上
  5. @ControllerAdvice可以作为增强覆盖在所有Controller上,内含

    • @ExceptionHandler:定义全局异常处理
    • @ModelAttributes:内存容器,类似Vert.x的SharedData
    • @InitBinder:用来将db对象暴露给web
  6. 简单的页面跳转可以在配置中重写addViewController来注册映射关系到registry中.

客户端服务端交互

Spring中Comet的实现:

MVC测试

Mock的部分所有Servlet上的内容都可以Mock.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {MyMvcConfig.class})
@WebAppConfiguration("src/main/resources") //1
public class TestControllerIntegrationTests {
    private MockMvc mockMvc; //2
    @Autowired
    private DemoService demoService;//3
    @Autowired 
    WebApplicationContext wac; //4
    @Autowired 
    MockHttpSession session; //5
    @Autowired 
    MockHttpServletRequest request; //6

    @Before //7
    public void setup() {
        mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build()                            
        }
    
    @Test
    public void testNormalController() throws Exception{
        mockMvc.perform(get("/normal")) //8
        .andExpect(status().isOk())//9
        .andExpect(view().name("page"))//10
        .andExpect(forwardedUrl("/WEB-INF/classes/views/page.jsp"))
        .andExpect(model().attribute("msg", demoService.saySomething()));
    }
    
    @Test
    public void testRestController() throws Exception{
        mockMvc.perform(get("/testRest")) //13
        .andExpect(status().isOk())
        .andExpect(content().contentType("text/plain;charset=UTF-8"))
        .andExpect(content().string(demoService.saySomething()));
    }
}

fluent的api也蛮好用的.


Spring Boot的一些

最近把新公司的代码上了Spring Boot全家桶.

redis/mongo/activti/actuator/aop/test之类的,择日整理出来.

后续可能会接入Spring Integration跟Spring Cloud.

to be continue.