1.Spring 框架的构成
IOC 控制反转 这是Spring 框架的核心
DAO 数据访问对象 Spring 对JDBC的封装
MVC Spring 对web部分的支持 以及对其它web技术的整合(struts2)
AOP 面向切面编程
ORM 对象关系映射 Mybatis
JEE 邮件 和 远程调用 等
2.什么是IOC
Inversion Of Control 控制反转
程序中需要的对象 由原来的new 的方式 变成了由容器来进行创建和管理。
Spring 容器的作用 就是创建对象 管理对象 以及维护对象之间的关系,
这样做可以降低组件之间耦合度 便于程序的扩展。
3.Spring 容器
任何的java 类 都可以 通过Spring 容器 创建对象 ,并通过容器管理和使用
Spring 容器实现了 IOC 和 AOP 机制
Spring 容器的类型 对应的是 BeanFactory 和 ApplicationContext 类型
4.Spring 容器实现 IOC 的步骤
1 建立一个工程 导入ioc 相关的jar 拷贝Spring容器对应的配置文件到src下
2 在Spring容器的配置文件中 编写 bean 的配置 (applicationContext.xml)
<bean id="对象引用标识符" class="包名.类名" > </bean>
3 创建Spring 容器对象 通过容器对象 获取容器对象的API 获取容器中的组件(eg: Applicationcontext ac = new ClassPathXmlApplicationContext("applicationContext.xml");)
5.Spring 容器创建对象的三种方式
1 构造器方式实例化
默认调用的是 类型对应的无参构造 配置文件的形式
<bean id="标识符" class="包名.类名" ></bean>
2 静态工厂方法实例化
创建对象的手段 是通过静态工厂方法完成 配置文件的形式
<bean id="标识符" class="包名.工厂类名" factory-method="静态方法名"></bean>
5.3 实例工厂方法实例化
使用工厂对象 来获取目标对象
<bean id="标识符" class="包名.目标类名"
factory-method="实例方法名" factory-bean="工厂对象" ></bean>
6.Spring 容器中bean 对象的作用域
这个bean 对象作用域的概念 比较宽泛,可以通过bean 标签的 scope属性来进行设置
取值有 singleton 默认的,非单例使用 prototype 。 其它的如request session
等在web 部分才会涉及。
bean 对象 默认在Spring 容器中是单例的,可以通过scope 来进行改变。
7.Spring 容器中 bean 对象的初始化
当容器中对象创建完毕之后 可以通过 beans标签中的 default-init-method 来指定初始化
方法,由于这个标签中的属性 会影响到所有的bean 对象。所以某个类型中如果没有对应的
初始化方法 也不会报错。也可以通过bean标签中 的 init-method 属性来指定初始化方法
这样只影响到特定的bean对象 所以如果bean 对应的类型中没有定义对应的初始化方法 则
程序会报错。
8.Spring 容器中 bean 对象的销毁
当容器对象关闭时, 可以通过 beans标签中的 default-destroy-method 来指定销毁
方法,由于这个标签中的属性 会影响到所有的bean 对象。所以某个类型中如果没有对应的
销毁方法 也不会报错。也可以通过bean标签中 的 destroy-method 属性来指定销毁方法
这样只影响到特定的bean对象 所以如果bean 对应的类型中没有定义对应的销毁方法 则
程序会报错。
9.bean 对象的延迟实例化
这个技术是针对单例模式的对象的,默认情况下单例对象 会伴随着容器的创建 而自动创建。
我们可以通过beans标签中的 default-lazy-init 来改变默认机制 默认值是default(false)
可以改成 true 这样就延迟实例化了,当请求到来时才会创建对象。这样做影响范围太大 可以
在bean 标签中加 lazy-init="true" 来完成。
10.什么是DI
Dependence Injection 依赖注入(注射)
组件需要某个组件值时, 把某个值赋值给对应的组件的过程 叫依赖注入。
作用解决组件之间的装配问题。
10.1实现DI的方式
3.1 setter 注入
基于set方法的注入
<property name="set方法去掉之后 首字母小写" value="值"></property>
如果要赋值 复杂的对象类型 可以使用
<property name="set方法去掉之后 首字母小写" ref="容器中的组件id"></property>
10.2 构造器注入
<constructor-arg index="编号从0开始" value="" > </constructor-arg>
如果注入复杂的对象类型 把 value 改成 ref
可以使用 name 代替 index name 就是参数的名字
10.3 自动化注入
bean标签 中有一个 autowire 属性 可以进行自动化注入
no 不进行自动化注入 默认的
byName 是按照名字进行注入 找不到对应的属性 也不报错 所以可以结合setter注入
byType 按照属性的类型注入 但这样可能出现多个相同的类型 则报错
constructor 参考构造方法 但是碰到找不到对应的参数值 直接终止赋值
11.Bean参数的注入
11.1简单参数的注入
简单类型的参数 包括 八种基本类型 以及对应的封装类 String 以及 枚举
通过 value 直接写对应的值
利用基本值的注入 实现一个DataSource 对象的创建
11.2 bean 参数的注入
把value 换成 ref 即可 参考 Player 中注入 Card 的例子
11.3 集合类型的参数注入
通过配置文件中的 标记 可以 对应java 类型中的集合类型的属性
List
<list>
<value>值</value>
</list>
Set
<set>
<value>值</value>
</set>
Map
<map>
<entry key="" value=""> </entry>
</map>
Properties
<props>
<prop key=""> 值 </prop>
</props>
11.4 集合的单独定义
可以 <util:对应的集合标签 单独定义一个集合 然后 通过 设定集合的id
通过 ref 进行集合的引用。
11.5 可以.properties 文件 直接转换一个 Spring 容器中的一个 单独定义的属性集合对象
11.6 Spring 中的EL表达式
从Spring 容器中 取对象对应的值 语法是 把之前的$ 换成 #