自己虽然研究过一点Spring,也写过一点利用Spring的代码,但是从来没有认真的从头到尾的研究过Spring,导致其中细节概念混乱,再看到第7章,Spring框架简介时,又体会到了这一点,希望能够尽快抽出时间,能够详细阅读有关Spring的文章和书籍,从中体会和理解
IoC的“精神”和Spring的“细节”。
1、核心bean工厂 1.1 基础接口:
BeanFactory
ListableBeanFactory(只可用于当前的工厂实例,而不能进入工厂的层级体系)
beanFacoryUtils(可以遍历整个工厂体系)
1.2 通过XML组装bean:
定义bean组件(借助标准的java.beans.PropertyEditor机制,bean工厂可以自动把String类型的值转换为适当的类型)
访问bean组件(
a:XmlBeanFactory、
b:DefaultlistableBeanFactory和XmlBeanDefinitionReader)
1.3 非XML格式的Bean声明
读取属性文件或资源包(PropertiesBeanDefinitionReader)
编程方式注册(RootBeanDefinition和MutablePropertyValues)
1.4 组装应用对象
bean工厂可以根据bean属性中描述的对象依赖来组装(wire)bean实例,使得Spring容器能够对受管对象进行依赖决议(dependency resolving)
1.5 自动装配(autowire)
byType、byName,推荐byType(出错可能小)
1.6 依赖检查(dependency checking)
<bean id ="****" class="" autowire="byType" dependency-check="objects">.</bean> 值为“object”时,表示只做对象间关联的检查;
值为“simple”时,表示只检查基本类型的属性(原始类型或者String);
值为“all”时,表示检查所有的类型;
值为“none”,表示不进行依赖检查;
1.7 生命周期回调
在bean组件声明中指定回调方法
<bean id="*****" class="****" init-method="initialize" destory-method="shutdown"/>
***类只需提供无参数、访问级别为public的initialize和shutdown两个方法即可,不必实现任何Spring特有的接口(不依赖Spring)。
只要有可能,应该尽量使用JavaBean的属性或者构造子参数,而不是实现Spring生命周期方法。
1.8 复杂的属性值
数组和List组装方式一样;
1 <property name="myArrayList">
2 <list>
3 <ref bean="ABean"/>
4 <ref bean="BBean"/>
5 <value>myArrayValue</value>
6 <value>myListValue</value>
7 </list>
8 </property>
Map和Properties都一个Key值,但是不一样(废话一句);
1 <property name="myMap">
2 <map>
3 <entry key="myMapKey">
4 <ref bean="myBean"/>
5 </entry>
6 <entry key="yourMapKey">
7 <value>yourMapValue</value>
8 </entry>
9 </map>
10 </property>
1 <property name="myProperties">
2 <props>
3 <prop key="myPropKey">
4 myPropValue
5 </prop>
6 <prop key="yourPropKey">
7 yourPropValue
8 </prop>
9 </props>
10 </property>
2、工厂bean 2.1 工厂bean(factory bean)-- 它们实现了org.springframework.beans.factory.FactoryBean接口;
public interface FactoryBean{
object getObject() throws Exception;
Class getObjectType();
boolean isSingleton();
}
2.2 Spring内建的资源工厂,包括:
2.2.1 org.springframework.jndi.JndiObjectFactoryBean:一个通用的工厂bean,通过JNDI查找而获得的对象。JNDI查找由Spring--而不是应用代码--来执行;
2.2.2 org.springframework.orm.hibernate.LocalSessionFactoryBean:用于在本地装配Hibernate SessionFactory的工厂bean;
2.2.3 org.springframework.aop.framework.ProxyFactoryBean:一个通用的工厂bean,用于获得AOP代理。
2.2.4 org.springframework.transaction.interceptor.TransactionProxyFactoryBean:用于为对象创建事务代理,用于实现简捷易用的声明性食物管理;
2.2.5 org.springframework.remoting.rmi.RmiProxyFactoryBean:这个工厂bean可以为通过RMI访问的远程对象创建一个代理;
以上为常用的,不常用的不列了......
3、Spring 应用上下文
应用上下文是应用程序的中心注册机构。
3.1 除了支持bean工厂的全部功能之外,应用上下文还具备了下列功能:
*支持不同信息源。可以用统一的方式根据键获得本地化的信息,而不依赖地称的信息来源。默认的实现是从资源绑定中读取信息。
*访问文件资源。不依赖于实际资源环境(例如文件系统或ServletContext)的情况下,根据相对路径载入资源。
*支持应用事件。监听器(Spring AOP框架可以作为“事件-监听”机制的替代品)。
3.2 访问信息源以及访问文件资源,引用对象依赖更专用的接口--org.springframework.context.ResourceLoaderAware接口--即可。
3.3 信息源,在应用上下文声明一个名为messageSource的MessageSourc对象,默认实现是ResourceBundleMessageSource,它对标准的java.util.ResourceBundle进行了封装,它唯一需要的参数是basename,也就是资源包的文件名--只读取一次,放入缓存;也提供了“ReloadableResourceBundleMessageSource”(可重新加载)。
3.4 文件资源
实现ResourceLoadAware接口。
3.5 Bean Factory 后处理
----------