Spring 总结

Spring结构:

Spring总结_Spring

Spring 7大组成模块:

 1:Spring core:提供了Spring 的核心功能,BeanFactory是Spring核心容器的主要组件,它通过Ioc把程序的配置和依赖性与实际的代码分开,是整个Spring的基础。

 2:Spring context:通过配置文件向Spring提供上下文信息,它构建在BeanFactory之上,另外增加了国际化和资源访问等功能。

 3:Spring dao:提供了一个简单有效的JDBC应用。

 4:Spring aop:提供了面向方面编程的功能。

 5:Spring orm:Spring除了有自己的JDBC以外还提供了对其他ORM框架的支持,如Hibernate,都可以和Spring进行良好的结合。

 6:Spring web:提供了简化的处理多部分请求以及把请求参数绑定到域的任务。

 7:Spring MVC:提供了MVC2模式的实现,也可以和struts良好的集成在一起。

  这七大模块可以单独使用,不需要其他模块的支持!

 

Spring IoC : 

IoC(控制反转):主要作用于依赖注入。

org.springformework.beans 和 org.springformework.context 是Spring Ioc的基础。

ApplicationContext是BeanFactory的扩展。

BeanFactory是IoC的核心接口:负责实例化、定位、配置应用程序中的对象及建立这些对象之间的依赖关系。

 

Spring实例化容器:

1.小应用程序使用

Resource resource=new FileSystemResource("beans.xml");

或 Resource resource=new ClassPathResource("applicationContext.xml");

BeanFactory factory=new XmlBeanFactory(resource);

2.用于测试或者桌面应用程序使用

ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");

Bean bean= (Bean) context.getBean("beanId");

3.在web容器中使用的工厂

WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());

Bean bean= (Bean) context.getBean("beanId");

 

DI(依赖注入):主要有四种。

1.Setter注入

2.构造器注入

3.接口注入

4. 属性注入(注解autowire

 

AutoWire:主要有五种类型

1.no

2.ByName        ——根据属性名字装配

3.ByType        ——根据属性类型装配

4.Constructor   ——根据构造参数装配(更ByType相似)

5.autodetect    ——根据反射机制来决定使用Constructor或ByType

 

ApplicationContext中事件:

1.ContextRefreshedEvent:初始化或刷新时发送事件。如果使用CofigurableApplicationContext接口的refresh()方法:所有bean装载后处理bean被检测和激活,ApplicationContext就绪,刷新在Context关闭时会触发多次。

2.ContextStartedEvent:启动时发送事件;

3.ContextStoppedEvent:停止时发送事件;

4.ContextClosedEvent :关闭时发送事件;

5.RequestHandledEvent:Web事件通知所有bean有一个Http Request请求结束后会发送一个事件(作用在SpringDispartcherServlet的Web应用)

 

 

Spring bean的作用域 :

spring 的作用域都是来自org.springframework.beans.factory.config.Scope  接口的定义

作用域有一下几种:

 

作用域 描述

singleton

在每个Spring IoC容器中一个bean定义对应一个对象实例。(默认)

prototype

一个bean定义对应多个对象实例。

request

在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。

session

在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。

global session

在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于web的Spring ApplicationContext情形下有效。

还有自定义作用域(不建议!) 须实现org.springframework.beans.factory.config.Scope   

注意:假如你在编写一个标准的基于Servlet的web应用,并且定义了一个或多个具有global session作用域的bean,系统会使用标准的HTTP Session作用域,并且不会引起任何错误。

作用域bean与依赖:

能够在HTTP request或者Session(甚至自定义)作用域中定义bean固然很好,但是Spring IoC容器除了管理对象(bean)的实例化,同时还负责协作者(或者叫依赖)的实例化。如果你打算将一个Http request范围的bean注入到另一个bean中,那么需要注入一个AOP代理来替代被注入的作用域bean。也就是说,你需要注入一个代理对象,该对象具有与被代理对象一样的公共接口,而容器则可以足够智能的从相关作用域中(比如一个HTTP request)获取到真实的目标对象,并把方法调用委派给实际的对象。 假如你在编写一个标准的基于Servlet的web应用,并且定义了一个或多个具有global session作用域的bean,系统会使用标准的HTTP Session作用域,并且不会引起任何错误。 <aop:scoped-proxy/>不能和作用域为singletonprototype的bean一起使用。为singleton bean创建一个scoped proxy将抛出BeanCreationException异常。

 

 

 

bean特性:

 

初始——>销毁

Spring提供了几个标志接口(marker interface),这些接口用来改变容器中bean的行为;它们包括InitializingBeanDisposableBean。实现这两个接口的bean在初始化和析构时容器会调用前者的afterPropertiesSet()方法,以及后者的destroy()方法。

或者如果你需要自定义特性或者生命周期行为,你可以实现自己的BeanPostProcessor,因为Spring在内部是使用BeanPostProcessor实现来处理它能找到的任何标志接口并调用相应的方法。

1.实现org.springframework.beans.factory.InitializingBean接口允许容器在设置好bean的所有必要属性后,执行初始化事宜。实现org.springframework.beans.factory.DisposableBean接口的bean允许在容器销毁该bean的时候获得一次回调。

2.通常,要避免使用InitializingBeanDisposableBean接口(而且不鼓励使用该接口,因为这样会将代码和Spring耦合起来)可以在Bean定义中指定一个普通的方法,即在XML配置文件中通过指定init-methoddestroy-method属性来完成。

 

注意:还可以用顶层<beans/>元素'default-init-method'属性的使用。该属性的出现意味着Spring IoC容器会把bean上名为'default-init-method'属性里面的方法识别为初始化方法回调,并且当bean被创建和装配的时候,如果bean类具有这样的方法,它将会在适当的时候被调用。  如果实际的回调方法与默认的命名约定不同,那么可以通过在<bean/>元素上使用'init-method''destroy-method'属性指定方法名来覆盖缺省设置。

 

 

在非web应用中优雅地关闭Spring IoC容器:

 

 

如果你正在一个非web应用的环境下使用Spring的IoC容器,例如在桌面富客户端环境下,你想让容器优雅的关闭,并调用singleton bean上的相应析构回调方法,你需要在JVM里注册一个“关闭钩子”(shutdown hook)。这一点非常容易做到,并且将会确保你的Spring IoC容器被恰当关闭,以及所有由单例持有的资源都会被释放(当然,为你的单例配置销毁回调,并正确实现销毁回调方法,依然是你的工作)。

为了注册“关闭钩子”,你只需要简单地调用在AbstractApplicationContext实现中的registerShutdownHook()方法即可。

 

 

  1. AbstractApplicationContext ctx 
  2.             = new ClassPathXmlApplicationContext(new String []{"beans.xml"}); 
  3.         // add a shutdown hook for the above context...  
  4.         ctx.registerShutdownHook();