首先 bean 属性内容:




scope 属性是干吗用的? 




spring中  beanfactory或者 applicationContext 取得的实例 被默认为singleton,也就是默认每一个bean名称维持一个实例。


scope=singleton 是默认值,通过设置scope=prototype 每次指定名称取得bean时 都会产生一个新得实例。


 singleton="true"




 


factory-method: bean的实例化中 ,默认情况下调用的是 类的默认构造方法,即无参数的构造方法。



例如





<bean id='test' class='dxm.com.test.TestUser'> 这种方式采用的是默认的构造方法,构造TestUser对象



<bean  id='test' class='dxm.com.test.TestUser'   factory-method=‘CreateUser’>     这种方式采用的是CreateUser 方法,构造TestUser对象




init-method:   bean 对象得初始化方法名称




destroy-method:  bean 对象的销毁方法名称



如果所有对象都有相同的 初始化名称,或者销毁名称 ,则可以再 <beans> 上定义 default-init-method="init"  default-destroy-method="destroy"



lazy-init="default" :
lazy-init 
<beans> 
      <bean id="service1" type="bean路径" lazy-init="true"/> 
      <bean id="service2" type="bean路径" lazy-init="false"> 
             <property name="service1" ref="service1"/> 
      </bean> 
</beans> 
以上两个bean,一个lazy-init属性为true,一个为false,由什么区别呢 
当 IoC容器启动时,service2会实例化,而service1则不会;但是但容器实例化service2时,service1也被实例化了,为什么呢,因为service2需要它。也就是说lazy-init="true"的bean,IoC容器启动时不会实例化该bean,只有当容器需要用到时才实例化它。lazy-init有利于容器效率,对于不需要的bean可以先不管。
abstract="true"
<bean id="baseTxService" 
          class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" 
       abstract="true"> 
            …… 
</bean> 
bean abstract="true"时,该bean不会被实例化,上面的bean是个模板
default-lazy-init="true": spring的容器是提供了lazy-load的,即默认的缺省设置是bean没有lazy-load,该属性处于false状态,这样导致spring在启动过程导致在启动时候,会默认加载整个对象实例图,从初始化ACTION配置、到service配置到dao配置、乃至到数据库连接、事务等等。
这么庞大的规模,难怪spring的启动时间要花将近1分钟。尝试了一下,把beans的default-lazy-init改为true就,再次启动,速度从原来的55秒,降到8秒钟!!Great!虽然是非常小一个改动,但是影响确实非常大。
这样做只是为了在开发过程中节约启动时间,在部署到实际环境中,倒是没必要设置default-lazy-init为true。毕竟部署到实际环境中不是经常的事,每次启动1分钟倒不是大问题,而且可以提高服务器效率。
parent="TestUser" :表示继承,继承父类的设置



depends-on="TestUser": 在实例化bean之前 如果依赖于另一个bean ,那么spring就会先去实例化被依赖的bean 并进行依赖注入,如果某个bean在生成之前要求另外一个bean先被实例,则可以指定depends-on 属性来设置 ,如果有两个以上的bean 要设置在depends-on中 用逗号隔开。



l例如:<bean id="service1" type="bean路径"   depends-on="TestUser"/>

autowire="byType":


autowire="autodetect"
autowire="constructor"
dependency-check="default": 检查某些依赖关系是否确立。
dependency-check="simple"
dependency-check="objects"
dependency-check="all"
dependency-check="none" :  none 是默认值





首先 bean 属性内容:






scope 属性是干吗用的? 






spring中  beanfactory或者 applicationContext 取得的实例 被默认为singleton,也就是默认每一个bean名称维持一个实例。



scope=singleton 是默认值,通过设置scope=prototype 每次指定名称取得bean时 都会产生一个新得实例。



 singleton="true"



可以利用容器的scope="prototype"来保证每一个请求有一个单独的Action来处理, 避免struts中Action的线程安全问题。这句话怎么理解呢如果用单例方式会有什么样的结果呢???



spring 默认scope 是单例模式
这样只会创建一个Action对象,每次访问都是同一个Action对象,数据不安全
struts2 是要求 每次次访问 都对应不同的Action , scope="prototype" 可以保证 当有请求的时候 都创建一个Action对象




factory-method: bean的实例化中 ,默认情况下调用的是 类的默认构造方法,即无参数的构造方法。



例如





<bean id='test' class='dxm.com.test.TestUser'> 这种方式采用的是默认的构造方法,构造TestUser对象



<bean  id='test' class='dxm.com.test.TestUser'   factory-method=‘CreateUser’>     这种方式采用的是CreateUser 方法,构造TestUser对象




init-method:   bean 对象得初始化方法名称
destroy-method:  bean 对象的销毁方法名称



如果所有对象都有相同的 初始化名称,或者销毁名称 ,则可以再 <beans> 上定义 default-init-method="init"  default-destroy-method="destroy"



lazy-init="default" :
lazy-init 
<beans> 
      <bean id="service1" type="bean路径" lazy-init="true"/> 
      <bean id="service2" type="bean路径" lazy-init="false"> 
             <property name="service1" ref="service1"/> 
      </bean> 
</beans> 
以上两个bean,一个lazy-init属性为true,一个为false,由什么区别呢 
当 IoC容器启动时,service2会实例化,而service1则不会;但是但容器实例化service2时,service1也被实例化了,为什么呢,因为service2需要它。也就是说lazy-init="true"的bean,IoC容器启动时不会实例化该bean,只有当容器需要用到时才实例化它。lazy-init有利于容器效率,对于不需要的bean可以先不管。
abstract="true"
<bean id="baseTxService" 
          class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" 
       abstract="true"> 
            …… 
</bean> 
bean abstract="true"时,该bean不会被实例化,上面的bean是个模板
default-lazy-init="true": spring的容器是提供了lazy-load的,即默认的缺省设置是bean没有lazy-load,该属性处于false状态,这样导致spring在启动过程导致在启动时候,会默认加载整个对象实例图,从初始化ACTION配置、到service配置到dao配置、乃至到数据库连接、事务等等。
这么庞大的规模,难怪spring的启动时间要花将近1分钟。尝试了一下,把beans的default-lazy-init改为true就,再次启动,速度从原来的55秒,降到8秒钟!!Great!虽然是非常小一个改动,但是影响确实非常大。
这样做只是为了在开发过程中节约启动时间,在部署到实际环境中,倒是没必要设置default-lazy-init为true。毕竟部署到实际环境中不是经常的事,每次启动1分钟倒不是大问题,而且可以提高服务器效率。
parent="TestUser" :表示继承,继承父类的设置



depends-on="TestUser": 在实例化bean之前 如果依赖于另一个bean ,那么spring就会先去实例化被依赖的bean 并进行依赖注入,如果某个bean在生成之前要求另外一个bean先被实例,则可以指定depends-on 属性来设置 ,如果有两个以上的bean 要设置在depends-on中 用逗号隔开。



l例如:<bean id="service1" type="bean路径"   depends-on="TestUser"/>

autowire="byType":


autowire="autodetect"
autowire="constructor"
dependency-check="default": 检查某些依赖关系是否确立。
dependency-check="simple"
dependency-check="objects"
dependency-check="all"
dependency-check="none" :  none 是默认值