Spring神经元(第四根)

112 阅读4分钟

Bean的作用域

singleton :单例模式,在整个IOC容器中,singleton 作用域的bean只生成一次

prototype: 每次通过容器的getbean()方法获取prototype作用域的Bean,都将生成一个新的Bean实例

request:对于一次HTTP请求,request作用域的Bean只有生成一个实例。这意味着在同一次HTTP请求内,程序每次请求该Bean,得到的总是一个实例,只有在WEB应用中使用Spring时,该作用域才真正有效

session: 对于一次HTTP会话,session 作用域的Bean只生成- 个实例。这意味着在同一次HTTP会话内,程序每次请求该Bean,得到的总是同一个实例。只有在Web应用中使用Spring时,该作用域才真正有效。

application: 对应整个Web应用,该Bean只生成个实例。 这意味着在整个Web应用内,程序每次请求该Bean,得到的总是同一个实例。只有在Web应用中使用Sring时,该作用域才真正有效。

websocket:在整个WebSocket的通信过程中,该Bean只生成一个实例。 只有在Web应用中使用Spring时,该作用域才真正有效。

比较常用的是singleton 和prototype 两种作用域,对于singleton 作用域的Bean,每次请求该Bean都将获得相同的实例。容器负责跟踪Bean实例的状态,负责维护Bean实例的生命周期行为:如果一个Bean被设置成prototype作用域,程序每次请求该id的Bean, Spring 都会新建一个 Bean实例,然后返回给程序。在这种情况下,Spring 容器仅仅使用new关键字创建Bean实例,一旦创建成功,容器就不再跟踪实例,也不会维护Bean实例的状态。

Spring本质进阶及p和c命名空间的简化配置

实例

<?xml version="1.0" encoding="UTF-8"?>  
//注意p和c
<beans xmlns:p="http://www.springframework.org/schema/p"  
       xmlns:c="http://www.springframework.org/schema/c"  
       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.example.ssm.day3.FkListener"/>  
  
    <bean id="dog" class="com.example.ssm.day4.Dog" name="^_^">  
        <constructor-arg value="2"/>  
        <!--去掉set方法的set前缀,name是属性名字-->  
        <property name="name" value="旺财"/>  
    </bean>  
    <bean id="dog1" class="com.example.ssm.day4.Dog" scope="prototype"  
        c:_0 = "2" p:name = "66666"/>  
  
    <!--p:后面的东西是受setter方法控制的(setter去掉set前缀、首字母小写)-->  
    <bean id = "person" class="com.example.ssm.day4.Person"  
          p:dg-ref="dog"/>  
    <!--专门取别名-->  
    <alias name="dog" alias="*dog*"/>  
    <!--  
    testBean => new com.example.ssm.day3.TestBean()    testBean.setApplicationContext(容器本身)  
    -->    <bean id="testBean" class="com.example.ssm.day4.TestBean"/>  
    <!--默认是singleton-->  
    <bean id="date" class="java.util.Date" scope="prototype"/>  
    <!--现在不是singleton了-->  
</beans>

嵌套Bean

它的配置非常简单,只是将原有的<bean ... />放在<property. .. />或<constructor-arg... />的里面。 <bean...>这样该Bean创建对象将只作为setter方法

<!--嵌套-->  
<bean id="person1" class="com.example.ssm.day4.Person">  
    <property name="dg">  
    <--该bean只作为参-->
        <bean id="dog1" class="com.example.ssm.day4.Dog" scope="prototype"  
              c:_0 = "2" p:name = "66666"/>  
    </property></bean>
    

自动装配

所谓自动装配,就是让容器根据某种规则,自动完成依赖注入(调用setter或有参数的构造器)。spring的自动装配可通过<beans. .. />元素的defaul t-autowire属性指定,也 可通过<bean. .. />元素的autowire属性指定。 通常来手,bean元素中包含*xx属性,那么在beans元素中就会包含defaul t-xxx属性 在beans元素.上指定的属性,将会对容器中所有的bean都起作用。全 局作用。 在bean元素上指定的属性,只对当前bean都起作用。局部作用。 当bean元素指定的xxx属性与beans,上指定的defaul t-xxx属性值互相冲突时,bean元素上指定的属性取胜。

