Spring框架 之 IoC和DI(一)
一、什么是Spring
- Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson开发。
- 它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架.
- Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EE full-stack 轻量级开源框架。
- 分层: full-stack,每一个层都提供解决方案
- web层:struts,spring-MVC
- service层:spring 事务控制 spring
- dao层:hibernate,mybatis , jdbcTemplate(spring提供了一个模板对象) --> spring-data
ssh:struts2+spring+hibernate
ssm:spring+springmvc+mybatis
1、2 Spring优点
面试题:spring的IoC(控制反转)底层用到什么设计模式?-- 静态工厂模式
|
1、3 Spring体系结构
核心容器:beans、core、context、expression
dao service 对象的创建都交给spring
二、IoC入门
2、1 导入jar包
4个核心(beans、core、context、expression) + 1个依赖(commons-loggins...jar)
2、2 目标类
- 提供UserService接口和实现类
- 获得UserService实现类的实例
之前开发中,直接new一个对象即可: UsersService service = new UsersServiceImpl();
但 学习完spring之后,就可以将由Spring创建对象实例( IoC 控制反转:Inverse of Control )
之后需要实例对象时,从spring工厂(容器)中获得,需要将实现类的全限定名称配置到xml文件中
把创建对象的过程交给spring来创建,这就是控制反转IoC,这样就可以降低模块之间的耦合度
2、3 配置文件
- 位置:任意,开发中一般在classpath下(src)
- 名称:任意,开发中常用applicationContext.xml (不是必须的。)
- 内容:添加schema约束
-
<beans 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 id="userService" name="us" class="com.tf.service.impl.UserServiceImpl"></bean> </beans>
2、4 测试类
//创建ApplicationContext对象 ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml"); //根据spring的核心对象解析applicationContext.xml配置文件 从配置文件中获取一个UserService 对象 //从spring的配置文件中获取对象的三种方式 : name 、id、class UserService userService = ac.getBean(UserService.class); UserService userService2 = (UserService) ac.getBean("userService"); UserService userService3 = (UserService) ac.getBean("us");
System.out.println(userService==userService2); //true,证明spring创建的对象默认是单例的 |
三、DI案例 依赖注入
3、1 DI Dependency Injection ,依赖注入
类与类之间的依赖关系,比如service层依赖dao层
依赖:一个对象需要使用另一个对象
注入:通过setter方式注入(构造方法constuctor、p标签,)进行对另一个的对象实例设置。
IoC:把创建对象的过程交给了Spring (<bean ………………>)
DI:通过调用setXXX方法注入另外的对象 <property name=”” ref=””> 普通属性:value 引用数据类型:ref
<!-- 1.dao 等价于: BookDao bookDao = new BookDaoImpl(); --> <bean id="bookDao" class="com.it.di.dao.impl.BookDaoImpl"></bean>
<!-- service 等价于: BookService bookService = new BookServiceImpl(); bookService.setBookDao(bookDao); --> <bean id="bookService" class="com.itqf.di.service.impl.BookServiceImpl"> <!-- 注入dao --> <property name="bookDao" ref="bookDao" ></property> </bean>
|
四、schema xml提示
- 步骤一:确定xsd文件位 spring-framework-RELEASE\schema\beans
- 步骤二:复制路径
- 步骤三:搜索“xml catalog”
- 步骤四:添加约束提示
五、核心api
- BeanFactory :这是一个工厂,用于生成任意bean。 创建对象(采取延迟加载,第一次getBean时才会初始化Bean)
- ApplicationContext:是BeanFactory的子接口,功能更强大。当配置文件被加载,就进行对象实例化。
- ClassPathXmlApplicationContext 用于加载classpath下的xml:加载xml运行时位置 --> /WEB-INF/classes/...xml
- FileSystemXmlApplicationContext 用于加载指定盘符下的xml:加载xml运行时位置 --> /WEB-INF/...xml( 通过java web ServletContext.getRealPath() 获得具体盘符)
六、实例化Bean基于XML
6、1 实例化方式
- 3种bean实例化方式:默认构造、静态工厂、实例工厂
6、2 默认构造(常用)
public class BookDaoImpl implements BookDao { public void add() { }
<bean id="bookDao1" class="com.tf.dao.impl.BookDaoImpl"></bean> |
6、3 静态工厂
- 常用与spring整合其他框架(工具)
- 静态工厂:用于生成实例对象,所有的方法必须是static
编写静态工厂类 public class MyStaticFactory { <!-- 方法二 静态工厂 --> <bean id="bookDao2" class="com.tf.dao.impl.MyStaticFactory" factory-method="create"> </bean> |
- 编写静态工厂类
- <bean id="bookDao2" class="工厂类对象全路径 " factory-method="静态方法名"></bean>
6、4 实例工厂
实例工厂:必须先有工厂实例对象,通过实例对象创建对象。提供所有的方法都是“非静态”的。
普通的工厂类 (非静态方法)
//工厂类 public class MyFactory { <!-- * factory-bean 确定工厂实例 * factory-method 确定普通方法 --> <!-- 方法三: 工厂模式 --> |
七、作用域
面试:spring bean的作用域? / spring Bean的scope的取值?
作用域:用于确定spring创建bean实例个数
servlet:单例
struts2:action(处理请求):多例
struts2是线程安全还是不安全的?安全的
spring:bean:默认是单例(singleton)
bean标签有scope属性可以设置bean的作用域。
取值:
singleton 单例,默认值。
prototype 多例,每执行一次getBean将获得一个实例。例如:struts整合spring,配置action多例。
面试题: 什么时候bean的作用域需要设计为多例的?
Ssh整合(或者struts2和spring整合时),action的创建交给spring创建,需要给bean设计为多例的。
配置信息
<bean id="" class="" scope=""> |
八、生命周期
- 初始化和销毁
目标方法执行前后执行后,将进行初始化或销毁。
<bean id="" class="" init-method="初始化方法名称" destroy-method="销毁的方法名称"> |
例如:
public class BookDaoImpl {
public void add(){
System.out.println("添加bean");
}
public void init(){
System.out.println("初始化bean");
}
public void destory(){
System.out.println("销毁bean");
}
}
<!-- 生命周期相关的属性 -->
<bean id="bookDao1" class="com.tf.lifecycle.BookDaoImpl" init-method="init" destroy-method="destory"></bean>