整体介绍的比较简单全面 ,清晰易读;大部分地方都增加了代码辅助理解;
知识点比较全,但没什么深度都浮于表面止于应用;
整体来说,是一本入门级的图书。对spring比较了解的话,可以很快看完!然后,还记不住太多东西。
(想了解可以看看,想深入不推荐读。)
主要讲了Spring 简史,概览,生态系统,工具第使用。常用的配置,以注解为主,是
简单讲了一下SpringMVC的基础,此处略。
Spring Boot 的项目一般都会有 *Application 的入口类,入口类中会有 main 方法,这是一个标准的Java应用程序的入口方法。
@SpringBootApplication 注解是 Spring Boot 的核心注解,它其实是一个组合注解:
该注解主要组合了以下注解:
@SpringBootConfiguration:这是 Spring Boot 项目的配置注解,这也是一个组合注解:
@EnableAutoConfiguration:启用自动配置,该注解会使 Spring Boot 根据项目中依赖的 jar 包自动配置项目的配置项。例如:我们添加了 spring-boot-starter-web 的依赖,项目中也就会引入 SpringMVC 的依赖,Spring Boot 就会自动配置 tomcat 和 SpringMVC。
@ComponentScan:默认扫描 @SpringBootApplication 所在类的同级目录以及它的子目录。
Spring Boot 项目使用一个全局的配置文件 application.properties 或者是 application.yml,在 resources 目录下或者类路径下的 /config 下,一般我们放到 resources 下。
我们知道 Spring Boot 会根据在 pom.xml 中依赖的 jar 包进行自动配置,如果要对这些 jar 包对应的框架进行配置可以在全局配置文件中进行配置。
Spring Boot 为我们提供了简化企业级开发绝大多数场景的 starter pom,只要使用了应用场景所需要的 starter pom,相关的技术配置将会消除,就可以得到 Spring Boot 为我们提供的自动配置的 Bean。
官方提供的 starter pom 如下表所示:
名称 |
描述 |
spring-boot-starter |
Spring Boot核心 starter,包含自动配置、日志、yaml 配置文件的支持 |
spring-boot-starter-actuator |
准生产特性,用来监控和管理应用 |
spring-boot-starter-remote-shell |
提供基于 ssh 协议的监控和管理 |
spring-boot-starter-amqp |
使用 spring-rabbit 来支持 AMQP |
spring-boot-starter-aop |
使用 spring-aop 和 AspectJ 支持面向切面编程 |
spring-boot-starter-batch |
对 Spring Batch 的支持 |
spring-boot-starter-cache |
对 Spring Cache 抽象的支持 |
spring-boot-starter-cloud-connectors |
对云平台(Cloud Foundry、Heroku)提供的服务提供简化的连接方式 |
spring-boot-starter-data-elasticsearch |
通过 spring-data-elasticsearch 对 Elasticsearch 支持 |
spring-boot-starter-data-gemfire |
通过 spring-data-gemfire 对分布式存储 GemFire 的支持 |
spring-boot-starter-data-jpa |
对 JPA 的支持,包含 spring-data-jpa、spring-orm 和 Hibernate |
spring-boot-starter-data-mongodb |
通过 spring-data-mongodb,对 MongoDB 进行支持 |
spring-boot-starter-data-rest |
通过 spring-data-rest-webmvc 将 Spring Data repository 暴露为 REST 形式的服务 |
spring-boot-starter-data-solr |
通过 spring-data-solr 对 Apache Solr 数据检索平台的支持 |
spring-boot-starter-freemarker |
对 FreeMarker 模板引擎的支持 |
spring-boot-starter-groovy-templates |
对 Groovy 模板引擎的支持 |
spring-boot-starter-hateoas |
通过 spring-hateoas 对基于 HATEOAS 的 REST 形式的网络服务的支持 |
spring-boot-starter-hornetq |
通过 HornetQ 对 JMS 的支持 |
spring-boot-starter-integration |
对系统集成框架 spring-integration 的支持 |
spring-boot-starter-jdbc |
对 JDBC 数据库的支持 |
spring-boot-starter-jersey |
对 Jersey REST 形式的网络服务的支持 |
spring-boot-starter-jta-atomikos |
通过 Atomikos 对分布式事务的支持 |
spring-boot-starter-jta-bitronix |
通过 Bitronix 对分布式事务的支持 |
spring-boot-starter-mail |
对 javax.mail 的支持 |
spring-boot-starter-mobile |
对 spring-mobile 的支持 |
spring-boot-starter-mustache |
对 Mustache 模板引擎的支持 |
spring-boot-starter-redis |
对键值对内存数据库 Redis 的支持,包含 spring-redis |
spring-boot-starter-security |
对 spring-security 的支持 |
spring-boot-starter-social-facebook |
通过 spring-social-facebook 对 Facebook 的支持 |
spring-boot-starter-social-linkedin |
通过 spring-social-linkedin 对 Linkedin 的支持 |
spring-boot-starter-social-twitter |
通过 spring-social-twitter 对 Twitter 的支持 |
spring-boot-starter-test |
对常用的测试框架 JUnit、Hamcrest 和 Mockito 的支持,包含 spring-test 模块 |
spring-boot-starter-thymeleaf |
对 Thymeleaf 模板引擎的支持,包含于 Spring 整合的配置 |
spring-boot-starter-velocity |
对 Velocity 模板引擎的支持 |
spring-boot-starter-web |
对 Web 下面开发的支持,包含 Tomcat 和 spring-webmvc |
spring-boot-starter-Tomcat |
Spring Boot 默认的Servlet 容器 Tomcat |
spring-boot-starter-Jetty |
使用 Jetty 作为 Servlet 容器替换 Tomcat |
spring-boot-starter-undertow |
使用 Undertow 作为 Servlet 容器替换 Tomcat |
spring-boot-starter-logging |
Spring Boot 默认的日志框架 Logback |
spring-boot-starter-log4j |
支持使用 Log4J 日志框架 |
spring-boot-starter-websocket |
对 WebSocket 开发的支持 |
spring-boot-starter-ws |
对 Spring Web Services 的支持 |
Spring Boot 提倡零配置,即无 XML 配置,但是在实际项目中,可能有一些特殊要求你必须使用 XML 配置,这是可以通过 Spring 提供的 @ImportResouce 来加载 XML 配置。例如:
代码块
Plant Text
@ImportResouce({"classpath:some-context.xml", "classpath:another-context.xml"})
条件注解只有满足特定条件才会实例化。例如:
代码块
Plant Text
......@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurerAdapter.class }) ......public class WebMvcAutoConfiguration { ......}
以上代码说明只有当 Servlet、DispatcherServlet、WebMvcConfigurerAdapter 同时存在才会实例化 WebMvcAutoConfiguration。
Spring Boot 提供了以下条件注解:
条件注解 |
说明 |
@ConditionalOnBean |
当容器里有指定的 Bean 的条件下 |
@ConditionalOnClass |
当类路径下有指定的类的条件下 |
@ConditionalOnExpression |
基于 SpEL 表达式作为判断条件 |
@ConditionalOnJava |
基于 JVM 版本作为判断条件 |
@ConditionalOnJndi |
在 JNDI 存在的条件下查找指定的位置 |
@ConditionalOnMissingBean |
当容器里没有指定 Bean 的情况下 |
@ConditionalOnMissingClass |
当类路径下没有指定的类的条件下 |
@ConditionalOnNotWebApplication |
当前项目不是 Web 项目的条件下 |
@ConditionalOnProperty |
指定的属性是否有指定的值 |
@ConditionalOnResource |
类路径是否有指定的值 |
@ConditionalOnSingleCandidate |
当指定 Bean 在容器中只有一个,或者虽然有多个但是指定首选的 Bean |
@ConditionalOnWebApplication |
当前项目是 Web 项目的条件下 |
介绍了一些与前端相关的东西,都是浮于表面,意义不大。
方法一:
自定义消息转化器,只需要在 @Configuration 的类中添加消息转化器的 @Bean 加入到 Spring 容器,就会被 Spring Boot 自动加入到容器中。例如:
代码块
Plant Text
@Bean public StringHttpMessageConverter stringHttpMessageConverter(){
StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
return converter;
}
方法二:
通过继承 WebMvcConfigurerAdapter 然后重写父类中的 configureMessageConverters 方法进行扩展。例如:
代码块
Plant Text
@Configurationpublic class SrpingMVCConfig extends WebMvcConfigurerAdapter{
// 自定义消息转化器的第二种方法
@Override
public void configureMessageConverters(List> converters) {
StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
converters.add(converter);
}
}
通过继承 WebMvcConfigurerAdapter 然后重写父类中的方法进行扩展。例如:
代码块
Plant Text
@Configuration public class SrpingMVCConfig extends WebMvcConfigurerAdapter{
// 自定义拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
HandlerInterceptor handlerInterceptor = new HandlerInterceptor() {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("自定义拦截器............");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception { }
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) throws Exception {
}
};
registry.addInterceptor(handlerInterceptor).addPathPatterns("/**");
}
}
自定义Filter,只需要在 @Configuration 的类中添加消息转化器的 @Bean 加入到 Spring 容器,就会被 Spring Boot 自动加入到容器中。例如:
代码块
Plant Text
@Bean public FilterRegistrationBean characterEncodingFilter() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
FilterRegistrationBean registration = new FilterRegistrationBean(filter);
registration.addUrlPatterns("/*");
registration.setName("SetCharacterEncoding");
MapinitParameters = new HashMap<>();
initParameters.put("encoding", "UTF-8");
initParameters.put("forceEncoding", "true");
registration.setInitParameters(initParameters);
registration.setOrder(CHARACTER_ENCODING_FILTER_ORDER);
return registration;
}
自定义Servlet,只需要在 @Configuration 的类中添加消息转化器的 @Bean 加入到 Spring 容器,就会被 Spring Boot 自动加入到容器中。例如:
代码块
Plant Text
@Configuration public class ServletConfiguration {
@Bean
@ConditionalOnMissingBean
public ServletRegistrationBean sitemeshFreemarker() {
FreemarkerDecoratorServlet servlet = new FreemarkerDecoratorServlet();
ServletRegistrationBean registration = new ServletRegistrationBean();
registration.setServlet(servlet);
registration.setName("sitemesh-freemarker");
registration.addUrlMappings("*.ftl");
MapinitParameters = new HashMap<>();
initParameters.put("TemplatePath", "/");
initParameters.put("default_encoding", "UTF-8");
registration.setInitParameters(initParameters);
registration.setLoadOnStartup(1);
return registration;
}
}
自定义Listener,只需要在 @Configuration 的类中添加消息转化器的 @Bean 加入到 Spring 容器,就会被 Spring Boot 自动加入到容器中。例如:
代码块
Plant Text
@Configuration public class ListenerConfiguration {
@Bean
@ConditionalOnMissingBean
public ServletListenerRegistrationBeanjmonitorContextListener() {
ContextListener listener = new ContextListener();
return new ServletListenerRegistrationBean<>(listener);
}
@Bean
@ConditionalOnMissingBean
public ServletListenerRegistrationBeanwebContextListener() {
WebContextListener listener = new WebContextListener();
return new ServletListenerRegistrationBean<>(listener);
}
}
在 Spring Boot 中推荐使用 @Transactional 注解来申明事务。
首先需要导入依赖:
代码块
Plant Text
org.springframework.boot
spring-boot-starter-jdbc
当引入 jdbc 依赖之后,Spring Boot 会自动默认分别注入 DataSourceTransactionManager 或 JpaTransactionManager,所以我们不需要任何额外配置就可以用 @Transactional 注解进行事务的使用。
@Transactional 不仅可以注解在方法上,也可以注解在类上。当注解在类上的时候意味着此类的所有 public 方法都是开启事务的。如果类级别和方法级别同时使用了 @Transactional 注解,则使用在类级别的注解会重载方法级别的注解。