Spring中协调作用域不同的Bean

Spring中singleton作用域的Bean在程序的整个过程中只有因此初始化的机会,当然它的依赖关系也是在初始化阶段就确定下来,但是如果注入的依赖关系是一个prototype类型的Bean,那么该bean注入的时候肯定是“一次性注入”,也就是说prototype类型的bean的将会一直不变,但是这肯定是有违我们在定义scope="prototype"的初衷,那么这时该怎么办呢?"lookup-method"属性将会派上用场。同时还需要将具有依赖关系的bean定义成abstract类型。下面是我自定义的一个简单的类子:

先定义一个Dog接口

package unsynchronizedbean;

public interface Dog {
    public void hunt();
}

定义Dog接口的实现:

package unsynchronizedbean;

import java.util.Date;

public class DogImpl implements Dog {

    @Override
    public void hunt() {
        System.out.println(new Date() + " 此时在奔跑");
    }

}

这里定义一个Person抽象类:

package unsynchronizedbean;

public abstract class Person {

    public abstract Dog getDog();

    public void say(){
        System.out.print("现在时间是:   ");
        getDog().hunt();
    }
}

定义一个测试类:

package unsynchronizedbean;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    @Test
    public void testPerson() throws Exception {
        ApplicationContext atx = new ClassPathXmlApplicationContext("/unsynchronizedbean/beans.xml");
        Person p = atx.getBean("person", Person.class);
        p.say();
        //让该线程睡眠十秒钟,获取p1实例,结果要求p1、p的时间不一致
        Thread.sleep(10000);
        Person p1 = atx.getBean("person", Person.class);

        p1.say();

    }
}

在我自己所创建的包下定义的.xml格式文件bean部分的片段如下:

<bean id="dogImpl" class="unsynchronizedbean.DogImpl" scope="prototype"/>
    <bean id="person" class="unsynchronizedbean.Person">
        <lookup-method name="getDog" bean="dogImpl"/>
    </bean>

协调作用于不同的Bean的关键就是确定Singleton Bean的抽象方法,通过该抽象方法返回一个prototype类型的class,然后在配置文件中通过lookup-method属性为该抽象类提供具体实现,最后这里还要注意一点name属性值必须为抽象方法名。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值