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