浏览 1532 次
锁定老帖子 主题:SpringIOC容器管理bean
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-11-13
最后修改:2008-12-06
IOC全称为Inversin of Control,译控制反转。 依赖注入的3种主要方式:构造方法注入、属性注入、接口注入。 Spring提供强大的IOC容器,支持属性注入和构造方法注入两种。 2、BeanFactory采用的是工厂模式,实现了BeanFactory接口类负责创建并配置所有Bean.应用程序将Bean创建和配置完全委托给BeanFactory,然后从BeanFactory获取使用Bean; 启动应用程序 ↓ 实例化BeanFactory → 获取xml配置文件 ↓ 从BeanFactory中获取Bean并使用 ↓ 销毁BeanFactory → 销毁Bean <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="hello" class="example.chapter1.helloworld.HelloWorldImpl"> <property name="name" value="Spring"></property> </bean> </beans> ①Spring提供几种BeanFactory实现,最常用的是XmlBeanFactory。最简单方法从本地加载xml配置文件。BeanFactory factory=new BeanFactory(new FileSystemResoure("config.xml")); ②使用ClassPath定位XML更为方便,只需确保XML配置文件位于ClassPath路径内 BeanFactory factory=new BeanFactory(new ClassPathResource("config.xml"); 在获取BeanFactory后就可以获取Bean实例 ③使用ApplicationContext ApplicationContext context=new ClassPathXmlApplicationContext("config.xml"); HelloWorld hello = (HelloWorld) beanfactory.getBean("hello"); 3、装配Bean 告知Spring容器如何创建并配置Bean的方式XML每个<bean>节点配置,对于对下ExampleBean: package example.chapter; public class ExampleBean{ private List list; private int size=100; pivate String version; public void setSize(int size){ this.size=size; } public void setVersion(String version) { this.version=version; } public void init(){ list=new ArrayList(size); } } 需要size和version两个属性,然后调用init方法完成初始化 <bean id="exampleBean" class="example.chapter.ExampleBean" init-metod="init"> <property name="size" value="10"/> <property name="version" value="1.0_beta"/> </bean> 4、各种注入类型 ①注入基本类型 通过set方法可以注入指定的属性值: package example.chapter; import java.net.URL; public class BasicBean { private String title; public void setUseCache(boolean useCache) {} public void setMaxSize(int size) {} public String getTitle() { return title; } public void setTitle(String title) {this.title = title;} public void setFile(URL url) { System.out.println(url); } }对就XML配置片段如下: <bean id="basicBean" class="example.chapter.BasicBean"> <property name="useCache" value="true" /> <property name="maxSize" value="100" /> <property name="title" value="A Basic Bean" /> <property name="file" value="config.xml" /> </bean> ②注入引用类型 如果需要注入的属性不是基本类型,而是引用类型,则使用<ref>替代<value> package example.chapter; public class RefBean { private BasicBean basicBean; public void setBasic(BasicBean basicBean) { this.basicBean = basicBean; } }对应XML配置片段如下 <bean id="refBean" class="example.chapter3.RefBean"> <property name="basic" ref="basicBean" /> </bean> ③注入List类型和数组类型 Spring支持各种集合类型的注入 package example.chapter; import java.util.List; public class ListBean { public void setChildren(List children) {} public void setPrices(List<Float> prices) { for(Float f : prices) { System.out.println(f); } } public void setFibonacci(int[] fibonacci) { for(int n : fibonacci) { System.out.println(n); } } }对应XML配置片段如下 <bean id="listBean" class="example.chapter3.ListBean"> <!-- 注入普通List --> <property name="children"> <list> <value>A String</value> <ref bean="basicBean" /> </list> </property> <!-- 注入强类型的List<Float> --> <property name="prices"> <list> <value>12.54</value> <value>82</value> <value>27.9</value> </list> </property> <!-- 注入int[]数组 --> <property name="fibonacci"> <list> <value>1</value> <value>1</value> <value>2</value> <value>3</value> <value>5</value> </list> </property> </bean> ④set类型注入 Set类型和List类似,只不过注入的是Set,因此包含任意的<value>或<ref>节点 package example.chapter; import java.util.Set; public class SetBean { public void setCups(Set cups) { for(Object obj : cups) { System.out.println(obj); } } } 对应的XML配置片段如下 <bean id="setBean" class="example.chapter3.SetBean"> <property name="cups"> <set> <value>spring</value> <value>hibernate</value> <value>hibernate</value> <ref bean="listBean" /> </set> </property> </bean> ⑤注入Map类型 Map存在于健值映射,通过<entry>节点来定义各项 package example.chapter; import java.util.*; public class MapBean { public void setWeekday(Map map) {} }对应XML配置如下: <bean id="mapBean" class="example.chapter3.MapBean"> <property name="weekday"> <map> <!-- 用String作为key --> <entry key="Monday"> <value>do something</value> </entry> <entry key="Tuesday"> <ref bean="setBean" /> </entry> <!-- 用Bean作为key --> <entry key-ref="basicBean" value="basic" /> <entry key-ref="listBean" value-ref="setBean" /> </map> </property> </bean> 上面配置上,注入的Map键只能为String类型,但实际上,Map可以做为任意的Object做为键。为了使用另一个Bean作为键,需要近如下编写<entry>节点。 <entry> <key> <ref bean="basicBean"/> </key> <value>basic</value> </entry> <entry> <key> <ref bean="listBean"/> </key> <ref>setBean</ref> </entry> ⑥注入Properties类型 Properties也是键值对构成,注入和Map类似,不过,由于Properties的键值都只能由String,因此不必使用<value>,注入Properties的XML配置片段如下。 <bean id="propBean" class="example.chapter3.PropBean"> <property name="env"> <props> <prop key="target">1.5</prop> <prop key="encoding">UTF-8</prop> <prop key="debug">on</prop> </props> </property> </bean> ㈡ 构造方法注入 除了上述属性注入外,还有构造方法注入. 使用构构造方法注入的优点是,构造方法的参数是强制注入的,这样可以保证Bean在创建时就正确初始化了。属性可能由于多次注入而导致不正确的状态。 package example.chapter; public class ConstructorBean { public ConstructorBean(int min, int max) { System.out.println("(int, int)"); } } 在XML配置文件中,需要在<bean>和</bean>之间加入<constructor-arg>节点,按照构造方法的参数排序。 <bean id="constructorBean" class="example.chapter3.ConstructorBean"> <constructor-arg value="100" /> <constructor-arg value="200" /> </bean> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |