Spring容器
(1)什么是Spring容器?
Spring容器(Spring框架中的一个模块)帮我们创建对象、并且管理对象之间依赖关系。
(2)如何启动Spring容器?
step1.导包。
mavan所有的包都可以在 https://mvnrepository.com/ 中找到,并且有示例
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.2.8.RELEASE</version> </dependency>
step2.添加Spring配置文件。
配置文件用来告诉容器,如何创建对象、如何建立对象之间的依赖关系等等。
step3.启动容器。
/* * 启动Spring容器。 * ApplicationContext是一个接口,定义了Spring * 容器的基本功能。 * ClassPathXmlApplicationContext是一个实现了 * ApplicationContext接口的类,该类会依据类路径 * 来查找Spring配置文件,然后启动容器。 */ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); System.out.println("context:" + context);
(3)创建对象
1)方式一 使用无参构造器。
step1.为类添加无参构造器(或者缺省构造器)。
step2.在配置文件当中,使用bean元素进行配置。
使用无参构造器创建对象。其中,id属性值要求唯一,class属性要写类的完整的名字。
<bean id="stu1" class="first.Student"/>
step3.启动Spring容器,调用容器提供的getBean方法来获得对象。
Student stu = ac.getBean("stu1",Student.class);
2)方式二 使用静态工厂方法。(了解)
使用静态工厂方法来创建对象
factory-method属性用来指定静态方法名,容器会调用该类的静态方法来创建对象。以下配置,容器会调用Calendar.getInstance()方法,该方法会返回一个对象。
<bean id="cal1" class="java.util.Calendar" factory-method="getInstance"/>
3)方式三 使用实例工厂方法。(了解)
使用实例工厂方法来创建对象。
factory-bean属性值是一个bean的id,factory-method属性指定方法名。
以下配置,容器会调用id为cal1的bean的getTime方法。
注:bean指的是由容器所管理的对象。
<bean id="time1" factory-bean="cal1" factory-method="getTime"/>
(4)作用域
容器默认情况下,对于某个bean元素,只会创建一个实例。
可以修改bean的作用域,将作用域设置为"prototype",容器就会创建多个实例。
scope属性用来设置bean的作用域。缺省值是"singleton",只会创建一个实例;
如果值为"prototype",则会创建多个实例(每调用一次getBean方法,就会创建一个)。
singleton:单例。
prototype:原型。
<bean id="sb1" class="basic.ScopeBean" scope="prototype"/>
(5)生命周期
容器在创建好相应的对象之后,会调用该对象的初始化方法,在销毁该对象之前,会调用该对象的销毁方法。
可以使用init-method属性和destroy-method属性来指定初始化方法和销毁方法的名称。
init-method属性用于指定初始化方法名。
destroy-method属性用于指定销毁方法名。
注:容器在删除对象之前,会先调用该对象的销毁方法。 只有作用域为singleton的bean,销毁方法才会执行。
<bean id="ms1" class="basic.MessageService" init-method="init" destroy-method="destroy" scope="singleton"/>
(6)延迟加载
默认情况下,容器启动之后,会将所有作用域为"singleton"的bean实例化。
可以将lazy-init属性值设置为true,容器启动之后,不再创建这些实例了(只有调用了getBean方法才会创建)
lazy-init属性用来设置是否延迟加载,如果值为true,表示延迟加载。
<bean id="lb1" class="basic.LazyBean" lazy-init="true"/>