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,对此会报错,冲突了
-
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>