1.spring中,bean默认是单例模式singleton。默认加载为lazy-load .
2.lazy-load的时候,bean工厂会把定义信息载入进来,不过仅在显式调用的时候才会去实例化。在spring中配置一个quartz定时任务器的时候,用到了下面的配置:一开始没有把“sfactory”显示的指明为立即加载,导致任务跑不起来。
3.bean的加载过程:
1)容器寻找Bean的定义信息,并且将其实例化。
2)使用依赖注入,Spring按照Bean的定义信息配置Bean的所有属性。
3)如果实现了BeanNameAware接口,工厂会调用Bean的setBeanName()传给Bean的ID
4)如果实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身
5)如果有BeanPostProcessor和Bean关联,那么它们的postProcessBeforeInitialzation()会被调用。
6)如果Bean指定了init-method方法,将被调用。
7)如果有BeanPostProcessor和Bean关联,那么它们的postProcessAfterInitialzation()会被调用。
bean的销毁:
1)可以实现DisposableBean接口
2)配置bean时候指定定制的销毁方法。
2.lazy-load的时候,bean工厂会把定义信息载入进来,不过仅在显式调用的时候才会去实例化。在spring中配置一个quartz定时任务器的时候,用到了下面的配置:一开始没有把“sfactory”显示的指明为立即加载,导致任务跑不起来。
<?
xml version="1.0" encoding="UTF-8"
?>
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
< beans default-lazy-init ="true" >
<!-- spring调度工厂 -->
< bean id ="sfactory"
class ="org.springframework.scheduling.quartz.SchedulerFactoryBean"
singleton ="true" lazy-init ="false" >
< property name ="triggers" >
< list >
< ref local ="cronTrigger" />
</ list >
</ property >
</ bean >
<!-- spring触发trigger -->
< bean id ="cronTrigger"
class ="org.springframework.scheduling.quartz.CronTriggerBean" >
< property name ="jobDetail" >
< ref bean ="exampleJob" />
</ property >
< property name ="cronExpression" >
<!-- run every morning at 6 am -->
< value > 0 0 03 * * ? </ value >
</ property >
</ bean >
<!-- 任务实现类 -->
< bean name ="exampleJob"
class ="org.springframework.scheduling.quartz.JobDetailBean" >
< property name ="jobClass" >
< value > com.decentsoft.smmail.mail.task.TrashCatalogClearTask </ value >
</ property >
< property name ="jobDataAsMap" >
< map >
< entry key ="mailOperationService" >
< ref bean ="mailOperationService" ></ ref >
</ entry >
</ map >
</ property >
</ bean >
</ beans >
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
< beans default-lazy-init ="true" >
<!-- spring调度工厂 -->
< bean id ="sfactory"
class ="org.springframework.scheduling.quartz.SchedulerFactoryBean"
singleton ="true" lazy-init ="false" >
< property name ="triggers" >
< list >
< ref local ="cronTrigger" />
</ list >
</ property >
</ bean >
<!-- spring触发trigger -->
< bean id ="cronTrigger"
class ="org.springframework.scheduling.quartz.CronTriggerBean" >
< property name ="jobDetail" >
< ref bean ="exampleJob" />
</ property >
< property name ="cronExpression" >
<!-- run every morning at 6 am -->
< value > 0 0 03 * * ? </ value >
</ property >
</ bean >
<!-- 任务实现类 -->
< bean name ="exampleJob"
class ="org.springframework.scheduling.quartz.JobDetailBean" >
< property name ="jobClass" >
< value > com.decentsoft.smmail.mail.task.TrashCatalogClearTask </ value >
</ property >
< property name ="jobDataAsMap" >
< map >
< entry key ="mailOperationService" >
< ref bean ="mailOperationService" ></ ref >
</ entry >
</ map >
</ property >
</ bean >
</ beans >
3.bean的加载过程:
1)容器寻找Bean的定义信息,并且将其实例化。
2)使用依赖注入,Spring按照Bean的定义信息配置Bean的所有属性。
3)如果实现了BeanNameAware接口,工厂会调用Bean的setBeanName()传给Bean的ID
4)如果实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身
5)如果有BeanPostProcessor和Bean关联,那么它们的postProcessBeforeInitialzation()会被调用。
6)如果Bean指定了init-method方法,将被调用。
7)如果有BeanPostProcessor和Bean关联,那么它们的postProcessAfterInitialzation()会被调用。
bean的销毁:
1)可以实现DisposableBean接口
2)配置bean时候指定定制的销毁方法。