既然Spring能帮助我们创建对象,那么它给我们创建的对象是单例还是非单例呢?
实操
1.Application.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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="student" class="domain.Student"></bean>
<bean name="student2" class="domain.Student"></bean>
</beans>
2.代码如下
//读取配置文件的方式,传多个文件,使用逗号分割
BeanFactory beanFactory = new ClassPathXmlApplicationContext("ApplicationContext.xml","ApplicationContext_Controller.xml");
Student s1 = (Student) beanFactory.getBean("student");
Student s2 = (Student) beanFactory.getBean("student");
System.out.println(s1);
System.out.println(s2);
Student s2_1 = (Student) beanFactory.getBean("student2");
Student s2_2 = (Student) beanFactory.getBean("student2");
System.out.println(s2_1);
System.out.println(s2_2);
运行结果
domain.Student@5cb9f472
domain.Student@5cb9f472
domain.Student@cb644e
domain.Student@cb644e
我们可以看出spirng帮我们创建的对象默认是单例的,但是spring功能很强大,默认是单例,也就是表明可以通过设置改变创建的对象非单例。下面看下如何配置
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="student" class="domain.Student" scope="singleton"></bean>
<bean name="student2" class="domain.Student" scope="prototype"></bean>
</beans>
代码不做变动,直接运行
//读取配置文件的方式,传多个文件,使用逗号分割
BeanFactory beanFactory = new ClassPathXmlApplicationContext("ApplicationContext.xml","ApplicationContext_Controller.xml");
Student s1 = (Student) beanFactory.getBean("student");
Student s2 = (Student) beanFactory.getBean("student");
System.out.println(s1);
System.out.println(s2);
Student s2_1 = (Student) beanFactory.getBean("student2");
Student s2_2 = (Student) beanFactory.getBean("student2");
System.out.println(s2_1);
System.out.println(s2_2);
运行结果
domain.Student@5cb9f472
domain.Student@5cb9f472
domain.Student@cb644e
domain.Student@13805618
总结
我们可以看出,spirng默认创建的对象是单例的,但是通过在配置文件中设置scope属性,singleton表示单例(不填写默认也是单例);prototype表示非单例。
那么我们还有个问题,spring创建的对象是立即加载的,还是延迟加载呢?
1.配置文件不动
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="student" class="domain.Student" scope="singleton"></bean>
</beans>
2.代码
//读取配置文件的方式,传多个文件,使用逗号分割
BeanFactory beanFactory = new ClassPathXmlApplicationContext("ApplicationContext.xml","ApplicationContext_Controller.xml");
实体类加点标记
public Student(){
System.out.println("我是Student的构造方法");
}
运行结果
我是Student的构造方法
再次修改配置文件
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="student" class="domain.Student" scope="prototype"></bean>
</beans>
运行结果
修改代码
//读取配置文件的方式,传多个文件,使用逗号分割
BeanFactory beanFactory = new ClassPathXmlApplicationContext("ApplicationContext.xml","ApplicationContext_Controller.xml");
/* Student s1 = (Student) beanFactory.getBean("student");
Student s2 = (Student) beanFactory.getBean("student");
System.out.println(s1);
System.out.println(s2);*/
Student s2_1 = (Student) beanFactory.getBean("student2");
Student s2_2 = (Student) beanFactory.getBean("student2");
System.out.println(s2_1);
System.out.println(s2_2);
总结
我们可以看出,spirng默认是单例,单例是立即加载的。不去getBean spring也帮你创建好对象。非单例不是立即加载,需要主动getBean才能创建对象。
但是呢 这样还会有问题,单例会立即创建对象,但是我们使用spring的过程中,对象大部分是需要单例的,且随着业务的复杂程度上去,我们是不希望开始加载spring的同时,就创建这么多对象。也希望有着prototype的效果。随用随创。OK那就继续看下面内容
1.修改配置
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="student" class="domain.Student" scope="singleton" lazy-init="true"></bean>
</beans>
2.代码如下
//读取配置文件的方式,传多个文件,使用逗号分割
BeanFactory beanFactory = new ClassPathXmlApplicationContext("ApplicationContext.xml","ApplicationContext_Controller.xml");
3.运行结果
4.修改代码
//读取配置文件的方式,传多个文件,使用逗号分割
BeanFactory beanFactory = new ClassPathXmlApplicationContext("ApplicationContext.xml","ApplicationContext_Controller.xml");
Student s1 = (Student) beanFactory.getBean("student");
Student s2 = (Student) beanFactory.getBean("student");
System.out.println(s1);
System.out.println(s2);
5.运行结果
我是Student的构造方法
domain.Student@5cb9f472
domain.Student@5cb9f472
总结
配置文件中 lazy-init="true" 表示延迟加载。true表示延迟加载,!true的都是立即加载
网友评论