前言:最近项目使用的是Spring Boot框架,开个贴,记录和总结Spring Boot的一些技术内容。
Spring Boot简介
Spring Boot是由Pivotal团队提供的框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。
多年以来,Spring IO平台饱受非议的一点就是大量的XML配置以及复杂的依赖管理。Boot实现了免XML配置的开发体验,开发人员不仅不再需要编写XML,而且在一些场景中甚至不需要编写繁琐的import语句。在对外公开的beta版本刚刚发布之时,Boot描述了如何使用该框架在140个字符内实现可运行的web应用,从而获得了极大的关注度,该样例发表在tweet上。
Spring概述
Spring Boot虽然提高了开发效率,但其本身完全是一个单纯基于Spring的应用。如Spring Boot的自动配置是通过Spring 4.x的@Conditional注解来实现的。因而先概述下Spring和Spring MVC的基础概念(后期会详细整理Srping + Spring MVC + Hibernate的相关技术整理)。
Spring 框架原则:
-
使用 POJO 进行轻量级和最小侵入式开发。
-
通过 依赖注入 和 基于接口 实现松耦合。
-
通过 AOP和默认习惯 进行声明式编程。
-
使用 AOP和模板(template) 减少模式化代码。
部分概念说明:
POJO(Plain Old Java Project,无限制java普通对象):通常指项目中的实体类对象,一般具有一部分getter/setter方法。它不包含业务逻辑,不是JavaBean、EntityBean等,不具有任何特殊角色和不继承或不实现任何其它Java框架的类或接口。
最小侵入式开发:Spring减少了框架API必须臃肿继承实现的恶习。最小侵入式概念的一篇很好的例子
AOP:面向切面编程,相对于OOP(面向对象编程)。通过切面注解(@Aspect、@Component)可设置切点并对调用或请求进行拦截。
AOP原理: spring用代理类包裹切面,把他们放入Spring管理的bean中。它会截取对目标类中方法的调用,让调用者对目标类的调用都先变成调用伪装类,伪装类中就先执行了切面,再把调用转发给真正的目标bean。 一篇AOP讲的很生动的详解
Spring 配置发展
- xml配置:通过xml配置所有bean
- 注解配置:通过@Component等注解来配置业务相关配置,用xml配置应用的基本配置(如数据库)
- java配置:从Spring3.x到现在,提供java配置(其中使用注解@Configuration和@Bean),Spring boot推荐这种配置来进行全局配置(如数据库相关配置)。
Spring MVC概述
MVC与三层架构
MVC:Model(数据模型) + View(视图) + Controller(控制器)
三次架构:表现层(User Interface layer) + 业务逻辑层(Business Logic Layer) + 数据访问层(Data access layer)
区别:三层是基于业务逻辑来分的,而mvc是基于页面来分的。Model、View、Controller位于三层结构中的表现层。
Spring MVC搭建Web应用
Spring MVC提供一个DIspatcherServlet开发Web应用。在Servlet2.5及以下在web.xml中配置<servlet>元素;在Servlet3.0以上可使用无web.xml方式,在Spring MVC里实现WebApplicationInitializer接口便可实现等同于web.xml。
Spring MVC常用注解
几个常用注解用法可以自查,这里不再详细赘述。
@Controller
@RequestMapping
配置了jackjson依赖后,可以直接转换实体类和json、xml
示例: @RequestMapping(produces={"application/json;charset=UTF-8"})
@ResponseBody
@RequestBody
@RestController
静态资源与拦截器
静态资源:如果我们在src/main/resources下建立了静态资源目录需要直接访问,可以通过在配置文件中声明ResourceHandlerRegistry 并通过其方法addResourceHandler来进行配置引用。
@Configuration
public class ResourceConfigure extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/assets/**")
.addResourceLocations("classpath:/templates/assets/");
}
}
拦截器:可以继承实现Filter或HandlerInterceptorAdapter来实现自定义拦截器,Filter通过重写doFilter方法来处理拦截;HandlerInterceptorAdapter通过重写preHandle和postHandle方法来处理拦截。Filter通过在启动类下声明Bean来进行拦截。HandlerInterceptorAdapter在配置文件中声明InterceptorRegistry并通过其方法addInterceptor来注册拦截器。下面给出Filter例子:
public class HttpAuthorFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest=(HttpServletRequest) servletRequest;
HttpServletResponse httpServletResponse= (HttpServletResponse) servletResponse;
String url=httpServletRequest.getRequestURI();
if(url.equals("/")||url.contains("."))
{
filterChain.doFilter(servletRequest,servletResponse);
}
else{
try {
filterChain.doFilter(servletRequest,servletResponse);
} catch (UserErrorException e) {
httpServletResponse.sendRedirect("/error");
}
}
}
@Bean
public FilterRegistrationBean httpAuthorFilter(){
FilterRegistrationBean registration = new FilterRegistrationBean(new HttpAuthorFilter());
registration.addUrlPatterns("/*");
return registration;
}
Spring Boot
接下来,简单了了解了Spring和Spring MVC的简单概念和常用注解等之后,从下篇起,开始详细总结Spring Boot。
网友评论