Spring-framework简单了解

Spring IoC容器

Spring容器是Spring框架的核心。在Spring中BeanFactory是IoC容器的实际代表者。
提供了两种不同类型的容器:

一、Spring BeanFactory 容器
最简单容器,给依赖注入(DI)提供了支持。
在Spring中,有大量对BeanFactory接口的实现。最常被使用的是XmlBeanFactory类。这个容器从xml文件中读取配置元数据。

二、Spring ApplicationContext 容器
该容器添加了更多的企业特定的功能。包括BeanFactory容器的所有功能。
Application Context 是 BeanFactory 的子接口,也被称为Spring上下文。
最常被使用的ApplicationContext接口实现:

  • FileSystemXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。需要给构造器提供xml文件的完整路径。
  • ClassPathXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。不需要xml文件的完整路径,只需正确配置CLASSPATH环境变量即可,容器会从CLASSPATH中搜索bean配置文件。
  • WebXmlApplicationContext:该容器会在一个web应用程序的范围内加载xml文件中已被定义的bean。

三、Spring Bean 定义
bean是一个被实例化,组装,并通过Spring IoC容器所管理的对象。这些bean是由容器提供的配置元数据创建的。

1.定义Bean的属性

  • class(强制性属性,指定用来创建bean的bean类)
  • name(指定唯一的bean标识符。基于XML配置元数据,可以使用ID/name属性指定)
  • scope(创建的对象的作用域)
  • constructor-arg(注入依赖关系)
  • properties(注入依赖关系)
  • autowiring mode(注入依赖关系)
  • lazy-initialization mode(延迟初始化的bean)
  • initialization 方法(在bean必须的属性被容器设置后,调用的回调方法)
  • destruction 方法(包含该bean的容器被销毁时,使用回调方法)

2.Bean与Spring容器的关系
①读取配置信息(XML、Java类@Configuration、注解@@Autowired)—> Spring容器(Bean定义注册表)
②根据Bean注册表实例化Bean(Bean1、Bean2…)
③将Bean实例 —> Spirng容器(Bean缓存池)
④应用程序使用Bean —> Spring容器(Bean缓存池)

