Spring容器作用域
Spring创建对象的作用域:Spring在创建对象时,默认只创建一个(单例模式)
scope:
singleton(默认 单例) 构造器就一次,结果true
prototype(原型 多例)构造器被执行两次,结果false,每次获取时Spring容器都会创建一个对象
session (一次会话)
request (一次请求范围)
验证:
(以user为例)
1.在Spring容器applicationContext.xml中
使用user里的无参构造器创建对象
<bean id="user" class="com.dlxy.entity.User"></bean>
2.在JUnitTest.java中
在测试中获取两个user对象,判断两个对象的地址值是否相同(如果一样就是同一个对象)
public void test2(){
//2.从Spring配置文件获取User对象
User user=ac.getBean("user",User.class);
System.out.println(user);
User user1=ac.getBean("user",User.class);
System.out.println(user1);
System.out.println(user ==user1);
}
运行结果是true,只创建了一个对象,user构造器只创建一次
Spring容器生命周期
(以user为例)
1.在User.java(User类)中添加两个方法(初始化和销毁方法)
public void init(){
System.out.println("int初始化");
}
public void destroy(){
System.out.println("destory销毁");
}
2.配置两个方法
init-method=“init”:配置初始化方法,初始化方法在构造方法之后执行,构造方法执行几次,初始化方法就执行几次。
destroy-method=“destroy”:销毁方法(只针对单例模式生效),在Spring容器销毁后执行该方法。
初始化方法
在Spring容器applicationContext.xml中
结果:初始化方法在构造方法之后执行,构造方法执行几次,初始化方法就执行几次
销毁方法
1.Spring容器销毁时:
在JUnitTest.java中
手动调用销毁方法
1)强制转换成AbstractApplicationContext才有销毁方法
2)ac1.close();
@Test
public void test2(){
//2.从Spring配置文件获取User对象
User user=ac.getBean("user",User.class);
System.out.println(user);
User user1=ac.getBean("user",User.class);
System.out.println(user1);
System.out.println(user ==user1);
//强制转换成子类型AbstractApplicationContext对象
AbstractApplicationContext ac1 =(AbstractApplicationContext)ac;
//AbstractApplicationContext对象提供销毁方法,ApplicationContext没有
ac1.close();
}
2.在Spring容器applicationContext.xml中
<bean id="user" class="com.dlxy.entity.User"
scope="singleton" init-method="init" destroy-method="destroy"></bean>
效果:出现销毁方法,说明销毁方法被调用,注意时单例模式生效
以上:Spring创建对象讲解完成
Spring管理对象之间依赖关系
就是如何给属性赋值
那user举例,我们有对象但属性都没有值都是null
IOC和DI
1.什么是IOC(Inversion Of Control 控制反转):对象之间的依赖关系应该由容器来建立。(将控制权由程序员转交给Spring容器)
之前是自己创建dao对象,调用dao中的方法,现在Spring能创建对象如何给属性赋值?
2.什么是DI(Dependency Injection 依赖注入):容器可以通过调用set方法或者构造器来建立对象之间的依赖关系。
set注入,构造器注入:给类中的属性赋值的
注:
IOC是目标,DI是手段。使用DI实现IOC。