035用Spring工厂类在XML中 获取其他bean的属性值、获取Field值、执行普通方法并且获取返回值

这篇博客介绍了如何在Spring的XML配置中使用工厂类来实现高级依赖配置,包括获取其他bean的属性值、Field值以及执行普通方法并获取返回值。讲解了PropertyPathFactoryBean、FieldRetrievingFactoryBean和MethodInvokingFactoryBean的用法,并提供了相关方法的详细说明和配置示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

你能写出来的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 方法基本上一样就不再演示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值