-
IOC(Inversion of Control)
类与类之间的依赖和创建关系不再由自己负责,而是由一个容器去创建实例并管理实例与实例之间的关系。
有以下注意几点:
1.默认情况下,一个ID被获取bean只会产生一个对象
2.同一个类可以配置多个不同的ID
3.对于配置多个不同ID,在编译时没有问题,运行时报错
4.对于容器的getBean方法,可以是ID作为string参数获取object对象(需要强转),或者相应类对象作为class参数获取
对应对象,如果在配置文件配置多个相同的类,并类对象作为参数获取运行时会报错 -
spring创建对象的四种方式
1.通过类的无参构造创建
最普通的创建方式,基本格式,要求此类必须有无参构造,因为是利用反射产生的,利用object o = 类名.class.newInstance()产生,此方法只能创建有无参构造的类实例。2.通过静态工厂创建
对于一些没有无参构造和抽象类,是无法用上面方式创建。
public class PersonStaticFactory{
public static Person getPerson(){
return new Person(T t);
}
}
<bean id="person" class= "com.domian.PersonStaticFactory" factory-method="getPerson">
3.利用实例工厂创建
与静态工厂十分类似,不同的是不再是静态方法,所以必须先获得工厂自身实例。
public class Factory{
public Person getPerson(){
return new Person(T t);
}
}
<bean id="factory" class="com.domian.Factory" >
<bean id="person" factory-bean="factory" factory-method="getPerson">
4.利用spring内置工厂接口创建
实现spring自带接口FactoryBean
public class PersonFactory implements FactoryBean<Person>{
@Override
public Person getObject() throws Exception {
// 获取具体对象
return new Person();
}
@Override
public Class<?> getObjectType() {
// 获取对象的类对象
return null;
}
@Override
public boolean isSingleton() {
// 是否是单例
return false;
}
}
<bean id="person" class="IOC.factory.PersonFactory"></bean>
- 单例和多例
默认情况下,spring是单例模式,无论利用ID获取多少次对象都是同一个对象,单例模式下,在容器初始化的时候,会对每一个bean进行创建,可以设置为懒加载来避免加载的时候就创建了过多的无用对象。
设置属性scope=“prototype”变成多例模式,每个bean若不想是单例模式都需自身配置Scope属性,即创建方式,还有session和request方式。
<bean id="person" class="IOC.Person" scope="prototype"></bean>
多例模式下不会在初始化容器时就创建对象,会在什么时候调用相应的getbean方法获取对象时,创建对象。
- 懒加载
因为spring容器默认是以单例模式创建对象,会在容器一初始化就自动创建配置的bean对象们。如果这些对象没有使用就浪费内存和时间了,所以有了懒加载机制,开启懒加载机制并不会在容器一初始化就创建bean对象,而是和多例模式下的bean对象一样,在调用相应的getbean方法时创建。
<bean id="person" class="IOC.Person" lazy-init="true"></bean>
<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-3.2.xsd "
default-lazy-init="true"> ----------------------//使得整个容器的所有bean都是懒加载
- 配置bean对象的初始化和销毁方法
对于某些bean在被初始化之后和被销毁之前需要实现某些功能。可以如下方法中完成操作。
<bean id="person" class="IOC.Person" init-method="drink" destroy-method="eat"></bean>
在此配置例子中会在掉用getbean(“person”)创建对象后调用drink方法,在调用close方法(ApplicationContext接口没有此方法,可以直接指定其实现类ClassPathXmlApplicatonContext)销毁person这个bean之前掉用eat方法。