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属性值必须为抽象方法名。