前几天抽空重温了Spring参考手册,IoC部分做了笔记,AOP部分因为结合了AspectJ和XML Schemed Support,暂时没做笔记,除此之外,还看了看Spring的事务管理以及对Hibernate的底层支持.现在整理出我的Spring IoC学习笔记.
1 学习Spring的切入点----反向控制,学习反向控制,从Spring IoC容器的包开始.
org.springframework.beans及org.springframeword.context包是Spring IoC容器的基础.BeanFactory提供了配置框架及基本功能,而ApplicationContext则增加了更多支持企业核心内容的功能.
2 了解bean
简单地讲,bean就是由Spring容器初始化、装配及被管理地对象,除此之外,bean就没有特别之处了.<o:p></o:p>
3 了解BeanFactory<o:p></o:p>
在Spring中,BeanFactory是IoC容器的核心接口.它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖.<o:p></o:p>
实际运行机制是这样的:<o:p></o:p>
ApplicationContext context=new ClassPathXmlApplicationContext(new String[]{“applicationContext.xml”,”applicationContext-part2.xml”});<o:p></o:p>
BeanFactory factory=(BeanFactory)context;<o:p></o:p>
<o:p> </o:p>
我们需要BeanFactory实例,在BeanFactory实例中最主要的一组方法就是getBean的重载方法.<o:p></o:p>
<o:p> </o:p>
4 <bean></bean>标签<o:p></o:p>
Class:采用标准java命名机制.<o:p></o:p>
Alias:别名.<o:p></o:p>
构造器参数:<constructor-arg index="”0”" value="”40”" type="”java.lang.Integer”"></constructor-arg><o:p></o:p>
4.1 bean的实例化:<o:p></o:p>
两种方法:<o:p></o:p>
第一种是直接调用构造函数.<o:p></o:p>
<bean class="”src.Example”/" name="”example”"></bean><o:p></o:p>
第二种是静态工厂的工厂方法,其中,工厂方法必须是静态方法.<o:p></o:p>
<bean class="”src.ExampleFactory”" style="BACKGROUND: yellow; mso-highlight: yellow" name="”example”"></bean>factory-method=”createExample”/><o:p></o:p>
第三种是动态(实例)工厂的工厂方法<o:p></o:p>
<bean name="”myFactory”/"></bean>
<bean name="”example”" factory-method="”createExample”/" factory-bean="”myFactory”"></bean>
这种方法的好处是工厂也被IoC了.
4.2 反向注入的类型
1 setter()方法 2 构造器
使用构造器注入可能会导致循环依赖,即A在构造器中注入B,而B在构造器中注入A,此时,会抛出BeanCurrentlyInCreationException异常.对于此问题,一个可能的解决方法就是修改源代码,将构造器注入改为setter注入.另一个解决方法就是完全放弃使用构造器注入,只使用setter注入.
4.3 注入的时机
注入默认采用singleton模式,在容器创建时便创建,这样的好处是可以及时发现配置问题,坏处是增加了不必要的内存和时间开销.
4.4 ref的三种用法
<ref bean="”beanname”"></ref>
<ref local="”beanname”"></ref>
<ref parent="”beanname”"></ref>不常见
其中beanname可以是id也可以是name,为了优化,还可以把ref改成idref,这时会在创建容器时对beanname进行检验.
4.5 内部类的配置
4.6 集合的配置 <list></list> 、、、 <props></props>
4.7 父子bean的集合属性合并(merge=true)
4.8 强类型集合(tiger适用)
Spring的IoC支持tiger的强类型集合
4.9 null与””的注入(<null></null>、<value></value><value></value>)
4.10 value与ref的简写形式,包括在map中
4.11 组合属性赋值
需要注意,组合中的任一级在初始化后不能为空,否则抛NullPointerException
4.12 depends-on
显示指定多个依赖,被指定的bean需要在该bean之前初始化,但并不一定该类与被指定的bean存在关联.
4.13 延迟初始化 <bean laze-init="”true”/"></bean>or <beans default-laze-init="”true”"></beans>…<beans></beans>
如果一个非延迟初始化bean依赖于一个延迟初始化bean,那么初始化前者的时候,会顺带初始化后者,也就是说,laze-init=”true”会实效.
4.14 自动装配 五种形式no 、byName 、byType 、constructor 、autodetect
优点:1 省事
2 同步更新
缺点:确定你用的对,否则可能抛异常.
4.15
形式:方法注入
手段:<lookup-method name="”methodName”" bean="”</span"></lookup-method>返回类型的bean定义”>
目的:一个singleton类的某个方法每次调用需要创建不同的非singleton类实例.
注意:非singleton类实例必须是prototype的.
<o:p> </o:p>
5 bean的作用域
五种:singleton,prototype,request,session,global session,其中后三种是针对web的.
如果采用后三种,只需要在web.xml中加入:
<listener></listener>
<listener-class></listener-class> org.springframework.web.context.request.RequestContextListener
<o:p> </o:p>
如果需要将后三种作用域的bean注入到其它bean中,还需要加入
<aop:scoped-proxy></aop:scoped-proxy>
之所以加入这条语句的原因,就是将这个bean配成动态代理模式,这样可以保证每次注入进依赖类中的对象不总是那一个,配上这个代理后,被注入类就就智能了了.
<o:p> </o:p>
6 定制bean特性
6.1 Lifecycle接口
包括两个接口,InitializingBean和DisposableBean,实现这两个接口可的bean在初始化和析构时会调用前者的afterPropertiesSet()方法,以及后者的destroy()方法.
前者称为初始化回调,Spring建议我们不要采用实现接口InitializingBean来实现初始化回调,因为这样会带来与业务Bean的耦合,最好的方法是采用 bean的init-method属性.
后者称为析构回调,同样, Spring建议我们不要采用实现接口DisposableBean来实现析构回调,
因为这样会带来与业务Bean的耦合,最好的方法是采用 bean的destroy-method属性.
<o:p> </o:p>
default-init-method 、defalult-destroy-method的用法.
<o:p> </o:p>
7 非web环境优雅的关闭Spring IoC
在JVM里注册一个关闭钩子
AbstractApplicationContext ctx=new ClassPathXmlApplicationContext(new String[](“beans.xml”));
Ctx.registerShutdownHook();
<o:p> </o:p>
8 BeanFactoryAware接口
被BeanFactory实例管理的bean是可怜的,因为他们默认不能感知BeanFactory实例的存在,但是,有了BeanFactoryAware接口,让这一切都变得可能.
实际上BeanFactoryAware接口里只有一个方法:setBeanFactory(),但就是这个方法,使bean可以获得BeanFactory的实例,进而获取其它的bean实例,当然这会影响耦合性.
现在来用BeanFactoryAware接口,<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-th