Spring 实战(第四版)笔记

spirng介绍

为了简化java开发,spring使用4种关键策略:

  • 基于POJO的轻量级和最小侵入性编程;
  • 通过依赖注入和面向接口实现松耦合;
  • 基于切面和惯例进行声明式编程;
  • 通过切面和模板减少样板式代码。

依赖注入DI

组装bean

  • 使用注解@Component,需要开启注解扫描
  • 还需要使用@Named("serverName")
  • 在@ComponentScan中可以设计扫描的基础包
  • @Autowired自动注入的注解,可以放在类构造器上,也可以放在属性的setter方法上(其实是任何方法上);设置required属性为false,如果没有匹配的bean,将会标记为未装配状态;同时可以用java依赖注入规范中的@Inject注解;
  • @Bean注解可以返回方法方法的bean,默认bean的id为方法名,类上加@Configuration注解,等同于元素
  • XML中通过元素声明一个bean

多环境的配置profile

  • 可以使用@Profile注解声明类属于哪个profile
  • 使用spring.profiles.active属性激活需要使用的环境profile
  • 使用spring.profiles.default属性设置默认的环境
  • 集成测试的时候使用@ActiveProfiles注解

条件生成bean

  • @Conditional 注解,配置实现了Condition接口的class类,可以根据条件是否生成bean;

@Autowired自动装配歧义

  • 产生原因:比如一个自动注入的接口,有多个实现类可以选择的时候;
  • 解决方案:(1)使用@Primary注解标注首选的bean;或者xml中设置元素的primary的属性为true;(2)限定自动装配的bean,使用@Qualifier限定装配bean的ID;

bean的作用域

  • 默认情况下spring应用上下文所有的bean都是以单例的形式创建的;
  • Spring定义的作用于:
  1. 单例(Singleton):整个应用只创建一个bean的实例;
  2. 原型(Prototype):每次注入或者通过spring的上下文获取都会创建一个新的bean实例;
  3. 绘画(Session):在web应用中,为每个会话创建一个bean实例;
  4. 请求(Request):在web应用中,为每个请求创建一个bean实例;

注入外部值

  • 使用@PropertySource注解和Environment
  • 使用占位符${}
  • 使用spring表达式语言(SpEL)进行装配:
  1. SPEL表达式需要放在#{}中
  2. T()运算符可以得到class对象

面向切面的Spring(AOP)

切面的五种类型通知

  1. 前置通知(Before):在目标方法被调用之前通知功能;
  2. 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;
  3. 返回通知(After-returning):在目标方法成功执行之后调用通知;
  4. 异常通知(After-throwing):在目标方法抛出异常后调用通知;
  5. 环绕通知(Around):在方法的调用前和调用后都执行自定义的行为;
  • Spring运行时通知对象:Spring在运行期把切面织入到Spring管理的bean中;
  • Spring的AOP基于动态代理实现,只支持方法级别的连接点;
  • Spring参考AspectJ方法实现AOP,主要方法execution(* 包命名空间.方法名(..)):
  1. 括号中的第一个参数*,代表方法的返回值;
  2. 可以使用or、and、&&、||、!等连接词
  • 通过注解可以为代理的类添加新方法;通过@DeclareParents注解或者XML元素声明以透明的方式为被通知的对象映入额外的接口;

SpringMVC

  • SpringMvc的入口是DispatchServlet,由这个前端控制器将请求委托给应用程序的其他组件实际执行处理(SpringMvc的控制器controller);
  • 使用MockMvc测试Controller控制器的返回试图;
  • 使用Java Validation Api(JSR-303)校验输入的值,比如:Hibernate Validator;javax.validation.constraints包中的注解;
  • InternalResourceViewResolver类将视图名称解析成jsp文件;

SpringMVC的高级技术

  • 配置multipart解析器处理文件上传;
  • 使用@ResponseStatus注解自定义状态码和响应;

添加控制器通知:

  • 如果需要统一处理异常需要在多个控制器内加上@ExceptionHandler注解,或者继承一个基类:
  1. 除了基类的实现方式还可以用@ControllerAdvice注解实现控制器通知;
  2. 该注解标注的类包含一个或者多个如下类型的方法:@ExceptionHandler、@InitBinder、@ModelAttribute;
  3. @ControllerAdvice注解本身已经使用了@Component,因此@ControllerAdvice注解所标注的类将会自动被组件扫描获取到,就像带有@Component注解的类一样;

跨重定向请求传递数据

  • 通过URL模板进行重定向:model中添加的参数会显示在{}的占位符中,或者占位符中未有的参数,会自动添加作为url的请求参数;
  • 使用falsh属性:使用RedirectAttributes提供的addFlashAttributes()方法添加重定向后需要获取的对象;相比于添加到session中,再清除的好处是不需要管理对象;

Spring Web Flow

  • 将页面组织成特定的工作流程跳转;

Spring Security

  • 过滤器Filter,是Servlet的一种加强版,对用户请求的预处理;
  • 拦截器Interceptor,是Aop的实现策略,用于在方法被访问之前进行拦截,然后在之前或者之后(5种方式)加入某些操作;
  • Filter和Interceptor的区别
  1. Filter是基于函数回调的,而Interceptor则是基于Java反射的。
  2. Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
  3. Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
  4. Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
  5. 在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。
  • Filter和Interceptor的执行顺序
  1. 过滤前-拦截前-action执行-拦截后-过滤后
  • Spring Security使用ServletFilter提供各种安全性功能;

Spring中的JDBC

配置数据源

  • 通过JDBC驱动程序定义的数据源;
  • 通过JNDI查找的数据源;
  • 连接池的数据源;

Spring Boot

  • Spring Boot Starter,将依赖分组进行整合;
  • 自动配置:Spring Boot利用Spring4对条件化配置的支持,合理地推测用用所在的bean,并自动装配他们;
  • 命令行接口:Spring Boot的CLI发挥了Groovy编程语言的优势,结合自动配置进一步简化Spring应用的开发;
  • Actuator:它为Spring Boot应用添加一定的管理特性;

你可能感兴趣的:(Spring 实战(第四版)笔记)