您的位置:首页 > 编程语言 > Java开发

Spring的基本用法(三)

2016-03-07 11:26 381 查看
获得Bean 本身的 Id

BeanNameAware接口提供回调本身 id 属性的能力。实现一个方法:

void setBeanName(String name);

该方法的name 参数就是 Bean 的 id 。

setBeanName在依赖关系注入后,初始化回调之前被执行。

*********************************************************************

深入理解依赖关系配置

通常组件与组件之间的耦合,采用依赖注入管理,但是普通的JavaBean 属性值,应直接在代码中设置(配置文件制定,大大降低了代码的可读性)

依赖配置

属性 property 构造器参数 constructor-arg

检验BeanFactory 中每个 Bean 的配置

a) Bean引用的合作者指向一个合法的 Bean

b) Bean的普通属性值是否获得一个有效值

BeanFactory和 ApplicationContext 实例化容器中的 Bean 的时机不同,前者等程序需要时才创建 Bean ,后者在加载 ApplicationContext 实例时,会自动实例化容器中的全部 Bean (Singleton 作用域 Bean )。

可以通过Bean 的 lazy-load 属性,改变 ApplicationContext 的默认行为

设置普通字面值

value属性用于确定字符串参数,空值使用 <null/>

注入合作者Bean

ref 属性用于注入的是容器中某个Bean 实例。使用 ref 属性,可以让 Spring 在部署是验证依赖的 Bean 是否真正存在。

有两个属性

a) bean

引用不在同一个XML 配置文件中的其他 Bean

b) local

引用用一个XML 配置文件中的其他 Bean

让Spring 在解析 XML 时,验证 Bean 的名称

注入嵌套Bean

如果某个Bean 的依赖 Bean ,不想被 Spring 容器直接访问,可以使用嵌套 Bean 。 Bean元素用来定义嵌套 Bean ,嵌套 Bean 只对嵌套它的外部 Bean 有效, Spring 容器无法直接访问嵌套 Bean 。嵌套 Bean 无须 id 属性。

<bean id="chinese" class="vivi.Chinese">

<property name="axe">

<bean class="vivi.SteelAxe"/>

</property>

</bean>

提高了程序的内聚性,但是降低了程序的灵活性

注入集合值

如果Bean 的属性是集合,可以使用 List 、 Set 、 Map 、 Properties 的属性值。

<list>

<value>小学 </value>

<value>大学 </value>

</list>

<set>

<value></value>

<bean class="vivi.SteelAxe"/>

<ref local="stoneAxe"/>

</set>

<map>

<entry key="语文 " value="87"/>

<entry key="数学 ">

<value></value>

</entry>

</map>

<props>

<prop key="血压 "> 正常 </prop>

<prop key="身高 ">170</prop>

</props>

*********************************************************************

注入其他Bean 的属性值

通过PropertyPathFactoryBean 类,可以注入某个实例的属性值。 PropertyPathFactoryBean 用来获得目标 Bean 的属性值,获得的属性值可以注入给其他的 Bean 。

<!--目标 Bean-->

<bean id="person" class="vivi.person" singleton="false">

<property name="age" value="30" />

<property name="son">

<bean class="vivi.Son">

<property name="age" value="11" />

</bean>

</property>

</bean>

<bean id="son" class="vivi.Son">

<property name="age">

<bean id="person.son.age" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"/>

</property>

</bean>

也可直接定义成新的Bean

<bean id="son" class="org.springframework.beans.factory.config.PropertyPathFactoryBean">

<!--指定目标 Bean-->

<property name="taregetBeanName" value="person">

<!--指定属性,目标 Bean 的某个属性 -->

<property name="propertyPath" value="son">

</bean>

注入Field 值

通过FiledRetrievingFactoryBean 类可以完成 field 值的注入。 FiledRetrievingFactoryBean 用来获得目标 Bean 的 Field 值,获得的属性值可以注入给其他的 Bean 。如果访问的是非静态的 Field值,则不可以直接通过类名访问,而是应该通过容器中已经存在的 Bean 来访问 Field 值。

<bean id="son" class="vivi.Son">

<property name="age">

<!--id属性获得哪个类的那个 Field 值 -->

<bean id="java.sql.Connection.TRANSACTION_SERIALIZABLE" class="org.springframework.beans.factory.config.FiledRetrievingFactoryBean"/>

</property>

</bean>

也可直接定义成新的Bean

<bean id="age" class="org.springframework.beans.factory.config.FiledRetrievingFactoryBean">

<!--指定目标类或对象 targetObject-->

<property name="taregetClass" value="person">

<!--指定目标 Field-->

<property name="taregetField" value="age">

</bean>

如果是静态的Filed 还有一种更为简洁的写法

<bean id="age" class="org.springframework.beans.factory.config.FiledRetrievingFactoryBean">

<property name="staticField" value="java.sql.Connection.TRANSACTION_SERIALIZABLE">

</bean>

*********************************************************************

注入方法返回值

通过MethodInvokingFactoryBean 工厂 Bean ,可注入方法返回值。

<bean id="valueGnerator" class="vivi.ValueGnerator" />

<bean id="son" class="vivi.Son">

<property name="age" >

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" >

<!--targetClass用于静态方法的返回 -->

<property name="targetObject" local="valueGnerator" />

<property name="targetMethod" value="getValue" />

</bean>

</property>

</bean>

对于方法的重载,没有指定参数列表,默认采用空参数列表。

<bean id="sysProps" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" >

<property name="targetClass" local="java.lang.System" />

<property name="targetMethod" value="getProperties" />

</bean>

<bean id="javaVersion" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" >

<property name="targetObject" ref="sysProps" />

<property name="targetMethod" value="getProperty" />

<property name="arguments" />

<list>

<value>java.version</value>

</list>

</property>

</bean>

对于静态工厂方法的创建

<bean id="javaVersion" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" >

<property name="staticMethod" value="vivi.MyClassFactory.getInstance"/>

</bean>

*********************************************************************

强制初始化Bean

Spring默认规则:先初始化主调 Bean ,再初始化依赖 Bean 。

BeanA依赖于 BeanB ,程序请求 BeanA 时,首先 Spring 容器会初始化 BeanB ,再将 BeanB注入 BeanA ,最后将具备完整依赖的 BeanA 返回程序。

<!--manager Bean在初始化 Bean One 之前实例化 -->

<bean id="baseOne" class="ExampleBean" depends-on="manager" >

<property name="manager" ref="manager" />

</bean>

<bean id="manager" class="ManagerBean"/>

自动装配

配置自动装配(降低了依赖关系的透明性和清晰性),使用Bean 元素的 autoWire 属性,autoWire 属性可以接受如下值:

1、 no 不使用自动装配, Bean 的依赖必须通过 ref 元素定义。

2、 byName 根据属性名,自动装配

color: #80008
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: