二、控制反转(inverse of control IOC )
来源:互联网 发布:vivo隐藏功能网络代码 编辑:程序博客网 时间:2024/04/29 09:54
1. Bean 工厂(BeanFactory)的功能和配置
I、 ClassPathResource
l 在类路径下查找资源
l 另有 FileSystemResource
II、 XmlBeanFactory
l 读取 xml文件中的配置信息
l 生产bean
l 解决bean依赖
2. Bean 的创建
spring可调用bean的构造方法,或通过工厂方法生产 bean对象
I、 利用 bean的构造方法创建bean
l 无参的构造方法(通过set方法设置,一定要有set方法)
<bean id="refName" class="com.xasxt.UserDao">
<property name="username" value="root"/>
<property name="password" value="123"/>
</bean>
l 有参的构造方法,需指明构造方法的参数列表,通过:
<bean id="refName" class=" com.xasxt.UserDao ">
<construct-arg><value>root</value></construct-arg>
<construct-arg><value>123</value></construct-arg>
</bean>
表明调用了有两个参数的构造方法
II、 通过工厂方法获得 bean对象
bean 没有公共的构造方法,需通过工厂类或工厂实例来创建
分为静态工厂和实例工厂方法两种情况
l 静态工厂方法:
class 指明工厂类,factory-method指明工厂方法如:
Connection con=DriverManager.getConnection(url,user,pwd);
对应的配置:
<beanid="con" class="java.sql.DriverManager" factory-method="getConnection"> <construct-arg><value>jdbc:mysql://localhost/test</value></construct-arg>
<construct-arg><value>zhangsan</value></construct-arg>
<construct-arg><value>pwd</value></construct-arg>
</bean>
工厂方法参数和构造方法参数设置的形式相同
l 实例工厂方法:
要先创建工厂实例,然后再由工厂实例创建产品
如: Statement stmt = con.createStatement();
con 对象是工厂
stmt 对象是产品
配置为:
<bean id="con" class="java.sql.DriverManager" factory-method="getConnection">
……
</bean>
<bean id="stmt" factory-bean="con" factory-method="createStatement"/>
3. Bean的作用域
Bean作用域(scope属性)
作用域
描述
singleton
在每个Spring IoC容器中一个bean定义对应一个对象实例。
prototype
一个bean定义对应多个对象实例。
request
在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。
session
在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
global session
在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于web的Spring ApplicationContext情形下有效。
bean工厂生产bean缺省都是单例的(singleton)
后两者用于web应用中
4. 通过注入解决bean的依赖
I、 依赖注入的两种方式
l set 注入
spring 直接利用了bean的set或构造方法
避免了使用接口注入的侵入性
<beanid="person"class="com.xasxt.spring.Person">
<!-- set方法设置注入 -->
<propertyname="id"value="001"/>
<propertyname="name"value="zhangsan"/>
<propertyname="sex"value="M"/>
<propertyname="mari"value="false"/>
<propertyname="salary"value="4500"/>
</bean>
l 构造方法注入
<beanid="person"class="com.xasxt.spring.Person">
<!-- 构造方法的方式注入 -->
<constructor-arg>
<value>002</value>
</constructor-arg>
<constructor-arg>
<value>lisi</value>
</constructor-arg>
<constructor-arg>
<value>false</value>
</constructor-arg>
<constructor-arg>
<value>M</value>
</constructor-arg>
<constructor-arg>
<value>5000</value>
</constructor-arg>
</bean>
II、 依赖的目标类型分成三种形式:
l 基本类型+String
<value>data</value>
类型自动转化
l 对其他bean的引用
<beanid="prop"abstract="true"><!—只作为模板,不能被实例化-->
<propertyname="address"value="beijing"></property>
</bean>
<!—上面是公共属性注入,下面可以引用-->
<beanid="stu"class="com.xasxt.dependency.Student"parent="prop"><!—可以引用公共属性-->
<propertyname="name"value="zhangsan"></property>
<propertyname="code"value="01101"></property>
</bean>
<beanid="tea"class="com.xasxt.dependency.Teacher"parent="prop"><!—可以引用公共属性-->
<propertyname="name"value="Li Sir"></property>
<propertyname="job"value="java teacher"></property>
</bean>
<!-- 普通装配 -->
<bean id="c" class="com.xasxt.dependency.Class">
<property name="name" value="class One"></property>
<property name="teacher" ref="tea"></property>
<property name="stus">
<list>
<ref bean="stu"/>
</list>
</property>
</bean>
l 集合类型
Set
<propertyname="sets">
<set>
<value>wangso</value>
<value>haoren</value>
<value>ganka</value>
</set>
</property>
Array和List同样设置
List
Map
<propertyname="map">
<map>
<entrykey="aaa">
<value>7688</value>
</entry>
<entrykey="bbb">
<value>9788</value>
</entry>
<entrykey="ccc">
<value>8769</value>
</entry>
</map>
</property>
III、 让spring自动装配bean,解决依赖
autowire属性指明自动装配的依据:
byName--- id的值=bean中的property名
byType--- 属性的类型=当前工厂中bean的类型
constructor--构造方法参数的类型=当前工厂中bean的类型
autodetect-- constructor ---> byType
autowire-candidate属性
指明是否作为 autowire 的候选对象(true或false)
解决多个候选对象的冲突
IV、 让容器检测 bean所有的依赖是否都已经满足
防止bean的遗漏装配,在运行后出现莫名奇妙的情况,可以设置下列属性
dependency-check属性指明应检查的目标类型
simple -- 基本类型+字符串+集合
objects --- 对其他bean的依赖
all---对各类型都检查
none -- 默认值
V、 通过classpath自动扫描方式把组件纳入spring容器中管理
1、需要在文件中加入下面一句配置:
<context:component-scan base-package="com.xasxt.spring"/>
黄色是包名
2、还需要在各个类中加入下列注解之一:
@Service @Controller @Repository @Component
约定优于配置- 二、控制反转(inverse of control IOC )
- IOC即inverse of control 控制反转
- IOC(Inverse of Controller) 控制反转
- 设计中的控制反转(Inverse of Control)
- IoC(Inversion of Control)反转控制
- 控制反转(Ioc=Inversion of Control)
- IOC:Inversion Of Control--控制反转
- IoC(Inversion of Control,控制反转)模式
- IoC(Inversion of Control)控制反转
- 控制反转 IOC (Inversion of Control)
- Inversion of Control (IoC 控制反转)
- 控制反转IoC(Inversion of Control)
- Spring核心技术(1)控制反转(Inversion of Control,IoC)理论
- Spring的IOC(控制反转Inversion of Control)
- 控制反转(Inversion of Control,IoC)简介
- Spring的IOC(Inversion of Control)(控制反转)
- Spring从IOC(Inversion of Control:控制反转)开始
- IOC 控制反转(Inversion of Control,英文缩写为IoC)
- 回溯思想
- 动态规划
- win7硬盘检测工具HD tune使用
- 概率思想
- 软件级负载均衡器(LVS/HAProxy/Nginx)的特点和对比
- 二、控制反转(inverse of control IOC )
- KM算法总结
- linux ulimit
- linux块儿设备驱动实例
- fatal error C1083: 无法打开包括文件:“iostream.h”: No such file or directory
- UVaOJ 489 - Hangman Judge
- FFmpeg完美入门【7】-FFmpeg架构之Demuxer和muxer模块分析
- FPGA_&&_Driver_9_1
- POJ 2486 Apple Tree(树形DP + 01背包)