spring:
DI:依赖注入
IOC反转控制
在依赖注入模式下,被调用者将不是由调用者创建(反转控制),创建被调用者的实例工作通常是由Spring容器来完成,然后注入调用者,所有称为依赖注入
静态工厂Bean:使用静态工厂返回Bean时其容器调用getBean返回的并不是工厂实例本身而是工厂生产的Bean实例,从配置上来看,需要在Bean标签中追加
一个factory-method来指定一个工厂中返回Bean的调用的静态方法,如果静态方法中有参数,通过constructor-arg为之传入
lazy-init指定是否延迟加载,及在调用时才实例
A、scope=prototype:
该值使容器总是延迟实例化该Bean对象,且在应用层调用getBean方法时将直接
调用底层工厂方法获取Bean对象并返回该Bean对象到调用层
B、scope= singleton:
该值使Spring容器首先检查lazy-init属性是否为false,如果为false则在
Spring容器启动时实例化Bean对象并以当前BID为键,Bean对象作为值推入
Spring容器中;如果为true则Spring容器将Bean的实例化过程延迟到应用层调用
getBean时发生
小结:
应用层调用getBean方法时首先检查将要获取的Bean是否为原型Bean,如果是原型
Bean则直接调用底层工厂创建一个新的Bean实例返回;如果获取的Bean不是原型
Bean则检查容器中是否存在该BID(Bean ID)对应的Bean对象,如果有则直接从容
器中返回,如果没有则调用底层工厂方法获取Bean对象同时以当前BID为键,Bean
对象作为值推入Spring容器中(便于下次getBean时直接从容器返回),最后返回这
个Bean对象到调用层
使用实例工厂返回Bean对象需要单独定义一个工厂的Bean实例,在另一个工厂配
置中使用factory-bean属性指向真实的工厂类实例,使用factory-method指向真
实工厂实例的实例工厂方法(类同于静态工厂,其访问权限不受限制)
public class StaticFactory {
public IGroup getGroup(String groupType){ //改为实例方法
if("group".equalsIgnoreCase(groupType)){
return new Group();
}else{
return new CGlass();
}
}
}
注意:
创建实例工厂时,其工厂方法必须是实例方法,不能是静态方法
<!—配置工厂类Bean-->
<bean id=“factory" class="com.scxh.factory.StaticFactory"/>
<!—配置实例工厂-->
<bean id="group" factory-bean="factory" factory-method="getGroup">
<constructor-arg value="group"/>
</bean>
注意:
1、这里没有指定lazy-init和scope两个属性,在没有指定这两个属性时,他们默认值分别是
false和singleton
2、 constructor-arg用于为StaticFactory类中的实例方法getGroup注入参数,property
标签则为返回的产品实例注入参数
3、实例工厂方法的访问权限不受限制(可以为private),Spring底层自动使用反射破解权限
封装进行调用
注意:
子标签property不是为工厂类StaticFactory实例注入参数而是为getGroup方法返回的产品实例注入参数
Bean的生命周期:
原型bean不是由spring容器管理,它是由java虚拟机管理
单例bean是有spring容器管理,spring容器负责实例化并跟踪和管理Bean的行为和生命周期
在Bean的配置中有两个属性可以用于附加生命周期行为,他们是:
init-method:在Bean的所有属性注入完成之后调用该属性指向的Bean类中的方法
destory-method:在Bean对象被销毁之前调用该属性指向的Bean类中的方法
在使用destory-method属性时为确保Spring在销毁单例Bean之前不至于强行切断进程导致该属性指定的方法无从调用,我们可以为Spring上下文注册一个关闭事件,这时使用的Spring上下文类型是AbstractApplicationContext:
AbstractApplicationContext context=new ClassPathXmlApplicationContext("./beans.xml");
context. registerShutdownHook();
init-method和destory-method两个方法可以指向静态方法
注:
可以通过将Bean实现InitializingBean和DisposableBean接口来分别完成init-method和destory-method两个属性的行为,此时Bean类中就不再需要单独定义初始化和销毁的方法了,直接实现相应接口中的方法即可,Spring在Bean的初始化完成之后和Bean的销毁之前默认回调接口中被重写的方法, DisposableBean接口仍然需要注册上下文关闭事件
使用接口的方式并不被推荐,因为它是强侵入式的,不便于灵活配置,如果同时使用了实现接口和配置,则Spring优先调用接口中的方法再调用配置中指定的方法
工厂Bean:自定义的工厂Bean类必须实现FactoryBean接口
<bean id="factory" class="com.scxh.factory.PersonFactory">
<property name="singleton" value="false"/>
<property name="classType" value="com.scxh.bean.Group"/>
</bean>
注意:
1、此处的property子标签为工厂Bean实例注入依赖,而不是为生产的产品注入依赖,这与静
态和实例工厂不相同
2、如果Bean类中有布尔逻辑类型则注入依赖时必须是true或false值,Spring采用如下方式
完成字串类型到布尔类型的转换:
Boolean.parseBoolean(s)
在Bean中获取BID:如果需要获取当前Bean的ID属性值可以使Bean类实现BeanNameAware接口
在Bean中获取Spring容器:如果需要获取当前Bean所在的Spring容器可以使Bean类实现ApplicationContextAware接口
DI:依赖注入
IOC反转控制
在依赖注入模式下,被调用者将不是由调用者创建(反转控制),创建被调用者的实例工作通常是由Spring容器来完成,然后注入调用者,所有称为依赖注入
静态工厂Bean:使用静态工厂返回Bean时其容器调用getBean返回的并不是工厂实例本身而是工厂生产的Bean实例,从配置上来看,需要在Bean标签中追加
一个factory-method来指定一个工厂中返回Bean的调用的静态方法,如果静态方法中有参数,通过constructor-arg为之传入
lazy-init指定是否延迟加载,及在调用时才实例
A、scope=prototype:
该值使容器总是延迟实例化该Bean对象,且在应用层调用getBean方法时将直接
调用底层工厂方法获取Bean对象并返回该Bean对象到调用层
B、scope= singleton:
该值使Spring容器首先检查lazy-init属性是否为false,如果为false则在
Spring容器启动时实例化Bean对象并以当前BID为键,Bean对象作为值推入
Spring容器中;如果为true则Spring容器将Bean的实例化过程延迟到应用层调用
getBean时发生
小结:
应用层调用getBean方法时首先检查将要获取的Bean是否为原型Bean,如果是原型
Bean则直接调用底层工厂创建一个新的Bean实例返回;如果获取的Bean不是原型
Bean则检查容器中是否存在该BID(Bean ID)对应的Bean对象,如果有则直接从容
器中返回,如果没有则调用底层工厂方法获取Bean对象同时以当前BID为键,Bean
对象作为值推入Spring容器中(便于下次getBean时直接从容器返回),最后返回这
个Bean对象到调用层
使用实例工厂返回Bean对象需要单独定义一个工厂的Bean实例,在另一个工厂配
置中使用factory-bean属性指向真实的工厂类实例,使用factory-method指向真
实工厂实例的实例工厂方法(类同于静态工厂,其访问权限不受限制)
public class StaticFactory {
public IGroup getGroup(String groupType){ //改为实例方法
if("group".equalsIgnoreCase(groupType)){
return new Group();
}else{
return new CGlass();
}
}
}
注意:
创建实例工厂时,其工厂方法必须是实例方法,不能是静态方法
<!—配置工厂类Bean-->
<bean id=“factory" class="com.scxh.factory.StaticFactory"/>
<!—配置实例工厂-->
<bean id="group" factory-bean="factory" factory-method="getGroup">
<constructor-arg value="group"/>
</bean>
注意:
1、这里没有指定lazy-init和scope两个属性,在没有指定这两个属性时,他们默认值分别是
false和singleton
2、 constructor-arg用于为StaticFactory类中的实例方法getGroup注入参数,property
标签则为返回的产品实例注入参数
3、实例工厂方法的访问权限不受限制(可以为private),Spring底层自动使用反射破解权限
封装进行调用
注意:
子标签property不是为工厂类StaticFactory实例注入参数而是为getGroup方法返回的产品实例注入参数
Bean的生命周期:
原型bean不是由spring容器管理,它是由java虚拟机管理
单例bean是有spring容器管理,spring容器负责实例化并跟踪和管理Bean的行为和生命周期
在Bean的配置中有两个属性可以用于附加生命周期行为,他们是:
init-method:在Bean的所有属性注入完成之后调用该属性指向的Bean类中的方法
destory-method:在Bean对象被销毁之前调用该属性指向的Bean类中的方法
在使用destory-method属性时为确保Spring在销毁单例Bean之前不至于强行切断进程导致该属性指定的方法无从调用,我们可以为Spring上下文注册一个关闭事件,这时使用的Spring上下文类型是AbstractApplicationContext:
AbstractApplicationContext context=new ClassPathXmlApplicationContext("./beans.xml");
context. registerShutdownHook();
init-method和destory-method两个方法可以指向静态方法
注:
可以通过将Bean实现InitializingBean和DisposableBean接口来分别完成init-method和destory-method两个属性的行为,此时Bean类中就不再需要单独定义初始化和销毁的方法了,直接实现相应接口中的方法即可,Spring在Bean的初始化完成之后和Bean的销毁之前默认回调接口中被重写的方法, DisposableBean接口仍然需要注册上下文关闭事件
使用接口的方式并不被推荐,因为它是强侵入式的,不便于灵活配置,如果同时使用了实现接口和配置,则Spring优先调用接口中的方法再调用配置中指定的方法
工厂Bean:自定义的工厂Bean类必须实现FactoryBean接口
<bean id="factory" class="com.scxh.factory.PersonFactory">
<property name="singleton" value="false"/>
<property name="classType" value="com.scxh.bean.Group"/>
</bean>
注意:
1、此处的property子标签为工厂Bean实例注入依赖,而不是为生产的产品注入依赖,这与静
态和实例工厂不相同
2、如果Bean类中有布尔逻辑类型则注入依赖时必须是true或false值,Spring采用如下方式
完成字串类型到布尔类型的转换:
Boolean.parseBoolean(s)
在Bean中获取BID:如果需要获取当前Bean的ID属性值可以使Bean类实现BeanNameAware接口
在Bean中获取Spring容器:如果需要获取当前Bean所在的Spring容器可以使Bean类实现ApplicationContextAware接口