spring随记:
bean属性,singleton,单例,默认值,调用getBean方法返回是同一个对象,实例会被缓存起来,效率比较高。当一个bean被标识为singleton时候,spring的IOC容器中只会存在一个该bean。意思就是只有一个对象,video1和video2没有区别,大家都指向同一个地址,改变一个另外一个也变。代码如下
<bean id="video" class="net.xdclass.sp.domain.Video">
<--这里scope不写,默认是singleton-->
<property name="id" value="9"/>
<property name="title" value="Spring5.x课程"/>
</bean>
public static void main(String[] args) {
/**
* ClassPathXmlApplicationContext从类路径下面开始找
* ApplicationContext上下文接口,是spring的一个核心接口
*/
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
testScope(context);
//即使不在一个函数作用域里面,也是一个对象
Video video3=(Video)context.getBean("video");
System.out.println("video3: "+video3.getId());
}
public static void testScope(ApplicationContext context){
Video video1=(Video)context.getBean("video");
Video video2=(Video)context.getBean("video");
video1.setId(111);
System.out.println("video1: "+video1.getId());
System.out.println("video2: "+video2.getId());
System.out.println(video1==video2);
}
prototype:多例,调用getBean方法创建不同的对象,会频繁的创建和销毁对象造成很大的开销
<bean id="video" class="net.xdclass.sp.domain.Video" scope="prototype">
<property name="id" value="9"/>
<property name="title" value="Spring5.x课程"/>
</bean>
除此之外,singleton和prototype还在set注入上有非常有趣的体现:
public static void main(String[] args) {
/**
* ClassPathXmlApplicationContext从类路径下面开始找
* ApplicationContext上下文接口,是spring的一个核心接口
*/
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
//测试scope的两种属性
// testScope(context);
// Video video3=(Video)context.getBean("video");
// System.out.println("video3: "+video3.getId());
testInject(context);
}
//测试set注入,以及与scope两种属性的关系
public static void testInject(ApplicationContext context){
System.out.println("================================");
Video video=(Video) context.getBean("video");
VideoOrder videoOrder=(VideoOrder)context.getBean("videoOrder");
System.out.println("================================");
System.out.println(video.getTitle());
System.out.println(videoOrder.getId());
}
如果是singleton则一种bean只会调用一次,也就是只调用了一次set注入
如果video是prototype,则prototype所标注的bean,会调用多次,调用次数由代码中getbean所bean的次数决定。
现在我们将video和videoOrder都标注成prototype,就可以彻底发现他们的运行特点了!
现在我们可以总结了,首先,如果是singleton,它是可以在main之前运行的,类似于static代码块,而且它只有一次,但如果是prototype,他不能提前运行,必须处理到getbean方法才可以运行。而且这两个都是先执行构造函数,再执行set方法