Spring bean 管理 xml bean讲解一

此文为自己整理,自己学习记录文章

 一) bean实例化的方式:

在spring里通过配置文件创建对象

2 bean实例化的三种方式

 1) 使用无参构造反射

       如果类中有参构造。则无参构造被重写不存在 会报错 beanCreationException


 <bean id="userService" class="com.springTest.service.impl.UserService"></bean>


2)使用静态工厂创建

 创建静态的方法 返回类的对象

public class Bean2StaticFactory {

    

public static Bean2 getBean2(){
return new Bean2(); 
}
}

 <!-- 使用静态工厂创建对象-->

      <bean id="bean2" class="com.springTest.bean2.Bean2StaticFactory" factory-method="getBean2"></bean>

3使用实力工厂创建对象



public class Bean3 {
public  Bean2 getBean2(){
return new Bean2();
}

}

   
      <!-- 使用实例化工厂创建对象-->
      <!-- 创建工厂对象 -->
      <bean id="bean3" class="com.springTest.bean2.Bean3" ></bean>

      <bean id="bean3S" factory-bean="bean3" factory-method="getBean2"></bean>


二)bean的作用范围(scope)

bean的作用域

创建一个bean定义,其实质是用该bean定义对应的类来创建真正实例的配方(recipe)”。把bean定义看成一个配方很有意义,它与class很类似,只根据一张处方就可以创建多个实例。

你不仅可以控制注入到对象中的各种依赖和配置值,还可以控制该对象的作用域。这样你可以灵活选择所建对象的作用域,而不必在Java Class级定义作用域。Spring Framework支持五种作用域(其中有三种只能用在基于webSpring ApplicationContext)。

作用域:用于确定Spring创建Bean的实例个数。


1singleton:当一个bean的作用域为singleton, 那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。

注意Singleton作用域是Spring中的缺省作用域。要在XML中将bean定义成singleton,可以这样配置: 

<bean id="empServiceImpl" class="cn.csdn.service.EmpServiceImpl" scope="singleton">

2prototype一个bean定义对应多个对象实例Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。

3request在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例, 它们依据某个bean定义创建而成。该作用域仅在基于webSpring ApplicationContext情形下有效。

考虑下面bean定义:

<bean id="loginAction" class=cn.csdn.LoginAction" scope="request"/>

针对每次HTTP请求,Spring容器会根据loginAction bean定义创建一个全新的LoginAction bean实例, 且该loginAction bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态, 而其他请求中根据loginAction bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。 当处理请求结束,request作用域的bean实例将被销毁。

4session在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于webSpring ApplicationContext情形下有效。

考虑下面bean定义:

<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>

针对某个HTTP SessionSpring容器会根据userPreferences bean定义创建一个全新的userPreferences bean实例, 且该userPreferences bean仅在当前HTTP Session内有效。 与request作用域一样,你可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中根据userPreferences创建的实例, 将不会看到这些特定于某个HTTP Session的状态变化。 当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。

5global session在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于webSpring ApplicationContext情形下有效。

考虑下面bean定义:

<bean id="userPreferences" class="com.foo.UserPreferences" scope="globalSession"/>

global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portletweb应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。

 三  bean的种类

1、普通bean:<bean  id=""  class="A"> ,spring直接创建A实例,并返回。

2、FactoryBean:是一个特殊的bean,具有工厂生成对象的能力,只能生成特定的对象。bean必须使用 FactoryBean接口,此接口提供方法 getObject() 用于获得特定bean。

<bean   id="" class="FB"> 先创建FB实例,使用调用getObject()方法,并返回方法的返回值

FB fb = new FB();

return fb.getObject();

BeanFactory 和 FactoryBean 对比?

BeanFactory:工厂,用于生成任意bean。

FactoryBean:特殊bean,用于生成另一个特定的bean。例如:ProxyFactoryBean ,此工厂bean用于生产代理。

<bean  id=""   class="....ProxyFactoryBean"> 获得代理对象实例,AOP使用。


      

猜你喜欢

转载自blog.csdn.net/qq_36697880/article/details/80821346