目录
第一天 - 简单配置及DI的注入
1.spring 框架构成
- 核心部分 IOC(控制反转) 基础部分 整个spring框架的基石
- Spring DAO Spring 对 jdbc 的支持
- Spring web Mvc spring 规范web mvc的开发 后期还要集成其它框架
- Spring AOP 面向切面编程
- Spring ORM(对象关系映射) spring 集成 MyBatis 后期还有 hibernate
- Spring JEE 远程调用 邮件 等
Spring IOC
- Inversion of control 控制反转
- 控制反转的意思是 程序中的对象 由原来的 new 的方式 转换成
- 由框架来 创建 和 注入,这样做 可以降低对象之间的耦合度。
什么Spring 容器
- 任何java类 都可以看成一个 bean 组件,然后通过容器 管理和使用组件。
- Spring 容器 实现了 IOC 和 AOP 机制
- Spring 容器 有两种实现 ApplicationContext 和 BeanFactory
推荐使用 ApplicationContext
使用Spring 容器的使用步骤
- 建立一个项目 导入Spring IOC的jar包
- 导入Spring 容器 对应的配置文件 ****.xml 到 src下
- 在配置文件中 编写组件说明
- 构建Spring 容器 获取对应的组件
自定义一个类Emp类
成员变量有 id name salary
然后提供无参构造 并给 id name salary 等赋初始值 再提供toString方法
最后通过 配置文件 配置这个Emp 类型的组件 并通过Spring容器获取对象 输出对象内容
- 建立一个项目 导入Spring IOC的jar包
- 导入Spring 容器 对应的配置文件
****.xml
到src
下 - 在配置文件中 编写组件说明:
<bean id="合法标识符" class="包名+类名"></bean>
- 构建Spring 容器 获取对应的组件
ApplicationContext app = new ClassPathXmlApplicationContext("文件路径");
类名 标识符 = app.getBean("id对应的值",类型.class);
Spring 容器创建对象的三种方式
- 构造器方式(默认调用无参的构造):
<bean id="合法标识符" class="包名+类名"></bean>
- 静态工厂方法:
<bean id="合法标识符" class="包名+类名" factory-method="静态方法名"></bean>
- 实例化工厂的方式:
<bean id="合法标识符" class="包名+类名" factory-bean="对象id" factory-method="实例化方法名"></bean>
Bean 对象的作用域
只要在bean标签加scope属性
- 默认scope是singleton(代表对象是单例的)
- 也可以指定成prototype(代表对象是非单例的)
其它的作用域在web部分中使用如request,session等
对象的初始化
- 在beans标签中加
default-init-method="初始化方法名"
,由于这个标签中影响的范围比较大所以如果一个类型中没有定义这个方法也不会报错。 - 在bean标签中加
init-method="初始化方法名"
,由于这个标签影响的范围小所以类型中没有定义这个方法则报错。
需要注意的是:在beans可以配置default-init-method
方法,bean标签却不能,bean标签职能配置init-method
直接在bean标签添加init-method方法会出现找不到定义的init方法,我们需要在Emp类中添加对应的init方法即可
init方法可以設置對象初始化屬性,若不設置則為對應屬性的默認值
对象销毁之前调用的方法
- 在beans标签中加
default-destroy-method="初始化方法名"
,由于这个标签中影响的范围比较大,所以如果一个类型中没有定义这个方法 也不会报错。 - 在bean标签中加
destroy-method="初始化方法名"
,由于这个标签影响的范围小,所以类型中没有定义这个方法则报错。
正常情況下,生成的bean对象只会在spring容器关闭时释放,所以我们设置的myDestroy打印语句看不到,要想看到确实被调用,我们可以使用AbstractApplicationContext的对象方法.close();
bean对象的延迟实例化
延遲實例化只能在單例模式中使用,非单例模式不能使用哦~
bean对象默认在容器启动时就创建对象,可以通过lazy-init="true"
将对象的创建推迟到第一次请求对象时创建
默认lazy-init
是default
就是false
。
default-lazy-init
这个在beans
标签中使用
延迟创建的实例化对象会在调用时实例化
什麽是DI
DI就是Dependence Injection,依赖注入
解決的問題是,組件之間的裝配關係問題,DI是对IOC一种具体的实现
DI的实现方式
基于set方法的注入
<bean id="player" class="com.bean.Player">
<property name="name" value="小馬哥"></property>
<property name="age" value="18"></property>
</bean>
构造器注入
看的是构造方法的参数
自动注入
在Bean对象注入时,可以通过自动装配讲话XML注入配置。
元素中使用autowire
属性指定自动装配规则,这个属性的默认值是no
其他的取值有
byName
(以属性的名字和容器中组件的id對應關係)byType
(按照类型去查找,如果同类型的对象有多个,则报错)constructor
(参数的个数要严格匹配,可以使用占参数位置,但是不能使用占位置。
优先使用byName注入,后使用byType,如果类型有冲突则报错)
autodetect
早期版本中存在,后面版本已不能使用!