概览
最低需JDK8+,支持JDK11 LTS。建议使用最低 Java SE 8 update 60。
Spring在不同语境中可以指代Spring Framework,或基于Spring Framework构建的整个Spring生态。
Spring Framework 5的jar包附带了“自动模块名称”的mainfest,支持部署到JDK9的模块化路径中(”jigsaw”)。
核心功能
org.springframework.beans
和org.springframework.context
包中的内容是Ioc容器的基础。BeanFactory接口提供了配置框架和基本功能。ApplicationContext是BeanFactory的子接口并且是其完成超集,提供了应用层级的上下文比如WebApplicationContext。
org.springframework.context.ApplicationContext
接口代表了Spring IoC容器,负责实例化,配置和组装Bean。容器通过读取配置元数据来获取有关要实例化,配置和组装哪些对象的指令。配置元数据以XML,Java注解或Java代码表示。它使您能够表达组成应用程序的对象以及这些对象之间的丰富相互依赖关系。
Spring提供了ApplicationContext接口的几种实现。在单体应用程序中,通常创建ClassPathXmlApplicationContext或FileSystemXmlApplicationContext的实例。在Web应用中通常在web.xml中配置ContextLoaderListener。
在容器当中,Bean被定义为BeanDefinition对象,并包含一些原信息。
Bean可以有一个id属性和多个name属性。可以有别名。可以创建内部类。可是使用工厂方法以及工厂方法对象。
依赖注入主要有构造方法注入和set方法注入。可以使用变量名、变量类型、方法参数位置等方式映射。
IOC容器检测到环形依赖时会抛出异常,可以不使用构造方法注入而是使用set方法注入。原文
Bean会被尽量晚的解决依赖问题,因此在引用Bean时才会检查出一些异常。因此对于单例Bean会预初始化以便提前发现问题,也可以被设置为延迟初始化。
依赖注入及Bean关联关系配置方法。
集合类属性可以使用合并操作。XML配置支持更便捷的配置方式。
也可以跨多个变量层级进行配置。
支持使用depends-on
声明依赖关系。
我们也可以使用自动装配来简化配置Bean之间的依赖注入。 但其也有一些限制。 也可以配置一些Bean不使用自动装配。 也会有不同生命周期的Bean之间相互依赖的情况,比如单例Bean依赖Prototype的情况, 需要特殊处理这种关系的注入。 比如使用代理方式。
容器创建Bean时实际创建的是BeanDefinition,此后会根据它创建不同声明周期的对象实例。 Bean的声明周期主要有 singleton 、prototype及其他。 Bean的声明周期可以自由定制。
不仅可以定制Bean的声明周期,还可以定制Bean的行为。比如注册生命周期回调、给Bean注入ApplicationContext或给Bean注入在容器中的名字、以及其他的Bean感知接口。
容器可以扩展功能。 比如在容器创建Bean实例前后对其进行一些自定义操作。 或者对Bean的元数据进行操作。 或者重写Bean初始化逻辑。
Spring支持基于注解的Bean配置和XML的Bean配置,XML配置会覆盖注解的行为。 包括但不限于 @Required、 @Autowired、 @Primary、 @Qualifier。 还可以对泛型进行注入。 甚至可以不使用@Qualifier而自定义一个注解。 也支持JDK注解@Resource。 @Value用来注入外部配置值而不是Bean。 @PostConstruct和@PreDestroy在JDK6-8中存在,在JDK11中被删除。
除了使用XML来管理Bean,还可以使用组件扫描来管理Bean。 同时也可以配置扫描时的过滤选项。 使用注解也可以定义Bean的元数据。 或者指定Bean的Name。 使用注解设置Bean的生命周期。 设置Qualifier元数据。 大型应用为了加快组件扫描,可以使用组件索引。 除了使用Spring提供的组件扫描依赖注入注解,还可以使用JSR-330标准依赖注入注解。 当然它们相比Spring提供的注解会有一些限制。
使用注解来配置容器, 可以初始化AnnotationConfigApplicationContext容器。AnnotationConfigApplicationContext也可以在Web应用中使用。 使用@Bean注解来声明一个Bean, 配置Bean的生命周期回调, 使用@Scope来声明Bean的生命周期。或者重新命名Bean在容器中的名字。
如果使用@Configuration来包裹@Bean声明,则Bean之间的依赖关系会更加方便。 对于单例模式的Bean,即使在@Configuration下被多次调用,也只会生成一次。 使用@Import注解可以传递引用多个@Configuration类。 设置Bean在一定条件下才需要被初始化,对于不同环境创建不同的Bean这里有更详细的介绍和使用。
使用Java代码和注解初始化容器可以和使用XML的方法结合使用。
不用的环境可以有不用的配置源。
可以通过在@Configuration类上添加@EnableLoadTimeWeaving来把Aspectj的编译器织入换成类加载期织入,这里有个使用场景。
ApplicationContext接口继承了解决i18n问题的MessageSource、 标准或者自定义的事件通知&处理、 访问资源文件、 在Web项目中加载容器、 将ApplicationContext部署到一个RAR文件。
BeanFactory及诸多接口是Spring与第三方结合的切入点。 BeanFactory与ApplicationContext之间的区别。
Spring的资源管理, Spring中所有形式的资源都继承自Resource接口, Spring内部有多种形式的资源类型: UrlResource、 ClassPathResource、 FileSystemResource、 ServletContextResource、 InputStreamResource、 ByteArrayResource。 通过使用ResourceLoader来加载资源。 任何Bean都可以通过实现ResourceLoaderAware来注入ResourceLoader,如果一个类持有Resource字段,可以使用资源路径来注入资源。 有多种方法使用资源路径来初始化一个容器,资源路径有多种通配符表示。 注意FileSystemApplicationContext会认为所有FileSystemResource为相对路径,所以注意使用方式来避免意外。
Spring提供了验证器可以用来验证数据,并处理验证失败结果。
BeanWrapper丰富了许多操作Bean属性的方法。 以及继承PropertyEditorSupport转换String到Bean实例的方法, 也可以继承PropertyEditorSupport来自定义String到类的转换方法。 除了这种方法,还可以使用Spring提供的Converter SPI功能。 同时Spring也提供了支持国际化和互转的Formatter SPI功能。 配置一个全局的Formatter。 Spring提供了对Java Bean验证API的支持。
Spring特有的SpEL表达式, 及其简单实用。 可以对其解析行为进行配置。 Spring提供两种SpEL解析Context实现。 可以将SpEL表达式与基于XML或基于注释的配置元数据一起使用,以定义BeanDefinition实例。 SpEL表达式和Java语言一样也有自己的语法。
Spring AOP实现面向切面编程, 切面编程的一些概念。Spring AOP区别于切面框架的功能和目标。Spring AOP使用代理模式实现切面编程,默认使用JDK动态代理,可以使用CGLIB代理。Spring AOP支持部分@AspectJ语法,同时也支持使用Spring特有的XML风格声明切面。至于是选择Spring AOP还是AspectJ、是使用@AspectJ风格声明Spring AOP还是XML风格,因素包括应用程序需求,开发工具和团队对AOP的熟悉程度。甚至可以混合使用@AspectJ风格和XML风格。Spring AOP的代理机制。当然Spring也支持使用纯编码的方式组装切面。虽然Spring AOP只支持部分@AspectJ注解,并且和AspectJ实现完全不一样,但是也可以在Spring框架中使用AspectJ。
上面介绍了Spring AOP和AspectJ之间的关系。切面编程中的一些概念在Spring AOP中都有相应的接口及实现。
比如:Pointcut、
Advice、
以及Spring AOP特有的Advisor。
使用ProxyFactoryBean创建AOP代理。
选择代理声明方式。
使用ProxyFactory通过代码创建AOP代理。
创建了代理对象之后使用Advised对其进行修改。除了使用ProxyFactoryBean或ProxyFactory,
还可以使用自动代理Bean。
可以使用TargetSource实现HotSwap代理对象、Pooling代理对象、Prototype代理对象、ThreadLocal代理对象。
Spring在org.springframework.aop.framework.adapter
包中提供了SPI来客制化新的Advice类型。
Spring在框架层面提供对空指针安全的支持。
Spring中的Data Buffer和Codecs。
Spring XML Schemas扩展阅读,包含util Schema、aop Schema、context Schema、beans Schema。 创作Schema。
持久化数据访问
Spring中的事务管理,传统上,Java EE开发人员在事务管理中有两种选择:全局或本地事务,这两者都有很大的局限性。Spring框架的事务管理支持如何解决全局和本地事务模型的局限性。理解Spring如何对事务进行抽象。多种级别接口的事务管理和资源使用。使用声明式的事务管理,和编码式的事务管理。理解声明式事务管理,声明式事务管理的例子,声明式事务回滚方式,绑定不同的事务,<tx:advice/>配置,使用@Transactional注解来声明事务,事务的传播。编码式事务实现有:TransactionTemplate,TransactionOperator,TransactionManager。对于声明式和编码式事务方式的选择。围绕事务相关的事件通知。对与不同WebServer的集成。
Spring对Data Access Object (DAO)的支持,Spring提供了从特定于技术的异常(例如SQLException)到其自己的异常类层次结构的便捷转换。用于配置DAO或Repository类的注解。
使用JDBC访问数据库。在JdbcTemplate、NamedParameterJdbcTemplate、SimpleJdbcInsert和SimpleJdbcCall、RDBMS当中选择一种数据库访问方式。spring-jdbc包层次结构。8种数据库连接管理方式。使用jdbc进行批量操作。使用SimpleJdbc简化jdbc操作。将jdbc操作建模为Java对象。jdbc对嵌入式数据库的支持。org.springframework.jdbc.datasource.init
包提供了初始化现有DataSource的支持。使用对象关系映射Object Relational Mapping (ORM)。tx XML Schema,jdbc XML Schema。
Spring Web MVC
Spring MVC的前端控制器DispatcherServlet的上下文层次。在Servlet 3.0+环境中,可以选择以编程方式配置Servlet容器。DispatcherServlet处理一个请求的整个流程。对于请求处理过程进行拦截,MVC中的异常处理,视图解析,本地化处理,主题样式,支持文件上传的分组请求,日志。
使用注解声明Controller,请求映射,请求处理,ModelAttribute,DataBinder,请求异常处理。请求处理函数式编程,对URI链接进行处理。请求异步处理,跨域请求,Web安全,Http缓存。Spring支持多种视图模板处理技术。MVC各种配置。需要Servlet 4容器支持HTTP/2,并且Spring Framework 5与Servlet API 4兼容。
REST客户端。
Web MVC测试。
Spring可以与第三方Web框架继承。