1.spring之IOC
1.1 IOC的概念
所谓的IOC称之为控制反转,简单来说就是将对象的创建和对象的生命周期管理的过程交给Spring框架处理,从此在开发过程中不再需要关注这些细节。需要使用到对象时,直接从Spring框架中获取。
1.2 IOC的使用
导包
配置核心文件
1.3 IOC的启动原理
当初始化一个Sring容器时,会先去指定路径下寻找到xml,然后解析,回去到bean标签的class属性对应的值。根据全路径名通过反射技术获取对象,并且以id的值为key,对象的值为value,存入到map中。
当我们使用getBean获取对象时,从map中通过传入的key获取值,如果获取到,那么就返回对象,如果获取不到,返回null
-
默认情况下,多次获取同一个id的bean,得到的是同一个对象
-
即使是同一个类,如果配置过多个不同id标签,每个id都会在内存中创建一个新的对象,不同的id就是对应的类型相同,但是对象也不同。
-
同一个beans标签下,不允许出现相同的id
1.4 IOC获取对象的方式
1.4.1 传入ID
Person person = (Person) applicationContext.getBean("person");
1.4.2 传入class
Person person = applicationContext.getBean(Person.class);
1.4.3 传入ID和class
Person person = applicationContext.getBean("person", Person.class);
1.5 spring创建对象的方式
1.5.1 通过无参构造创建
默认调用的是无参构造的方式创建对象,使用这种方式,一定要保证类中有无参构造,否则抛出异常
1.5.2 通过静态工厂创建
applicationContext.xml中配置
<!--静态工厂创建对象:由于是静态方法,类名.方法可直接拿到对象-->
<bean id="calendarStaticFactory"
class="com.tsk.edu.factory.CalendarStaticFactory" factory-method="getCalendar"></bean>
1.5.3 通过实例工厂创建
applicationContext.xml中配置
<!--实例工厂创建对象:先拿到工厂的实例,再拿到对象-->
<bean id="calendarObjectFactory" class="com.tsk.edu.factory.CalendarObjectFactory" ></bean>
<bean id="calendar" factory-bean="calendarObjectFactory" factory-method="getCalendar"></bean>
1.5.4 通过内置工厂创建对象(实现FactoryBean)
package com.tsk.edu.factory;
import org.springframework.beans.factory.FactoryBean;
import java.util.Calendar;
public class CalendarSpringFactory implements FactoryBean<Calendar> {
@Override
public Calendar getObject() throws Exception {
return Calendar.getInstance();
}
@Override
public Class<?> getObjectType() {
return Calendar.class;
}
}
applicationContext.xml中配置
<!--spring内置工厂创建对象-->
<bean id="calendarSpringFactory" class="com.tsk.edu.factory.CalendarSpringFactory"></bean>
1.6 单例和多例
Spring容器管理的bean在默认情况下是单例的。就是说,一个bean只会创建一个对象,放入到对应的map中。无论根据id获取多少次该bean,都返回的是同一个对象
设置多例
<bean id="person" class="com.shangma.cn.entity.Person" scope="prototype"></bean>
2.6.1单例模式下bean对象的生命周期
bean在单例模式下,Spring容器启动时解析xml发现该bean标签,直接将对象创建成功并且存入内置的map中保存。此后无论调用多少次getBean()获取该bean属性,都是从map中获取该对象,所以一直是同一个对象。此对象一直被Spring容器持有,直到容器退出时对象才被销毁。
2.6.2 多例模式下bean对象的生命周期
bean在多例模式下,Spring容器启动时解析xml发现该bean标签后,只是将该bean进行管理,并不会创建 对象。此后每次调用getBean()获取该bean时,都会创建一个新的对象,每次都是新的对象。这个对象Spring并不会持有,什么时候销毁取决于使用该对象的用户什么时候销毁对象。
1.7 懒加载机制
所谓的懒加载机制就是可以规定指定的bean不在启动时马上加载,而是在用户真正第一次使用到时才去加载对象。
懒加载机制只对单例bean有作用。对于多例bean设置懒加载没有意义。
局部配置
<bean id="person" class="com.shangma.cn.entity.Person" lazy-init="true"></bean>
全局配置
<?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"
default-lazy-init="true"
>
</beans>