Spring 是什么
Spring = IOC (DI) + AOP
IOC 反转控制 DI 依赖注入 AOP 面向切面编程
spring的特性:
1 轻量级
2 依赖注入
3 AOP
4 容器 spring是一个容器 它包含并管理了应用对象的生命周期
5 框架 xml+java注解
6 一站式
IOC 思想 : 反转资源获取的方向
传统的资源查找方式 要求组件向容器发起请求查找资源 ,作为回应,容器适时地返回资源
IOC 容器主动地将资源推送给它所管理的组件。组件所要做的仅仅是选择一种合适方式来接收资源 这种行为也被称为查找的被动形式
DI 组件以一些预先定义好的方式 (比如说setter方法) 接收来自容器的资源注入
IOC 前生 : 分离接口与实现 采用工厂设计模式 采用反转控制
IOC 容器类型:
1 ApplicationContext 是BeanFactory的子接口 提供了更多的特性 面向spring框架的开发者 ,几乎所有的场合都在直接使用applicationContext 而非底层的BeanFactory
2 BeanFactory IOC 容器最基本的实现 是Spring框架的基础设施,面向的是spring本身 (了解)
ApplicationContext 的主要实现类:
ClassPathXmlApplicationContext 从类路径下加载配置文件、
FileSystemXmlApplicationContext 从文件系统中加载配置文件
ConfigurableApplicationContext
新增加了两个方法 refresh() 和close()
使ApplicationContext 具有启动 刷新和关闭上下文的能力
WebApplicationContext 为web应用准备 它允许从相对于web根目录的路径中完成初始化工作
Spring 支持3中依赖注入的方式:
1.属性注入:
注意: 当使用属性注入时, 类中 必须有一个无参的构造器
<!-- 配置bean
id: 标示容器中bean id 必须是唯一的 id 也可以指定多个名字 名字之间可以用逗号 分号 或者是空格分隔
class: bean 的全类名 通过全类名配置的方式也叫反射配置
-->
<bean id="helloWorld" class="com.neuedu.spring.beans.HelloWorld">
<!-- 属性注入 -->
<property name="name1" value="wangwu"></property>
</bean>
2.构造器注入
<!-- 构造器注入 -->
<bean id="helloWorld2" class="com.neuedu.spring.beans.HelloWorld">
<!-- 构造器注入使用 constructor-arg 没有name 只有value-->
<constructor-arg value="zhangsan"></constructor-arg>
</bean>
<!-- 当bean的构造方法有多个参数时 默认按照顺序去加载 -->
<bean id="car" class="com.neuedu.spring.beans.Car">
<constructor-arg value="Audi"></constructor-arg>
<constructor-arg value="Shanghai"></constructor-arg>
<constructor-arg value="1000000"></constructor-arg>
</bean>
<!-- 可以通过类型区分构造器参数 -->
<bean id="car2" class="com.neuedu.spring.beans.Car">
<constructor-arg value="Audi"></constructor-arg>
<constructor-arg value="Shanghai"></constructor-arg>
<constructor-arg value="260" type="int"></constructor-arg>
</bean>
<!-- 可以通过index 去精确定位参数 index="" value="" 必须有双引号包裹 -->
<bean id="car3" class="com.neuedu.spring.beans.Car">
<constructor-arg value="Audi" index="1"></constructor-arg>
<constructor-arg value="Shanghai" index="0"></constructor-arg>
<constructor-arg value="260" type="int"></constructor-arg>
<constructor-arg value="1000000" type="double"></constructor-arg>
</bean>
<!-- 如果字面值有特殊符号,那么使用 <![CDATA[XXX]]> 进行包裹-->
<bean id="car4" class="com.neuedu.spring.beans.Car">
<constructor-arg value="Audi" index="1"></constructor-arg>
<constructor-arg index="0">
<value><![CDATA[<shanghai>]]></value>
</constructor-arg>
<constructor-arg value="260" type="int"></constructor-arg>
<constructor-arg value="1000000" type="double"></constructor-arg>
</bean>
字面值: 可用字符串表示的值 可以通过<value> 元素 标签或者是value 属性进行注入
若字面值中含有特殊符号 ,可以使用<![CDATA[XXX]]> 进行包裹
3.工厂方法注入(很少使用,不推荐)
引用其他bean
<!-- 引用其他bean 通过ref属性指定当前属性指向哪一个bean 指向的是bean的id -->
<bean id="person" class="com.neuedu.spring.beans.Person">
<property name ="name" value="Tom"></property>
<property name ="age" value="18"></property>
<property name ="car" ref="car4"></property>
</bean>
<!-- 还可以通过ref 元素标签 指定当前属性指向哪一个bean
注: ref 标签没有下一级元素 ,需要给bean属性赋值 而没有value属性
-->
<bean id="person2" class="com.neuedu.spring.beans.Person">
<property name ="name" value="jack"></property>
<property name ="age" value="25"></property>
<property name="car">
<ref bean="car3"></ref>
</property>
</bean>
内部bean :
当Bean实例 仅仅给一个特定的属性使用时,可以将其声明为内部bean
内部bean声明可以直接包含在<property> 或者是<constructor-arg>元素里 不需要设置任何的id和name属性
内部bean 不能使用在其他任何地方
<bean id="person3" class="com.neuedu.spring.beans.Person">
<property name ="name" value="Rose"></property>
<property name ="age" value="28"></property>
<property name ="car">
<!-- 内部bean 不能被外部引用 只能在内部使用 -->
<bean class="com.neuedu.spring.beans.Car">
<constructor-arg value="Audi" index="0"></constructor-arg>
<constructor-arg index="1">
<value><![CDATA[<shanghai>]]></value>
</constructor-arg>
<constructor-arg value="240" type="int"></constructor-arg>
<constructor-arg value="800000" type="double"></constructor-arg>
</bean>
</property>
</bean>
<!-- constructor-arg 元素标签去配置内部bean -->
<bean id="person4" class="com.neuedu.spring.beans.Person">
<constructor-arg value="Lucy"></constructor-arg>
<constructor-arg value="24"></constructor-arg>
<constructor-arg>
<bean class="com.neuedu.spring.beans.Car">
<constructor-arg value="Audi" index="0"></constructor-arg>
<constructor-arg index="1">
<value><![CDATA[<shanghai>]]></value>
</constructor-arg>
<constructor-arg value="240" type="int"></constructor-arg>
<constructor-arg value="800000" type="double"></constructor-arg>
</bean>
</constructor-arg>
</bean>
赋空值
<!-- 如果属性不赋值 那么默认是null -->
<bean id="person5" class="com.neuedu.spring.beans.Person">
<property name ="name" value="Lily"></property>
<property name ="age" value="16"></property>
</bean>
<!-- 属性赋空值 则使用<null/> 元素标签 -->
<bean id="person6" class="com.neuedu.spring.beans.Person">
<property name ="name" value="Jenny"></property>
<property name ="age" value="19"></property>
<property name="car"><null/></property>
</bean>
集合属性
在spring中可以通过一组内置的xml标签(比如说list set map)来配置集合属性
配置java.util.List类型的属性,需要用指定的<list> 标签
在标签中可以包含一些元素 可以通过<value> 标签可以指定简单的常量值 通过<ref>标签 指定对其他bean的引用 通过<null/> 自定空元素 甚至可以内嵌其他集合
数组的定义和List一样 ,都使用<list> 标签
配置 java.util.Set 需要使用<set> 标签,用法与<list> 相同
<!-- 集合属性的配置方式-->
<bean id="person7" class="com.neuedu.spring.beans.Person">
<property name ="name" value="Denny"></property>
<property name ="age" value="17"></property>
<property name="car"><null/></property>
<property name="cars">
<list>
<ref bean="car"></ref>
<ref bean="car2"></ref>
<ref bean="car3"></ref>
</list>
</property>
</bean>
java.util.Map <map>标签 可以使用多个<entry>作为子标签 每条包含一个键和一个值
必须在<key>标签中定义键 值<value> <ref> <null/>
<!-- 集合属性的配置方式 map-->
<bean id="person10" class="com.neuedu.spring.beans.Person">
<property name ="name" value="Denny"></property>
<property name ="age" value="17"></property>
<property name="car"><null/></property>
<property name="map">
<!-- map 元素中使用entry 子元素来表示一对键值对 其中需要指向其他bean时 使用value-ref属性 -->
<map>
<entry key="AA" value-ref="car"></entry>
<entry key="BB" value-ref="car2"></entry>
</map>
</property>
</bean>
使用<props>定义java.Util.Properties ,该标签使用多个<prop> 作为子标签 <prop> 必须有key属性
<!-- 集合属性的配置方式 properties-->
<bean id="person11" class="com.neuedu.spring.beans.Person">
<property name ="name" value="Denny"></property>
<property name ="age" value="17"></property>
<property name="car"><null/></property>
<property name="map">
<!-- map 元素中使用entry 子元素来表示一对键值对 其中需要指向其他bean时 使用value-ref属性 -->
<map>
<entry key="AA" value-ref="car"></entry>
<entry key="BB" value-ref="car2"></entry>
</map>
</property>
<property name="properties">
<!-- props 元素中使用prop 子元素 其中prop 元素必须有可以属性 -->
<props>
<prop key="user">root</prop>
<prop key="password">root</prop>
<prop key="jdbcURL">jdbc:mysql://localhost:3306/person</prop>
<prop key="driverClass">com.mysql.jdbc.Driver</prop>
</props>
</property>
</bean>
使用utility scheme 定义集合
使用基本的集合标签定义集合时,不能讲结合作为独立的bean 定义 ,导致其他bean 无法引用该集合 所在无法再不同bean之间共享
注意:使用util scheme里的集合标签定义独立的集合bean时 需要在<beans> 根元素里添加util scheme的定义
<!-- 集合属性的配置方式-->
<bean id="person8" class="com.neuedu.spring.beans.Person">
<property name ="name" value="jiahong"></property>
<property name ="age" value="22"></property>
<property name="car"><null/></property>
<property name="cars" ref="cars">
</property>
</bean>
<!-- 使用util scheme 声明集合类型的bean -->
<util:list id="cars">
<ref bean="car4"></ref>
<ref bean="car2"></ref>
<ref bean="car3"></ref>
</util:list>
使用p 命名空间
为了简化xml的配置 使用属性而非子节点配置bean
从spring 2.5开始引入p命名空间 可以通过bean元素的属性来配置bean的属性
<!-- 使用p命名空间 -->
<bean id="helloWorld3" class="com.neuedu.spring.beans.HelloWorld" p:name1="jiaohm">
</bean>
<!-- 使用p命名空间 -->
<bean id="person9" class="com.neuedu.spring.beans.Person" p:name="zhangshaofu" p:age="22" p:car-ref="car">
</bean>
自动装配 autowire
Spring IOC 可以自动装配bean 需要指定 autowire 属性的自动装配模式
byType: 根据类型自动装配 如果IOC容器中有多个和目标bean 类型一致的bean 则无法完成自动装配
byName: 根据名称自动装配 必须将Bean 的名称和属性名设置完全相同
constructor: 通过构造器自动装配 当bean中有多个构造器时 自动装配将会很复杂 不推荐使用
<!-- autowire 自动装配 byName 若属性名和id 保持一致是,可以完成自动装配 -->
<!-- autowire 自动装配 byType 根据类型自动装配 但是要求IOC 容器中同一类型的bean有且只有一个 如果有多个,则无法完成自动装配 -->
<bean id="student" class="com.neuedu.spring.autowire.Student" p:name="zhangsanfeng" p:num="1001" autowire="byType"></bean>
<bean id="address" class="com.neuedu.spring.autowire.Address" p:province="Liaoning" p:city="Shenyang" p:street="Xinxiujie"></bean>
<bean id="grade" class="com.neuedu.spring.autowire.Grade" p:course="Spring" p:score="120"></bean>
bean的继承和依赖
继承:Spring 允许继承bean的配置 被继承的bean 称为父bean 继承父bean的bean 称为子bean
子bean继承父bean的配置,包括属性配置;同时,也可以覆盖父bean继承过来的配置
<bean id="person9" class="com.neuedu.spring.beans.Person" p:name="zhangshaofu" p:age="22" p:car-ref="car">
</bean>
<!-- bean的继承 使用parent属性 指定父bean -->
<bean id="person12" class="com.neuedu.spring.beans.Person" parent="person9" p:name="baixiaohan">
</bean>
父bean还可以作为配置模板 也可以bean的实例 若作为模板,则Spring 将不会把这个bean 实例化
<!-- 将bean 作为配置模板 需要将abstract属性设置为true 作为配置模板将不会被spring容器实例化 -->
<bean id="person9" class="com.neuedu.spring.beans.Person" p:name="zhangshaofu" p:age="22" p:car-ref="car" abstract="true">
</bean>
并不是bean中所有的属性都会被继承 例如autowire abstract .etc
也可以忽略父类的class 属性,让子类指定自己的类,而共享其他相同的属性配置 此时 abstract 属性必须设置为true
依赖: spring 允许用户同depends-on属性设定bean的前置依赖bean 前置依赖bean 会在本bean 实例化之前创建好
如果依赖多个前置bean 可以通过逗号 空格分隔
<!-- bean的依赖 使用depends-on属性 指定前置bean -->
<bean id="person13" class="com.neuedu.spring.beans.Person" parent="person9" p:name="lvheng" depends-on="person12">
</bean>
bean的作用域
在spring中 ,默认情况下 spring只为 每个在IOC容器声明的bean创建唯一的一个实例,整个IOC容器范围内都能共享该实例
所有后续的getBean()和bean的引用 都是返回这个唯一的实例 这样的作用域称为 单例 singleton 单例是所有bean的默认作用域
类型共有四种
a) singleton 在SpringIOC容器中仅存在一个Bean的实例 ,bean以单例的范式存在
b) prototype 每次调用getBean()时都会返回一个新的实例
c) request 每次http请求时都会创建一个新的bean 仅仅适用于WebApplicationContext
d) session 同一个httpsession共享一个bean 不同的HttpSession 使用不同的bean 仅仅适用于WebApplicationContext
<!-- scope属性设置为prototype时 每次调用getBean()时都会返回一个新的实例 -->
<bean id="address" class="com.neuedu.spring.autowire.Address" p:province="Liaoning" p:city="Shenyang" p:street="Xinxiujie" scope="prototype"></bean>
使用外部属性文件
Spring提供了一个PropertyPlaceholderConfigurerde的beanFactory 后置处理器 这个处理器允许用户将bean配置的部分内容外移到属性文件中
可以在配置文件中使用形式为${xxxx}的变量 PropertyPlaceholderConfigurerde 从属性文件中加载属性,并且用这些属性来替换变量
<!-- 导入外部资源 -->
<context:property-placeholder location="classpath:name.properties"/>
<bean id="helloWorld4" class="com.neuedu.spring.beans.HelloWorld">
<!-- 属性注入 -->
<property name="name1" value="${name}"></property>
</bean>
Spring的语言表达式 SpEL
语法类似于EL:SpEL使用#{XXXX}作为界定符号
作用:
1) 通过bean的id 对bean进行引用
2)调用方法以及引用对象中的属性
3)计算表达式的值
4)正则表达式的匹配
<!-- 使用SpEL :可以为属性进行赋值 引用其他对象的属性 其他对象的属性必须是public -->
<bean id="helloWorld5" class="com.neuedu.spring.beans.HelloWorld">
<property name="name" value="#{helloWorld4.name}"></property>
</bean>
<!-- 可以用SpEL 可以为属性直接赋值 -->
<bean id="helloWorld6" class="com.neuedu.spring.beans.HelloWorld">
<property name="name" value="#{'lallalal'}"></property>
</bean>
Spring = IOC (DI) + AOP
IOC 反转控制 DI 依赖注入 AOP 面向切面编程
spring的特性:
1 轻量级
2 依赖注入
3 AOP
4 容器 spring是一个容器 它包含并管理了应用对象的生命周期
5 框架 xml+java注解
6 一站式
IOC 思想 : 反转资源获取的方向
传统的资源查找方式 要求组件向容器发起请求查找资源 ,作为回应,容器适时地返回资源
IOC 容器主动地将资源推送给它所管理的组件。组件所要做的仅仅是选择一种合适方式来接收资源 这种行为也被称为查找的被动形式
DI 组件以一些预先定义好的方式 (比如说setter方法) 接收来自容器的资源注入
IOC 前生 : 分离接口与实现 采用工厂设计模式 采用反转控制
IOC 容器类型:
1 ApplicationContext 是BeanFactory的子接口 提供了更多的特性 面向spring框架的开发者 ,几乎所有的场合都在直接使用applicationContext 而非底层的BeanFactory
2 BeanFactory IOC 容器最基本的实现 是Spring框架的基础设施,面向的是spring本身 (了解)
ApplicationContext 的主要实现类:
ClassPathXmlApplicationContext 从类路径下加载配置文件、
FileSystemXmlApplicationContext 从文件系统中加载配置文件
ConfigurableApplicationContext
新增加了两个方法 refresh() 和close()
使ApplicationContext 具有启动 刷新和关闭上下文的能力
WebApplicationContext 为web应用准备 它允许从相对于web根目录的路径中完成初始化工作
Spring 支持3中依赖注入的方式:
1.属性注入:
注意: 当使用属性注入时, 类中 必须有一个无参的构造器
<!-- 配置bean
id: 标示容器中bean id 必须是唯一的 id 也可以指定多个名字 名字之间可以用逗号 分号 或者是空格分隔
class: bean 的全类名 通过全类名配置的方式也叫反射配置
-->
<bean id="helloWorld" class="com.neuedu.spring.beans.HelloWorld">
<!-- 属性注入 -->
<property name="name1" value="wangwu"></property>
</bean>
2.构造器注入
<!-- 构造器注入 -->
<bean id="helloWorld2" class="com.neuedu.spring.beans.HelloWorld">
<!-- 构造器注入使用 constructor-arg 没有name 只有value-->
<constructor-arg value="zhangsan"></constructor-arg>
</bean>
<!-- 当bean的构造方法有多个参数时 默认按照顺序去加载 -->
<bean id="car" class="com.neuedu.spring.beans.Car">
<constructor-arg value="Audi"></constructor-arg>
<constructor-arg value="Shanghai"></constructor-arg>
<constructor-arg value="1000000"></constructor-arg>
</bean>
<!-- 可以通过类型区分构造器参数 -->
<bean id="car2" class="com.neuedu.spring.beans.Car">
<constructor-arg value="Audi"></constructor-arg>
<constructor-arg value="Shanghai"></constructor-arg>
<constructor-arg value="260" type="int"></constructor-arg>
</bean>
<!-- 可以通过index 去精确定位参数 index="" value="" 必须有双引号包裹 -->
<bean id="car3" class="com.neuedu.spring.beans.Car">
<constructor-arg value="Audi" index="1"></constructor-arg>
<constructor-arg value="Shanghai" index="0"></constructor-arg>
<constructor-arg value="260" type="int"></constructor-arg>
<constructor-arg value="1000000" type="double"></constructor-arg>
</bean>
<!-- 如果字面值有特殊符号,那么使用 <![CDATA[XXX]]> 进行包裹-->
<bean id="car4" class="com.neuedu.spring.beans.Car">
<constructor-arg value="Audi" index="1"></constructor-arg>
<constructor-arg index="0">
<value><![CDATA[<shanghai>]]></value>
</constructor-arg>
<constructor-arg value="260" type="int"></constructor-arg>
<constructor-arg value="1000000" type="double"></constructor-arg>
</bean>
字面值: 可用字符串表示的值 可以通过<value> 元素 标签或者是value 属性进行注入
若字面值中含有特殊符号 ,可以使用<![CDATA[XXX]]> 进行包裹
3.工厂方法注入(很少使用,不推荐)
引用其他bean
<!-- 引用其他bean 通过ref属性指定当前属性指向哪一个bean 指向的是bean的id -->
<bean id="person" class="com.neuedu.spring.beans.Person">
<property name ="name" value="Tom"></property>
<property name ="age" value="18"></property>
<property name ="car" ref="car4"></property>
</bean>
<!-- 还可以通过ref 元素标签 指定当前属性指向哪一个bean
注: ref 标签没有下一级元素 ,需要给bean属性赋值 而没有value属性
-->
<bean id="person2" class="com.neuedu.spring.beans.Person">
<property name ="name" value="jack"></property>
<property name ="age" value="25"></property>
<property name="car">
<ref bean="car3"></ref>
</property>
</bean>
内部bean :
当Bean实例 仅仅给一个特定的属性使用时,可以将其声明为内部bean
内部bean声明可以直接包含在<property> 或者是<constructor-arg>元素里 不需要设置任何的id和name属性
内部bean 不能使用在其他任何地方
<bean id="person3" class="com.neuedu.spring.beans.Person">
<property name ="name" value="Rose"></property>
<property name ="age" value="28"></property>
<property name ="car">
<!-- 内部bean 不能被外部引用 只能在内部使用 -->
<bean class="com.neuedu.spring.beans.Car">
<constructor-arg value="Audi" index="0"></constructor-arg>
<constructor-arg index="1">
<value><![CDATA[<shanghai>]]></value>
</constructor-arg>
<constructor-arg value="240" type="int"></constructor-arg>
<constructor-arg value="800000" type="double"></constructor-arg>
</bean>
</property>
</bean>
<!-- constructor-arg 元素标签去配置内部bean -->
<bean id="person4" class="com.neuedu.spring.beans.Person">
<constructor-arg value="Lucy"></constructor-arg>
<constructor-arg value="24"></constructor-arg>
<constructor-arg>
<bean class="com.neuedu.spring.beans.Car">
<constructor-arg value="Audi" index="0"></constructor-arg>
<constructor-arg index="1">
<value><![CDATA[<shanghai>]]></value>
</constructor-arg>
<constructor-arg value="240" type="int"></constructor-arg>
<constructor-arg value="800000" type="double"></constructor-arg>
</bean>
</constructor-arg>
</bean>
赋空值
<!-- 如果属性不赋值 那么默认是null -->
<bean id="person5" class="com.neuedu.spring.beans.Person">
<property name ="name" value="Lily"></property>
<property name ="age" value="16"></property>
</bean>
<!-- 属性赋空值 则使用<null/> 元素标签 -->
<bean id="person6" class="com.neuedu.spring.beans.Person">
<property name ="name" value="Jenny"></property>
<property name ="age" value="19"></property>
<property name="car"><null/></property>
</bean>
集合属性
在spring中可以通过一组内置的xml标签(比如说list set map)来配置集合属性
配置java.util.List类型的属性,需要用指定的<list> 标签
在标签中可以包含一些元素 可以通过<value> 标签可以指定简单的常量值 通过<ref>标签 指定对其他bean的引用 通过<null/> 自定空元素 甚至可以内嵌其他集合
数组的定义和List一样 ,都使用<list> 标签
配置 java.util.Set 需要使用<set> 标签,用法与<list> 相同
<!-- 集合属性的配置方式-->
<bean id="person7" class="com.neuedu.spring.beans.Person">
<property name ="name" value="Denny"></property>
<property name ="age" value="17"></property>
<property name="car"><null/></property>
<property name="cars">
<list>
<ref bean="car"></ref>
<ref bean="car2"></ref>
<ref bean="car3"></ref>
</list>
</property>
</bean>
java.util.Map <map>标签 可以使用多个<entry>作为子标签 每条包含一个键和一个值
必须在<key>标签中定义键 值<value> <ref> <null/>
<!-- 集合属性的配置方式 map-->
<bean id="person10" class="com.neuedu.spring.beans.Person">
<property name ="name" value="Denny"></property>
<property name ="age" value="17"></property>
<property name="car"><null/></property>
<property name="map">
<!-- map 元素中使用entry 子元素来表示一对键值对 其中需要指向其他bean时 使用value-ref属性 -->
<map>
<entry key="AA" value-ref="car"></entry>
<entry key="BB" value-ref="car2"></entry>
</map>
</property>
</bean>
使用<props>定义java.Util.Properties ,该标签使用多个<prop> 作为子标签 <prop> 必须有key属性
<!-- 集合属性的配置方式 properties-->
<bean id="person11" class="com.neuedu.spring.beans.Person">
<property name ="name" value="Denny"></property>
<property name ="age" value="17"></property>
<property name="car"><null/></property>
<property name="map">
<!-- map 元素中使用entry 子元素来表示一对键值对 其中需要指向其他bean时 使用value-ref属性 -->
<map>
<entry key="AA" value-ref="car"></entry>
<entry key="BB" value-ref="car2"></entry>
</map>
</property>
<property name="properties">
<!-- props 元素中使用prop 子元素 其中prop 元素必须有可以属性 -->
<props>
<prop key="user">root</prop>
<prop key="password">root</prop>
<prop key="jdbcURL">jdbc:mysql://localhost:3306/person</prop>
<prop key="driverClass">com.mysql.jdbc.Driver</prop>
</props>
</property>
</bean>
使用utility scheme 定义集合
使用基本的集合标签定义集合时,不能讲结合作为独立的bean 定义 ,导致其他bean 无法引用该集合 所在无法再不同bean之间共享
注意:使用util scheme里的集合标签定义独立的集合bean时 需要在<beans> 根元素里添加util scheme的定义
<!-- 集合属性的配置方式-->
<bean id="person8" class="com.neuedu.spring.beans.Person">
<property name ="name" value="jiahong"></property>
<property name ="age" value="22"></property>
<property name="car"><null/></property>
<property name="cars" ref="cars">
</property>
</bean>
<!-- 使用util scheme 声明集合类型的bean -->
<util:list id="cars">
<ref bean="car4"></ref>
<ref bean="car2"></ref>
<ref bean="car3"></ref>
</util:list>
使用p 命名空间
为了简化xml的配置 使用属性而非子节点配置bean
从spring 2.5开始引入p命名空间 可以通过bean元素的属性来配置bean的属性
<!-- 使用p命名空间 -->
<bean id="helloWorld3" class="com.neuedu.spring.beans.HelloWorld" p:name1="jiaohm">
</bean>
<!-- 使用p命名空间 -->
<bean id="person9" class="com.neuedu.spring.beans.Person" p:name="zhangshaofu" p:age="22" p:car-ref="car">
</bean>
自动装配 autowire
Spring IOC 可以自动装配bean 需要指定 autowire 属性的自动装配模式
byType: 根据类型自动装配 如果IOC容器中有多个和目标bean 类型一致的bean 则无法完成自动装配
byName: 根据名称自动装配 必须将Bean 的名称和属性名设置完全相同
constructor: 通过构造器自动装配 当bean中有多个构造器时 自动装配将会很复杂 不推荐使用
<!-- autowire 自动装配 byName 若属性名和id 保持一致是,可以完成自动装配 -->
<!-- autowire 自动装配 byType 根据类型自动装配 但是要求IOC 容器中同一类型的bean有且只有一个 如果有多个,则无法完成自动装配 -->
<bean id="student" class="com.neuedu.spring.autowire.Student" p:name="zhangsanfeng" p:num="1001" autowire="byType"></bean>
<bean id="address" class="com.neuedu.spring.autowire.Address" p:province="Liaoning" p:city="Shenyang" p:street="Xinxiujie"></bean>
<bean id="grade" class="com.neuedu.spring.autowire.Grade" p:course="Spring" p:score="120"></bean>
bean的继承和依赖
继承:Spring 允许继承bean的配置 被继承的bean 称为父bean 继承父bean的bean 称为子bean
子bean继承父bean的配置,包括属性配置;同时,也可以覆盖父bean继承过来的配置
<bean id="person9" class="com.neuedu.spring.beans.Person" p:name="zhangshaofu" p:age="22" p:car-ref="car">
</bean>
<!-- bean的继承 使用parent属性 指定父bean -->
<bean id="person12" class="com.neuedu.spring.beans.Person" parent="person9" p:name="baixiaohan">
</bean>
父bean还可以作为配置模板 也可以bean的实例 若作为模板,则Spring 将不会把这个bean 实例化
<!-- 将bean 作为配置模板 需要将abstract属性设置为true 作为配置模板将不会被spring容器实例化 -->
<bean id="person9" class="com.neuedu.spring.beans.Person" p:name="zhangshaofu" p:age="22" p:car-ref="car" abstract="true">
</bean>
并不是bean中所有的属性都会被继承 例如autowire abstract .etc
也可以忽略父类的class 属性,让子类指定自己的类,而共享其他相同的属性配置 此时 abstract 属性必须设置为true
依赖: spring 允许用户同depends-on属性设定bean的前置依赖bean 前置依赖bean 会在本bean 实例化之前创建好
如果依赖多个前置bean 可以通过逗号 空格分隔
<!-- bean的依赖 使用depends-on属性 指定前置bean -->
<bean id="person13" class="com.neuedu.spring.beans.Person" parent="person9" p:name="lvheng" depends-on="person12">
</bean>
bean的作用域
在spring中 ,默认情况下 spring只为 每个在IOC容器声明的bean创建唯一的一个实例,整个IOC容器范围内都能共享该实例
所有后续的getBean()和bean的引用 都是返回这个唯一的实例 这样的作用域称为 单例 singleton 单例是所有bean的默认作用域
类型共有四种
a) singleton 在SpringIOC容器中仅存在一个Bean的实例 ,bean以单例的范式存在
b) prototype 每次调用getBean()时都会返回一个新的实例
c) request 每次http请求时都会创建一个新的bean 仅仅适用于WebApplicationContext
d) session 同一个httpsession共享一个bean 不同的HttpSession 使用不同的bean 仅仅适用于WebApplicationContext
<!-- scope属性设置为prototype时 每次调用getBean()时都会返回一个新的实例 -->
<bean id="address" class="com.neuedu.spring.autowire.Address" p:province="Liaoning" p:city="Shenyang" p:street="Xinxiujie" scope="prototype"></bean>
使用外部属性文件
Spring提供了一个PropertyPlaceholderConfigurerde的beanFactory 后置处理器 这个处理器允许用户将bean配置的部分内容外移到属性文件中
可以在配置文件中使用形式为${xxxx}的变量 PropertyPlaceholderConfigurerde 从属性文件中加载属性,并且用这些属性来替换变量
<!-- 导入外部资源 -->
<context:property-placeholder location="classpath:name.properties"/>
<bean id="helloWorld4" class="com.neuedu.spring.beans.HelloWorld">
<!-- 属性注入 -->
<property name="name1" value="${name}"></property>
</bean>
Spring的语言表达式 SpEL
语法类似于EL:SpEL使用#{XXXX}作为界定符号
作用:
1) 通过bean的id 对bean进行引用
2)调用方法以及引用对象中的属性
3)计算表达式的值
4)正则表达式的匹配
<!-- 使用SpEL :可以为属性进行赋值 引用其他对象的属性 其他对象的属性必须是public -->
<bean id="helloWorld5" class="com.neuedu.spring.beans.HelloWorld">
<property name="name" value="#{helloWorld4.name}"></property>
</bean>
<!-- 可以用SpEL 可以为属性直接赋值 -->
<bean id="helloWorld6" class="com.neuedu.spring.beans.HelloWorld">
<property name="name" value="#{'lallalal'}"></property>
</bean>