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良好的集成在一起。
这七大模块可以单独使用,不需要其他模块的支持!
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 的作用域都是来自org.springframework.beans.factory.config.Scope 接口的定义
作用域有一下几种:
作用域 | 描述 |
---|---|
singleton |
在每个Spring IoC容器中一个bean定义对应一个对象实例。(默认) |
prototype |
一个bean定义对应多个对象实例。 |
request |
在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的Spring |
session |
在一个HTTP |
global session |
在一个全局的HTTP |
还有自定义作用域(不建议!) 须实现org.springframework.beans.factory.config.Scope
注意:假如你在编写一个标准的基于Servlet的web应用,并且定义了一个或多个具有global session
作用域的bean,系统会使用标准的HTTP Session
作用域,并且不会引起任何错误。
能够在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/>
不能和作用域为singleton
或prototype
的bean一起使用。为singleton bean创建一个scoped proxy将抛出BeanCreationException
异常。
初始——>销毁
Spring提供了几个标志接口(marker interface),这些接口用来改变容器中bean的行为;它们包括InitializingBean
和DisposableBean
。实现这两个接口的bean在初始化和析构时容器会调用前者的afterPropertiesSet()
方法,以及后者的destroy()
方法。
或者如果你需要自定义特性或者生命周期行为,你可以实现自己的BeanPostProcessor
,因为Spring在内部是使用BeanPostProcessor
实现来处理它能找到的任何标志接口并调用相应的方法。
1.实现org.springframework.beans.factory.InitializingBean
接口允许容器在设置好bean的所有必要属性后,执行初始化事宜。实现org.springframework.beans.factory.DisposableBean
接口的bean允许在容器销毁该bean的时候获得一次回调。
2.通常,要避免使用InitializingBean
用DisposableBean
接口(而且不鼓励使用该接口,因为这样会将代码和Spring耦合起来)可以在Bean定义中指定一个普通的方法,即在XML配置文件中通过指定init-method
或destroy-method
属性来完成。
注意:还可以用顶层<beans/>
元素'default-init-method'
属性的使用。该属性的出现意味着Spring IoC容器会把bean上名为'default-init-method'
属性里面的方法识别为初始化方法回调,并且当bean被创建和装配的时候,如果bean类具有这样的方法,它将会在适当的时候被调用。 如果实际的回调方法与默认的命名约定不同,那么可以通过在<bean/>
元素上使用'init-method'
和'destroy-method'
属性指定方法名来覆盖缺省设置。
如果你正在一个非web应用的环境下使用Spring的IoC容器,例如在桌面富客户端环境下,你想让容器优雅的关闭,并调用singleton bean上的相应析构回调方法,你需要在JVM里注册一个“关闭钩子”(shutdown hook)。这一点非常容易做到,并且将会确保你的Spring IoC容器被恰当关闭,以及所有由单例持有的资源都会被释放(当然,为你的单例配置销毁回调,并正确实现销毁回调方法,依然是你的工作)。
为了注册“关闭钩子”,你只需要简单地调用在AbstractApplicationContext
实现中的registerShutdownHook()
方法即可。
- AbstractApplicationContext ctx
- = new ClassPathXmlApplicationContext(new String []{"beans.xml"});
- // add a shutdown hook for the above context...
- ctx.registerShutdownHook();