1) BeanFactory factory = new XmlBeanFactory(new FileSystemResource(“src\\applicationContext.xml”));
Object factory.getBean(String beanId);
2) ApplicationContext context =new FileSystemXmlApplicationContext(“src\\applicationContext.xml”);
Object context.getBean(String beanId);
此外,FileSystemXmlApplicationContext还有功能类似的类:ClassPathXmlApplicationContext
id:Bean的唯一标识,装配Bean时需要作为参数,必需
class:Bean的类全名,用于配置文件定位Bean的位置,必需
name:Bean的别名,可以有多个,用空格、逗号或分号隔开(可混合使用),可作为装配Bean时替代id的参数
scope:设置Bean的模式,有singleton和prototype等值;默认为singleton,表示Spring以单例模式装配的Bean;prototype表示每次装配都新建一个不同的Bean
init-method:指定Bean在实例化完成后首先需要调用的方法名,该方法必须在Bean类中
destroy-method:指定Bean在销毁时需要调用的方法名,该方法必须在Bean类中
1) Bean对象实例的属性值需要在<bean>标签内部配置完成。标准形式如下:
<bean …> <property name=”…”> <value [type=”…”]>…</value> </property> … </bean>
<property>标签表示这是一个类属性,name属性指定该类属性对应Bean的哪一个变量,其必须与变量名相同;<value>标签表示变量的属性值,可选的type属性指定对应变量的类型,默认为java.lang.String型,也可以通过类全名(如java.lang.String、java.lang.Integer等)或者基本数据类型(如int、char、double等)手动设置。
每个property对应类中的一个变量。所有的属性都会在Bean实例化之后通过setter方法设置到实例中。
2) 对于xml配置文件中已有的Bean,可以用<ref>标签直接引用它,形式如下:
<ref bean=”…” />
其中,bean属性的值必须是该Bean的id或者别名name。
3) <property>标签中也有value属性和ref属性,可以替代<value>标签和<ref>标签,但是通过value属性指定的属性值只能是String型
4) <idref bean=”…” />标签表示所指定的bean的id或别名字符串,相当于:
<value>…(该bean的id或别名)</value>
使用它的目的是在取bean的id或别名之前先检查该bean是否已经配置到xml中
前述的普通属性实际上就是一个property对应一个value,而集合属性则是一个property对应多个value的情况。
1) <list>标签与java.util.List或数组
<property name=”…”> <list> <value>…</value> <value>…</value> … </list> </property>
2) <set>标签与java.util.Set
<property name=”…”> <set> <value>…</value> <value>…</value> … </set> </property>
3) <map>标签与java.util.Map
<property name=”…”> <map> <entry> <key> <value>…</value> </key> <value>…</value> </entry> … </map> </property>
此外,<entry>标签中也分别有key、value属性,可以替代<key>和<value>标签,但只有当key或value的值为简单类型(String、int等)才可以
4) <props>标签与java.util.Properties
<property name=”…”> <props> <propkey=”…”>…</prop> … </props> </property>
5) 以上四种情况下,Spring自动构造的实际集合类型分别是ArrayList、LinkedHashSet、LinkedHashMap、Properties
在<bean>标签内,可以添加<constructor-arg>标签为Bean类的构造方法配置参数。
<bean id=”…” class=”…”> <constructor-arg> <value>…</value> </constructor-arg> … </bean>
Spring会根据参数的数量和类型匹配正确的构造方法。
默认下,<value>标签内的值都是String型的,但<constructor-arg>标签中提供了type属性,可以为该构造体参数设置类型,其取值与<property>标签的type属性一致
另外,<constructor-arg>标签还提供了index属性,可以设置构造体参数传递的顺序。默认下,参数按从上到下的顺序传递,其index值默认为0、1、2……
构造方法传递的参数值将优先于上述普通属性和集合属性被设置,即构造方法传递的参数可能被覆盖。
<bean>标签中的autowire属性,可以自动配置Bean的方式。其取值有4个,分别是:
1) byName
试图在Spring容器中寻找id或别名与当前Bean的变量名相同的Bean;若找到则将该Bean赋值给当前Bean的变量,若未找到则置为null
2) byType
试图在Spring容器中寻找类型是当前Bean的变量类型或其子类的Bean;若找到且只有一个,则将该Bean赋值给当前Bean的对应变量;若有多个结果,则抛出UnsatisfiedDependencyException异常;若未找到则置为null(显然若变量的类型为Object,则必然会抛出异常)
3) constructor
上述两种自动配置都是配置Bean的对象变量,本配置方式只配置Bean的构造方法。若当前Bean的某个构造方法的各个参数的类型都与Spring容器中某个构造方法的配置相匹配,且不会发生冲突,则Spring会为当前Bean自动加载这个构造方法的配置。若存在多个,则会选择参数最多的那个。若当前Bean和加载的构造方法配置所在的Bean的类型冲突,则会抛出UnsatisfiedDependencyException异常
4) autodetect
首先会尝试使用constructor来匹配Bean,然后会使用byType来匹配Bean,不确定性的处理与二者相同
5) 手动与自动的混用
在可能出现冲突或者变量值发生变动的情况下,可以在已经设置了自动配置(autowire)的<bean>标签中再手动地配置一些属性,手动配置会优先于自动配置执行
在<value>标签中设置的值会被Spring自动转换成String型,因此直接设置null会被认为是一个字符串,而不是空值。表示空值的null需要用标签<null />来表示
1) Spring的xml配置文件可以拆分为多个来编写,只需在加载这些文件中使用String数组将它们一次性传入ApplicationContext即可,如下:
ApplicationContext context = new FileSystemXmlApplicationContext(new String[]{“a.xml”, “b.xml”});
2) 将属性值提出并保存到单独的属性文件(必须是扩展名为properties文件)中,并通过配置Spring的PropertyPlaceholderConfigurer来自动读取这些属性文件,再通过占位符变量(${变量名})来读取这些属性值
配置PropertyPlaceholderConfigurer的方式如下:
<bean id=”…” class=”org.springframework.beans.factory.config.PropertyPlaceholderConfigurer”> <property name=”location”> <value>属性文件(.properties)的路径</value> </property> </bean>
若有多个属性文件,则如下:
<bean id=”…” class=”org.springframework.beans.factory.config.PropertyPlaceholderConfigurer”> <property name=”locations”> <list> <value>属性文件(.properties)的路径</value> … </list> </property> </bean>
其中bean的id值可任意设置,无影响。通过占位符变量引用参数值时变量名必须与它们在属性文件中的名称一致
属性文件的数据格式如下:
a=123
b.c=hello