你能写出来的java代码基本上都可以在xml配置,下面介绍一些高级依赖配置
获取其他bean的属性值
利用的工厂类:org.springframework.beans.factory.config.PropertyPathFactoryBean
该类中有如下两个方法:
- setTargetObject(Object targetObject) :指定要获取哪个实例的属性(当然可以用ref指定其他bean)
- setPropertyPath(String propertyPath) :指定获取哪个属性
说明:获取某bean的属性底层是通过getter方法来获取,所以对应的属性必须有规范的getter方法。
配置很简单,只要给PropertyPathFactoryBean配置两个property就行
<bean id="dog" class="com.lyx.service.Dog" p:color="黄色" p:age="3"/>
<bean id="person" class="com.lyx.service.Person" p:dog-ref="dog"/>
<!--获取dog的color属性
伪码:theColor -> dog.getColor()-->
<bean id="theColor"
class="org.springframework.beans.factory.config.PropertyPathFactoryBean"
p:targetObject-ref="dog" p:propertyPath="color"/>
<!--获取person的dog属性中的age属性
伪码:theAge -> person.getDog().getAge()-->
<bean id="theAge"
class="org.springframework.beans.factory.config.PropertyPathFactoryBean"
p:targetObject-ref="person" p:propertyPath="dog.age"/>
也可以用util命名空间的简化配置
<util:property-path path="dog.color" id="theColor2"/>
<util:property-path path="person.dog.age" id="theAge2"/>
获取Field值
利用的工厂类:org.springframework.beans.factory.config.FieldRetrievingFactoryBean
两种情况:
当Field是静态成员变量时:
该类中有如下两个方法:
- setTargetClass(String targetClass) :指定要获取哪个类的static Field
- setTargetField(String targetField) :指定获取哪个Field
当Field是实例成员变量时:
该类中有如下两个方法:
- setTargetObject(Object targetObject) :指定要获取哪个实例的Field(当然可以用ref指定其他bean)
- setTargetField(String targetField) :指定获取哪个Field
说明:获取某bean的field底层是通过 对象.field 的方式获取,所以对应的field必须是public修饰(对于实例Field,这个在实际项目中很少出现,field一般不会用public修饰)
<!--获取static field-->
<!--获取Frame的CROSSHAIR_CURSOR
伪码:cc-> Frame.CROSSHAIR_CURSOR-->
<bean id="cc" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
<property name="targetClass" value="java.awt.Frame"/>
<property name="targetField" value="CROSSHAIR_CURSOR"/>
</bean>
<!--上面的配置还可以改成用如下的staticField配置(文中没有说明)-->
<bean id="cc2" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
<property name="staticField" value="java.awt.Frame.CROSSHAIR_CURSOR"/>
</bean>
<!--获取实例field-->
<!--创建实例先-->
<bean id="person" class="com.lyx.service.Person">
<property name="dog">
<bean class="com.lyx.service.Dog" p:color="绿色" p:age="5"/>
</property>
</bean>
<!--获取person的dog
伪码:theColor -> person.dog-->
<bean id="theColor" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
<property name="targetObject" ref="person"/>
<property name="targetField" value="dog"/>
</bean>
获取static field 也可以用util命名空间的简化配置(实例field没有提供util方案,也暗示了一般不会直接获取实例field)
<util:constant static-field="java.awt.Frame.CROSSHAIR_CURSOR" id="cc3"/>
执行普通方法并且获取返回值
利用的工厂类:org.springframework.beans.factory.config.MethodInvokingFactoryBean
MethodInvokingFactoryBean有如下三个方法:
同样分为静态方法和实例方法
静态方法:
- setTargetClass(String targetClass): 指定调用哪个类的static 方法
- setTargetMethod(String targetMethod): 指定方法名
- setArguments(Object[] arguments): 指定方法参数
实例方法:
- setTargetObject(Object targetObject): 指定调用哪个实例的方法(当然可以用ref指定其他bean)
- setTargetMethod(String targetMethod): 指定方法名
- setArguments(Object[] arguments): 指定方法参数
Dog.java
public class Dog
{
private String color;
private String age;
//省略setter和getter和toString方法
}
Person.java
public class Person
{
private String name;
private Dog dog;
public String hunt(Dog dog,String time)
{
System.out.println(name+"在"+time+"带着"+dog+"去打猎!");
return "兔子";
}
//省略setter和getter和toString方法
}
beans.xml
<bean id="dog" class="com.lyx.service.Dog" p:color="黄色" p:age="3"/>
<bean id="person" class="com.lyx.service.Person" p:name="笨笨" p:dog-ref="dog"/>
<bean id="h" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject" ref="person"/>
<property name="targetMethod" value="hunt"/>
<property name="arguments" >
<list>
<ref bean="dog"/>
<value>早上</value>
</list>
</property>
</bean>
驱动
public class Driver
{
public static void main(String[] args)
{
var ctx = new ClassPathXmlApplicationContext("beans.xml");
System.out.println("----------------------------------------------");
System.out.println("打到一只"+ctx.getBean("h"));
//输出如下:
// 笨笨在早上带着Dog{color='黄色', age='3'}去打猎!
// ----------------------------------------------
//打到一只兔子
}
}
这里只演示了实例方法,static 方法基本上一样就不再演示