Spring学习笔记

来源:互联网 发布:编程流程图 编辑:程序博客网 时间:2024/06/06 01:43
 Spring配置文件结构一般如下:
<beans>
     <!--导入其他xml文件-->
     <import resource="resources1.xml" /> 
     <import resource="resources2.xml/>  

    <!--bean注入-->
    <bean id="bean1" class="****"></bean>
 
   <bean name="bean2" class="****"></bean>
    
 <!--bean取个别名-->
     <alias alias="bean3" name="bean2" /> 

</beans> 

Spring bean的命名:
1)配置全限定类名,唯一(就是说在bean注册里面的class必须只有一个)
2)指定id,唯一 
(就是说在bean注册里面的id必须只有一个
3)指定name,唯一 
(就是说在bean注册里面的name必须只有一个
4)同时指定id和name,但他们也必须唯一 
5)指定多个name,其中第一个是标识符(相当于id),后面都是别名,他们用分号(“;”)或逗号(",")隔开,每一个name都唯一 
6)指定别名,使用
alias标签,唯一[<aliasname="wwjd"alias="bean4"></alias>]

example:
<?xml version="1.0"encoding="ISO-8859-1"?>

<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.xsd ">
    <bean class="com.dao.WwjdImpl"></bean>
    <bean id="wwjd"class="com.dao.WwjdImpl"></bean>
    <bean name="wwjdByName"class="com.dao.WwjdImpl"></bean>
    <bean name="bean1;bean2;bean3"class="com.dao.WwjdImpl"></bean>
    <alias name="wwjd"alias="bean4"></aliasb>
</beans>  

spring bean 实例化 
1)使用构造器实例化bean
      构造器实例化Bean是最简单的方式,Spring IoC容器既能使用默认的空构造器也能使用有参数构造器两种方式创建Bean,如以下方式指定要创建的Bean类型:
     1.空构造器实例化:
          
<beanid="wwjd"class="com.dao.spring_slh.WwjdImpl"/>

     2.有参数构造器实例化:

        <bean id="wwjdwitharg"class="com.dao.spring_slh.WwjdImpl">
            <!--指定构造器参数-->
            <constructor-argindex="0"value="天下孰为尊,唯独破天元!"type="java.lang.String"/>
        </bean>

2)使用静态工厂方式实例化bean
     使用静态工厂的方式除了指定必须的class属性,还要指定factory-method属性来指定实例化bean的方法(需要加static),而且使用静态工厂方法也允许指定方法参数,Spring IOC容器将调用此属性指定的方法来获取Bean,配置如下:
        
<bean id="wwjdInstanceFactory"class="com.dao.spring_slh.WwjdStaticFactory"factory-method="newInstance">
                <constructor-arg index="0"value="我相信的我绝不质疑!"></constructor-arg>
        </bean>

3)使用实例工厂方法实例化bean 
      使用实例工厂方式不能指定class属性,此时必须使用factory-bean属性来指定工厂Bean,factory-method属性指定实例化Bean方法(不能加static),而且实例工厂方法允许指定方法参数,方式和使用构造器方式一样,配置如下:
     
<!--定义实例工厂bean-->
        <beanid="wwjdInstanceFactory"class="com.dao.spring_slh.WwjdInstanceFactory"/>
<!--使用实例工厂bean创建bean-->
        
<bean id="wwjdInstance"factory-bean="wwjdInstanceFactory"factory-method="instance">
                <constructor-arg index="0"value="为辅则忠,为主则淡。我的世界既不黑也不白只是一道精致的灰。"></constructor-arg>
        </bean>

spring bean作用域

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

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

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">


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

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


3
request在一次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实例将被销毁。


4
session在一个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也会被废弃掉。


5
global 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的生命周期范围内。
 

        请注意假如你在编写一个标准的基于Servletweb应用,并且定义了一个或多个具有global session作用域的bean,系统会使用标准的HTTP Session作用域,并且不会引起任何错误。 




原创粉丝点击