3.Spring配置元数据
有三个重要的方法把配置的元数据提供给spring容器:

  • 基于XML配置文件(Spring2.0以后使用Schema的格式
  • 基于注解的配置(@Autowired)
  • 基于Java的配置(@Configuration)

四、Spring Bean 作用域
在Spring中定义一个bean时,必须声明该bean的作用域。
Spring框架支持以下五个作用域:

  • singleton(Spring IoC 容器仅有一个实例,默认值
  • prototype(从容器中调用Bean时,都返回一个新的实例。对有状态的bean应该使用此作用域)
  • request(每次HTTP请求创建新的Bean,仅适用于WebApplicationContext环境)
  • session(同一个HTTP Session共享一个Bean,仅适用于WebApplicationContext环境)
  • global-session(一般用于Protlet(基于Java的Web组件)应用环境,仅适用于WebApplicationContext环境)

五、Spring Bean 生命周期
Bean的生命周期可以表达为:Bean的定义——Bean的初始化——Bean的使用——Bean的销毁

1.初始化/销毁回调
当一个bean被实例化时,可能需要执行一些初始化使它转为可用状态。同样,当bena不再需要,并且从容器中移除时,可能需要做一些清除工作。
为了定义安装和卸载一个bean,只要声明带有init-method/destroy-method参数的,属性中指定一个方法。
初始化回调:实现InitializingBean 接口指定一个单一的方法afterPropertiesSet()
销毁回调:实现DisposableBean 接口指定一个单一的方法destroy()

2.非Web应用程序环境
如果在非Web应用程序环境中使用 Spring 的 IoC 容器,那么需要在JVM中注册关闭hook。
建议不要使用 InitializingBean 或者 DisposableBean 的回调方法,因为XML配置在命名方法上提供了极大的灵活性。
需要注册一个在AbstractApplicationContext类中声明的关闭hook的registerShutdownHook()方法,AbstractApplicationContext aac= new ClassPathXmlApplicationContext(“Beans.xml”),aac.registerShutdownHook()

3.默认的初始化和销毁方法
如果有太多具有相同名称的初始化或销毁方法的Bean,使用 default-init-methoddefault-destroy-method 属性配置在 beans 上面。

六、Spring Bean 后置处理器
Bean后置处理器是在调用初始化方法前后对Bean进行额外处理。由BeanPostProcessor 接口定义回调方法。
也可以配置多个BeanPostProcessor 接口,通过设置BeanPostProcessor 实现的Ordered 接口提供的order属性来控制执行顺序。
ApplicationContext 会自动检测由BeanPostProcessor 接口的实现定义的bean。
实现BeanPostProcessor 接口重写postProcessBeforeInitialization 和postProcessAfterInitialization 方法,将实现类以bean配置在beans配置文件中,Bean后置处理器在Bean初始化前后执行。

七、Spring Bean 定义继承
bean定义可以包含很多配置信息,子bean的定义继承父定义的配置数据,可以根据需要重写、添加其他值。bean的属性 parent 指定父bean。

1.Bean 定义模板
创建 Bean 定义模板,不需要指定 class 属性,需要指定 abstract 属性为 true。

Spring 依赖注入(控制反转)

Spring 框架的核心功能之一,通过依赖注入的方式来管理Bean之间的依赖关系。
两种依赖注入类型:

一、基于构造函数的依赖注入
Constructor-based dependency injection
当容器调用带有一组参数的类构造函数时,基于构造函数的 DI 就完成了,其中每个参数代表一个对其他类的依赖。
创建当前Bean的配置文件xml,多个参数有不同方法实现依赖注入。使用的constructor-arg元素
①构造函数参数与配置文件xml顺序保持一致
②使用简单类型匹配
最好的传递构造函数参数的方式,使用index属性
对象引用使用ref属性,传递值使用value属性

二、基于设置函数的依赖注入
Setter-based dependency injection
通过在调用无参数的构造函数或无参数的静态工厂方法实例化 bean 之后容器调用 beans 的 setter 方法来实现的。
创建当前Bean的配置文件xml,使用的property元素,多个Setter方法,可以使用p-namespace,在标签上,使用p:xxxx=""或p:xxxx-ref,不需要使用property元素

三、Spring 注入内部 Beans
inner beans是在其他bean的范围内定义的bean。在标签中property元素中,再使用标签

四、Spring 注入集合
传递多个值,Java Collection类型List、Set、Map、Properties
两种情况:

  • 传递集合中直接的值
  • 传递bean的引用作为集合元素

Spring 提供了四种集合配置元素:

  • (value标签传递值;ref标签bean属性)
  • (value标签传递值;ref标签bean属性)
  • (entry标签,key属性作为键、value属性传递值;同标签的value-ref属性)
  • (prop标签传递值,key属性作为键)

Spring Beans 自动装配

一、自动装配模式
使用元素的autowire属性为一个bean定义指定自动装配模式。

  • byName(由属性名自动装配)
  • byType(由属性数据类型自动装配)
  • constructor(类似于 byType,但该类型适用于构造函数参数类型)
  • autodetect(先尝试通过constructor自动装配,如果不执行,则尝试使用byType自动装配)

二、自动装配的局限性

  • 重写的可能性
  • 原始数据类型不能自动装配
  • 自动装配不如显式装配精确

Spring 的 AOP

AOP:面向切面编程,与OOP互为补充,面向切面编程将程序运行过程分解成各个切面。

一、AOP实现
可分为两类:

  • 静态AOP实现:在编译阶段对程序进行修改,实现对目标类的增强(以AspectJ框架为代表)
  • 动态AOP实现:在运行阶段动态生成AOP代理,实现对目标对象的增强(以Spring AOP为代表)

静态AOP实现性能较好(需要添加@AspectJ支持库),动态性能略差

二、AOP基本概念

  • 切面(Aspect):切面用于组织多个Advice,Advice放在切面中定义。
  • 连接点(Joinpoint):程序执行过程中明确的点,如方法的调用,或者异常的抛出。在Spring AOP中,连接点总是方法的调用。
  • 增强处理(Advice):AOP框架在特定的切入点执行的增强处理。
  • 切入点(Pointcut):可以插入增强处理的连接点。简而言之,当某个连接点满足指定要求时,该连接点将被添加增强处理,该连接点也就变成了切入点。

你可能感兴趣的:(Spring框架)