关键词
spring Java eclipse bean 多例模式 prototype 懒加载 lazy-init
写在后面
- 性能简述:对于多例模式的懒加载配置是否失效的测试。
- 刚接触,摸索中,低级谬误,只是做个记录,轻喷。
(有谬误)Xml配置文件(片段)
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd "> <!-- 对于多例模式,即使加了懒加载配置也没用 --> <bean id="myFactoryPrototypeExample" class="instance.BeanInstanceFactory" scope="prototype" lazy-init="false"/> <bean id="instanceFactoryInstancePrototypeExample" factory-bean="myFactoryPrototypeExample" scope="prototype" lazy-init="false"/></beans>
运行的测试代码
package test;import java.util.Calendar;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import instance.BeanClass;import instance.Person;import instance.User;public class TestInstance { //对于多例模式,默认懒加载,即使设置lazy-init="false"也有效 @Test public void test06(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); System.out.println("获取对象前"); //参数是xml中待创立的对象的id BeanClass bc3 = (BeanClass)context.getBean("instanceFactoryInstancePrototypeExample"); System.out.println(bc3+bc3.message); }}
解决
- 思路:查看xml配置文件
- 起因:xml配置文件有误。
- 解决:最初一个bean标签少写了factory-method属性。
(正确的)Xml配置文件(片段)
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd "> <!-- 对于多例模式,即使加了懒加载配置也没用 --> <bean id="myFactoryPrototypeExample" class="instance.BeanInstanceFactory" scope="prototype" lazy-init="false"/> <!--上面这里少写了factory-method--> <bean id="instanceFactoryInstancePrototypeExample" factory-bean="myFactoryPrototypeExample" factory-method="createBeanClassInstance" scope="prototype" lazy-init="false"/></beans>
包构造
(补充)BeanInstanceFactory类
package instance;public class BeanInstanceFactory { public BeanInstanceFactory(){ System.out.println("我是一个实例工厂"); } public BeanClass createBeanClassInstance(){ return new BeanClass("调用实例工厂办法实例化Bean"); }}
(补充)BeanClass类
package instance;public class BeanClass { public String message; public BeanClass() { this.message = "构造方法实例化Bean"; } public BeanClass(String message) { this.message = message; }}
运行后果
参考
org.springframework.beans.factory.BeanCreationException:No bean class specified on bean definition