Spring的基本用法(三)

获得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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值