在spring框架实例化spring工厂哟普两种方式
- 通过ApplicationContext类(开发阶段受推崇)
- 通过BeanFactory类(生产)
通过Application实例化spring工厂
通过这种方式实例化工厂的特点:
- 浪费内存,因为所有的bean 都会随着工厂的实例化而一起实例化
- 在开发阶段受到受到推崇,因为可以马上测出代码的是否正确
使用Application实例化spring工厂demo
编写一个目标类OrderDao,有空的构造方法和addOrder()的方法,代码如下;
package test;
public class OrderDao {
public OrderDao()
{ //空的构造方法
System.out.println("通过ApplicationContext类,实例化spring工厂...");
}
public void addOrder()
{
System.out.println("OrderDao里面的addOrder()方法..........");
}
}
配置xml代码如下:
<bean id="orderDao" class="test.OrderDao"></bean>
编一个测试 类,使用ApplicationContext类去实例化spring工厂
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext act=new ClassPathXmlApplicationContext(new String[] {"beans.xml"})
}
}
运行代码查看控制台输出:
控制台输出表明了,在实例化spring工厂的时候,实体类OrderDao就被实例化(实例化一个必定会调用该类的无参构造函数)。
通过BeanFactory类实例化spring工厂
使用BeanFactory实例化spring工厂的特点:
- 实例化工厂的同时不会把bean实例化,所以又称为延迟加载,只有用户访问这个bean才会把这个bean实例化
- 如果bean的配置有问题,不能及时发现
- 优点就是节省内存
目标类和xml文件不需要重新编,编写一个测试类即可,代码如下:
package test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
public class Test {
public static void main(String[] args) {
BeanFactory factory=new XmlBeanFactory(new ClassPathResource("beans.xml"));
//OrderDao orderDao=(OrderDao) factory.getBean("orderDao");只有调用时才会将这个类实例化
}
}
运行代码查看结果:
看到信息: Loading XML bean definitions from class path resource [beans.xml]的输出信息说明spring工厂已经实例化了。然而,spring工厂实例化了,OrderDao这个bean并没有被实例化。
结论:
- 使用BeanFactory实例化spring工厂的同时不会把bean实例化
- 使用ApplicationContext 实例化spring工厂会把所有的bean实例化