ioc
ioc是干什么的?
ioc是spring的一部分 , 其作用主要是管理类
-
导入spring坐标 – 版本为5.2.10.RELEASE
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.10.RELEASE</version> </dependency>
-
创建接口
-
定义spring配置文件
在resource中新建spring配置<bean id="ico" class="com.jixu.dao.impl.IocImpl"></bean>
-
初始化ioc容器
-
创建ApplicationContext对象
ApplicationContext act = new ClassPathXmlApplicationContext("springContext.xml");
使用getBean方法获取对象
Ioc ico = (Ioc) act.getBean("ico");
DI
DI主要解决的问题是依赖注入 , 也就是说我在service层调用Dao层的时候 , 不可避免的需要new Dao层的对象
那么为了避免这个问题我们可以直接在配置文件中 注入到层对象
如何注入 ?
- 由于我们是要把Dao层的对象注入到service层 , 所以需要在service创建Dao属性 , 并且创建set方法
- 在配置文件中配置参数
<bean id="service" class="com.jixu.service.impl.SerivceImpl"> <property name="iocDao" ref="ico"> </property> </bean>
Bean的实例化
1. 构造方法
在创建ApplicationContext的时候会调用配置文件中已经配置好类的构造方法 , 创建类对象
2. 静态工厂
早Spring容器中支持静态工厂的配置
什么是工厂模式?
工厂模式是管理类对象的一种方式, 可以将对象的创建交给工厂类来实现
Spring如何实现静态工厂模式?
传统方式 : 新建工厂类使用静态方法返回类对象 , 通过静态方法创建对象
public class DaoFactory {
public static Ioc getDaoFactory(){
return new IocImpl();
}
}
Spring配置
- 通过FactoryMethod方法指定工厂类需要创建的对象
<bean id="DaoFactory" class="com.jixu.factory.DaoFactory" factory-method="getDaoFactory"></bean>
- 创建ApplicationContext对象调用方法
public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springContext.xml"); Ioc daoFactory = (Ioc) applicationContext.getBean("DaoFactory"); daoFactory.run(); }
3. 实例工厂
什么是实例工厂? 实例工厂的根本还是工厂模式 , 只是内部方法为非静态
如何实现?
1. 创建实例工厂类 , 继承FactoryBean接口 , 重写方法返回类对象
public class InstanceFactory implements FactoryBean { @Override public Object getObject() throws Exception { return new IocImpl(); } @Override public Class<?> getObjectType() { return null; } }
2. 完善配置文件
<bean id="DaoFactory" class="com.jixu.factory.InstanceFactory"></bean>
Bean的生命周期
-
初始化容器
- 创建对象
- 执行构造方法
- 执行属性注入
- 执行Bean初始化方法
-
使用Bean
- 执行业务操作
-
关闭/销毁容器
- close() 暴力关闭
- registerShutdownHook() 注册关闭
-
聊一聊BeanFactory和ApplicationContext
相同点 : 二者都是Spring中管理容器的接口
不同点 : ApplicationContext是BeanFactory的子接口
ApplicationContext是延迟加载 , 创建方式 --> 编程式 , 消耗内存较小启动较快
BeanFactory是预加载 , 创建方式 --> 声明式 , 消耗内存较大启动较慢 -
BeanFactory和FactoryBean之间的区别
BeanFactory是一个工厂类 , 是Spring容器中的接口 , 用于管理Bean
FactoryBean是一种Bean , 用于创建和返回Bean