本人博客已搬家,新地址为:http://yidao620c.github.io/
spring在DefaultSingletonBeanRegistry类提供了一个用于缓存单例Bean的缓存器,它是一个用HashMap实现的缓存器,单实例的Bean以beanName为键保存在这个HashMap中。在初始化BeanFactory的时候,必须为其指定一个日志框架,一般来讲使用Log4j或者lsf4J即可。
如果说BeanFactory是spring的心脏,那么ApplicationContext就是完整的身躯了。ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。在BeanFactory中,很多功能需要编程实现,但是ApplicationContext可以配置实现。
ApplicationContext的主要派生类是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者默认从类路径加载配置文件,后者默认从文件系统装载配置文件。
ApplicationContext跟BeanFactory的很大一个区别是:ApplicationContext在初始化的时候就实例化了所有单例Bean,而BeanFactory的策略是lazy load。
Bean的生命周期详解:
1,通过getBean()调用某一个Bean
2,* 如果容器注册了InstantiationAwareBeanPostProcessor接口,调用InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation()方法
3,根据配置调用Bean构造函数或者是工厂方法实例化Bean
4,* 如果容器注册了InstantiationAwareBeanPostProcessor接口,调用InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation()方法
5,* 如果容器注册了InstantiationAwareBeanPostProcessor接口,在设置每个属性之前会先调用InstantiationAwareBeanPostProcessor的postProcessPropertyValues()方法,这个和下面的6在一个属性设置循环体中
6,根据配置文件设置属性值
7,如果Bean实现了BeanNameAware接口,调用BeanNameAware的setBeanName()方法,将配置文件中该Bean对应的名称设置到Bean中
8,如果Bean实现了BeanFactoryAware接口,调用BeanFactoryAware的setBeanFactory()方法,将BeanFactory容器实例设置到Bean中
9,* 如果BeanFactory装配了BeanPostProcessor后处理器,调用BeanPostProcessor的postProcessBeforeInitialization()方法,对Bean进行加工处理。用户可以使用该方法对某些Bean进行特殊处理,甚至改变Bean的行为,BeanPostProcessor在spring里面占用特殊地位,spring容器所提供的AOP,动态代理等都是通过BeanPostProcessor实施的
10,如果Bean实现了InitializationBean的接口,调用InitializationBean的afterPropertiesSet()方法
11,如果Bean定义了init-method,通过init-method属性配置调用相应的初始化方法
12,* 如果BeanFactory装配了BeanPostProcessor后处理器,容器再次获得对Bean进行加工处理的机会,调用BeanPostProcessor的postProcessAfterInitialization()方法
13-1,如果是singleton的bean就放入spring缓冲池,然后容器销毁的时候,如果Bean实现了DisposableBean接口,此时会调用DisposableBean的afterPropertiesSet()方法,然后再调用destory-method方法,Bean周期结束。
13-2,如果是prototype的话就将准备就绪的Bean交给调用者
注:
Bean级生命周期接口方法:BeanNameAware、BeanFactoryAware、InitializationBean、DisposableBean,这些接口方法友Bean类直接实现
容器级生命周期接口方法:在上面带*号的都是,由InstantiationAwareBeanPostProcessor和BeanPostProcessor这两个接口实现,一般称它们为后处理器。它们独立于Bean,实现类以容器附加装置的形式注册到spring容器中并通过接口反射为spring容器预先识别。当spring容器创建任何Bean的时候,这些后处理器都会发生作用,所以是全局性的。
从spring3.0开始支持基于类注解的配置方式:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.springzoo.Car; @Configuration public class Beans { @Bean(name = "car") public Car buildCar() { Car car = new Car(); car.setBrand("红旗CA72"); car.setMaxSpeed(200); return car; } }
spring为基于注解类的配置提供了专门的ApplicationContext实现类:AnnotationConfigApplicationContext,来看看怎么使用的:
ApplicationContext ctx = new AnnotationConfigApplicationContext(Beans.class); Car car =ctx.getBean("car",Car.class);
WebApplicationContext是专门为Web应用准备的,它允许从相对于Web根目录装载配置文件来完成初始化工作,有个工具类WebApplicationContextUtils,通过它的getWebApplicationContext(ServletContext sc)方法,可以从ServletContext中获取WebApplicationContext实例。spring2.0还在WebApplicationContext中为Bean增加了三个新的作用域:request、session、global session,在非web环境下,只有singleton和prototyoe两种作用域。
WebApplicationContext中有一个常量:ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,以此为键存在ServletContext中,如此实现了WebApplicationContext和ServletContext的互访:
ServletContext sc = WebApplicationContext.getServletContext()
WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(sc)
ConfigurableWebApplicationContext扩展了WebApplicationContext,它允许通过配置文件实例化WebApplicationContext,它有两个重要方法:
* setServletContext(ServletContext sc):为spring设置Web应用上下文
* setConfigLocations(String[] configLocations):设置spring配置文件路径,一般都是现对于Web根目录,如:/WEB-INF/springzoo-dao.xml、/WEB-INF/springzoo-service.xml
初始化:
通过在web.xml中定义ContextLoaderServlet或者是ContextLoaderListener即可:
<!-- ① 从类路径下加载spring配置文件,classpath关键字特指类路径下加载 多个配置文件用逗号,分开--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml,/WEB-INF/springzoo-service.xml</param-value> </context-param> <!-- ② 负责启动spring容器的监听器,该监听器在web容器启动时候自动运行, 它将引用①处的上下文参数获得的spring配置文件地址--> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener>
相关推荐
- **Spring**:提供IOC容器管理和AOP支持,简化业务逻辑层的开发。 - **Hibernate**:实现ORM功能,简化数据持久层的开发。 - **学习难点**: - **英语文档阅读**:大量的英文技术文档和官方指南增加了学习难度。...
2. **IoC容器**:Spring通过IoC容器管理对象的生命周期和依赖关系,使得代码松耦合,更易于测试和维护。 3. **配置方式**:在Spring应用中,通常有一个或多个配置文件,如`beans.xml`,定义Bean的实例化和依赖关系...
它通过IoC容器控制对象的生命周期和装配,使得各组件间的依赖关系变得松散,提高了代码的可维护性和可测试性。 Struts是一个MVC(Model-View-Controller)框架,它负责处理HTTP请求,并将处理结果传递给视图层展示...
- **Spring**:Spring框架提供了IoC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程),用于业务逻辑层,提供事务管理和对象管理。 - **Hibernate**:是一个ORM(Object-...
- **Spring**:提供了IOC(控制反转)和AOP(面向切面编程),主要用于业务逻辑层,支持事务管理,并能与其他框架无缝集成。 - **Hibernate**:是一个对象关系映射(ORM)框架,简化了Java应用与关系数据库之间的...
- **Spring**:是一个全面的企业级应用框架,核心特性包括IOC(控制反转)和AOP(面向切面编程),可以用来管理对象和事务。 - **Hibernate**:是一个ORM(对象关系映射)框架,使得开发者可以用Java对象的方式来...
Spring通过提供IOC容器,实现了对象的生命周期管理,并且支持声明式事务管理等功能。 - **Hibernate**:作为一款对象关系映射(Object-Relational Mapping, ORM)工具,Hibernate可以将Java对象映射到关系型数据库表...
Spring的依赖注入特性允许开发者在运行时通过IoC(Inversion of Control)容器来管理对象的生命周期和依赖关系。此外,Spring AOP允许开发者定义切面,将关注点(如日志、事务)与业务逻辑分离,提高代码复用性。...
5. `spring-core`, `spring-context-support`, `spring-web`:Spring框架的核心组件,包括IoC容器、上下文支持和Web支持,它们是Spring应用的基础。 6. `commons-pool2`:Apache Commons的连接池库,用于高效管理...
Spring作为控制反转(IoC)和面向切面编程(AOP)的容器,管理着系统中的对象及其依赖关系。Spring允许开发者通过XML配置或注解方式来声明对象的创建和依赖,提供事务管理、数据源管理以及服务层(Service)和DAO层...
Spring是一个控制反转(IoC)和面向切面编程(AOP)的容器框架,能够帮助开发者管理对象之间的依赖关系,并且将面向切面的编程应用到系统中。SpringMVC是Spring框架中用于Web开发的一个模块,它通过分离模型(Model...