Spring的两个核心特性是依赖注入(dependency injection,DI)和面向切面(aspect-oriented programming,AOP)。
其中Spring为了减低java的开发复杂性采用了以下4种关键策略:
1.基于POJO的轻量级和最小侵入性编程;
2.通过依赖注入和面向接口实现松耦合;
3.基于切面和惯例进行声明式编程;
4.通过切面和模板减少样板式代码;
1.1Spring装配方式(简单说两种方式)
方式一:xml装配方式
方式二:java装配方式
1.2面向切面
面向切面编程(aspect oriented programming,AOP)允许你把遍布应用各处的功能分离出来形成可重用的组件。声明切面:此时有这么一个类我要对其进行切面
xml配置如下
这里使用了Spring的aop配置命名空间吧Minstrel bean声明成一个切面。首先将Minstrel声明为一个bean,然后在<aop:aspect>元素中引用该Bean。为了进一步定义切面,声明在embarkOnQuest()方法执行前调用Minstrel的singBeforeQuest()方法。这种方式叫做前置通知(before advice).同时声明在embarkOnQuest()方法执行后调用singAfterQuest方法。这种方式被称为后置通知(after advice)。
这两种方式中,pointcut-ref属性都引用了名为embank的切入点,这个切入点是在<pointcut>元素中定义的,并配置expression属性来选择所选应用的通知,表达式的语法采用AspectJ的切入点表达式语言。
2.1Spring容器
1.应用上下文
Spring容器是Spring框架的核心。Spring容器使用DI管理构成应用的组件,它会创建相互协作的组件之间的关联。Spring容器自带多个实现,可以归为两种类型。bean工厂(由org.springframework.beans.factory.eanFactory接口定义)是最简单的容器,提供基本的DI支持。应用上下文(由org.springframework.context.ApplicationContext接口定义)基于BeanFactory构建,并提供应用框架级别的服务,如从属性文件解析文本信息以及发布应用事件给感兴趣的事件监听者。常用的是应用上下文的使用。
Spring自带多种类型的应用上下文,最常用到的有:
1.AnnotationConfigApplicationContext:从一个或多个基于Java的配置类中加载Spring应用上下文。
2.AnnotationConfigWebApplicationContext:从一个或多个基于Java的配置类中加载Spring Web应用上下文。
3.ClassPathXmlApplicationContext:从类路径下的一个或多个XML配置文件中加载上下文定义,把应用上下文的定义文件作为类资源。
4.FileSystemXmlApplicationcontext:从文件系统下的一个或多个XML配置文件中加载上下文定义。
5.XmlWebApplicationContext:从Web应用下的一个或多个XML配置文件中加载上下文定义。
其中FileSystemXmlapplicationcontext与ClassPathXmlApplicationContext的区别在于FileSystemXmlapplicationcontext在指定的文件路径下查找文件,ClassPathXmlApplicationContext是在类路径下查找文件。
从java配置中加载应用上下文可以使用AnnotationConfigApplicationContext:
2.bean的生命周期
在传统的Java应用中,bean的生命周期很简单。使用Java关键字new进行bean实例化,然后该bean就可以使用了。一旦该bean不再被使用,则由Java自动进行垃圾回收
如图是Spring容器中的bean装载到Spring应用上下文中的典型生命周期过程。
1.Spring对bean进行实例化;
2.Spring将值和bean的引用注入到bean对应的属性中;
3.如果bean实现了BeanNameAware接口,Spring将Bean的ID传递给setBean-Name()方法;
4.如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入;
5.如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将Bean所在的应用上下文的引用传入进来;
6.如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessBeforeInitialization()方法 ;(前置处理)
7.如果bean实现了InitializingBean接口,Spring将调用它们的after-PropertiesSet()方法 。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用;
8.如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessAfterInitialization()方法 ;(后置处理)
9.此时,bean已经准备就绪可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁;
10.如果Bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用。
3.Spring模块
原文采自:《Spring实战》