求学者

专题一:IOC ---- Spring入门笔记

专题一 IOC

  1. 接口及面向接口编程
  2. 什么是 IOC(控制反转):控制权转移,应用程序本身不负责
  3. Spring的 Bean 配置
  4. Bean 的初始化
  5. Spring 的常用注入方式

接口及面向接口编程

接口

  • 接口即声明,声明哪些方法对外提供。
  • 使用接口沟通,使其能被修改内部而不影响外部其他实体的与其交互的方式(Java8中接口可以拥有方法体)

面向接口编程

  • 结构设计中,分清层次及调用关系,每层只向外(上层)提供一组功能的接口,各层仅依赖接口而非实现类
  • 接口内部的实现变动不影响各层之间的调用,这一点在公共服务中尤为重要
  • “面向接口编程”中的“接口”是用于【隐藏具体的实现】和【实现多态性的组件】(2点)

什么是IOC

  • IOC:控制反转,控制权的转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责创建和维护
  • DI(依赖注入)是其一种实现方式。(获取依赖对象的过程被反转,过程由自身管理变为有 IOC 容器主动注入,即依赖注入)
  • 目的:创建对象并且组装对象之间的关系

下图为 Spring 官网给出的 IOC 说明
IOC说明

Spring 的 Bean 配置

配置一般存放于 spring-ioc.xml 文件中
举例

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<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="oneInterface" class="com.imooc.ioc.interfaces.OneInterfaceImpl"></bean>
</beans>

Bean 容器的初始化

  • 基础:两个包
    • org.springframework.beans
    • org.springframework.context
    • BeanFactory 提供配置结构和基本功能,加载并初始化Bean
    • ApplicationContext 保存了 Bean 对象并在 Spring 中广泛使用
  • 3中初始化方式:ApplicationContext

    • 本地文件

      1
      2
      FileSystemXmlApplicationContext context = new
      FileSystemXmlApplicationContext("F:/workspace/appcontext.xml");
    • Classpath

      1
      2
      ClassPathXmlApplicationContext context = new
      ClassPathXmlApplicationContext("classpath:spring-context.xml");
    • Web 应用中依赖 servlet 或 Listener
      Web初始化

Spring 注入

  • Spring 注入指在启动Spring容器加载bean配置的时候,完成对变量的赋值行为
  • 常用的两种注入方式
    • 设值注入
    • 构造注入

设值注入

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8"?>
<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="injectionService" class="com.imooc.ioc.injection.service.InjectionServiceImpl">
<property name="injectionDAO" ref="injectionDAO"></property>
</bean>
<bean id="injectionDAO" class="com.imooc.ioc.injection.dao.InjectionDAOImpl"></bean>
</beans>

注意:需要在 Service 文件中添加 setInjectionDAO 方法。property 中 name 对应 set*

构造注入

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8"?>
<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="injectionService" class="com.imooc.ioc.injection.service.InjectionServiceImpl">
<constructor-arg name="injectionDAO" ref="injectionDAO"></constructor-arg>
</bean>
<bean id="injectionDAO" class="com.imooc.ioc.injection.dao.InjectionDAOImpl"></bean>
</beans>

注意:需要在 Service 文件中添加构造方法。name 对应 service 中构造器参数名