Spring中协调作用域不同的Bean

来源:互联网 发布:编程和数学的联系 编辑:程序博客网 时间:2024/05/22 17:40
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
原创粉丝点击