自动装配可以减少配置文件的工作量,但降低了依赖关系的透明性和清晰性。 autowire属性可以接受如下值:

  • no:不使用自动装配。Bean依赖必须通过ref元素定义。这是默认的配置。

  • byNane: 根据setter方法名来自动装配。 BeanFactory查我容器中全部Bean,找出其中i d属性与setter方法名去掉set前缀后同名的Bean来完成注入。 如果没有找到匹配的Bean实例,则Spring不会进行任何注入,也不报错。

  • byType:根据setter方法形参类型来自动装配。BeanF actory查找容器中全部Bean, 如果正好有一个Bean类型与setter形参类型匹配,就自动注入这个Bean; 如果有多个这样的Bean就抛出一个异常! 如果没有匹配的Bean,则Spring不会进行任何注 入。如果没有找到匹配的Bean实例,则Spring不会进行任何注入, 也不报错误, id 需要和set方法的参数对应上

<bean id="dog" class="com.example.ssm.day4.NewDog"  
      p:name="Mzmz"/>  
<!-- byType 策略:  
BeanFactory查找容器中全部Bean,找出其中类型为Dog的Bean来完成注入。  
setDg (Dog dog)-->  
<bean id="person" class="com.example.ssm.day4.Person" autowire="byType"/>  
<bean id="dd" class="com.example.ssm.day4.OldDog"  
     p:age="12"/>

这里的Dog是接口,实现类有NewDog和OldDog,对此会报错,冲突了

image.png

  • coconstructor: 与byType类似, 区别是用于构造注入的参数。如果BeanFactory中不是恰好有一一个Bean与构造器参数类型相同,则会

  • autodetect: BeanF actory根据Bean内部结构,决定使用constructor或byType. 如果找到-一个默认的无参构造器,那么就会应用byType。

  • aut owi re-candi date: 如果你将该属性设为false,意味着该bean将被排除在自动装配的候选者之外。

<!--dd的Bean放弃作为依赖-->  
<bean id="dd" class="com.example.ssm.day4.OldDog" autowire-candidate="false"  
     p:age="12"/>

注入容器(集合)类型的属性

  • List/Array list元素用于构建List集合或数组
  • Set: set元素用于构建set操合或数组
  • map :它包含每个entry子元素配置- -个key-value对。
  • Properties Properties是Hasht able的子类。Hashtable是Map接口的实现类,本质上Properties也是- -个Iap集合。 Properties相当于是一-个key value都是String的Map集合。 很方便读取文件
<bean id="person1" class="com.example.ssm.day4.xia.Person"  
      c:_0="Mzmz" p:age="500">  
  
  
    <!--private String[] nick-->  
    <property name="nick">  
        <list>            <!--String 类型-->  
            <value>Mzmz</value>  
            <value>WZwz</value>  
            <value>HZHz</value>  
        </list>    </property>    <property name="school">  
        <list>            <value>小</value>  
            <value>初</value>  
            <value>高</value>  
        </list>    </property>    <!--private Set items;-->  
    <property name="items">  
        <set>            <!--没有泛型限制,可以位任意类型-->  
            <value>wuhu</value>  
            <ref bean="dog"/>  
            <!--嵌套bean-->  
            <bean class="com.example.ssm.day4.NewDog" p:name="八嘎"/>  
            <value type="int">20</value>  
            <!--set嵌套list-->  
            <list>  
                <value>12</value>  
            </list>        </set>    </property>  
    <!--    private Map<String, Double> scores;-->  
    <property name="scores">  
        <map>            
            <entry key="语文" value="70"/>  
            <entry key="数学" value="66"/>  
        </map>    
    </property>  
    <!--    private Properties health;-->  
    <property name="health">  
        <props>            
            <prop key="我">Mzmz</prop>  
            <prop key="你">Wzwz</prop>  
        </props>    
        </property>
   </bean>