Spring4 之 IOC & DI àì夳堔傛蜴生んèń 2022-06-05 00:49 172阅读 0赞 ## **Spring4 之 IOC & DI** ## ## **前言** ## 本节我们学习一下 Spring IOC 和 DI。首先我们了解一下什么时Spring。 Spring 为简化企业级应用开发而生的一个开源框架. 使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能。从Spring 的内部结构看,Spring 是一个 IOC(DI) 和 AOP 容器框架。 具体描述一下Spring * **Light Weight**:Spring 是非侵入性的 - 基于 Spring 开发的应用中的对象可以不依赖于 Spring 的 API * **Inversion of Control**:依赖注入(DI — dependency injection、IOC) * **aspect oriented programming**:面向切面编程 * **container**:Spring 是一个容器, 因为它包含并且管理应用对象的生命周期 * **Framework**:Spring 实现了使用简单的组件配置组合成一个复杂的应用. 在 Spring 中可以使用 XML 和 Java 注解组合这些对象 * **One-Stop(一站式)**:在 IOC 和 AOP 的基础上可以整合各种企业应用的开源框架和优秀的第三方类库 (实际上 Spring 自身也提供了展现层的 SpringMVC 和 持久层的 Spring JDBC) * **Spring Architecture** ![这里写图片描述][SouthEast] -------------------- ## **概念** ## * **IOC(Inversion of Control)** 其思想是反转资源获取的方向. 传统的资源查找方式要求组件向容器发起请求查找资源. 作为回应, 容器适时的返回资源. 而应用了 IOC 之后, 则是容器主动地将资源推送给它所管理的组件, 组件所要做的仅是选择一种合适的方式来接受资源. 这种行为也被称为查找的被动形式 * **DI(Dependency Injection)** IOC 的另一种表述方式:即组件以一些预先定义好的方式(例如: setter 方法)接受来自如容器的资源注入. 相对于 IOC 而言,这种表述更直接 -------------------- ## **IOC Container** ## 在 Spring IOC 容器读取 Bean 配置创建 Bean 实例之前, 必须对它进行实例化. 只有在容器实例化后, 才可以从 IOC 容器里获取 Bean 实例并使用。 Spring 提供了两种类型的 IOC 容器实现 * BeanFactory: IOC 容器的基本实现 * BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身 * ApplicationContext: 提供了更多的高级特性. 是 BeanFactory 的子接口 * ApplicationContext 面向使用 Spring 框架的开发者,几乎所有的应用场合都直接使用 ApplicationContext 而非底层的 BeanFactory ![这里写图片描述][SouthEast 1] * ApplicationContext 的主要实现类 * ClassPathXmlApplicationContext:从 类路径下加载配置文件 * FileSystemXmlApplicationContext: 从文件系统中加载配置文件 * ConfigurableApplicationContext * 扩展于 ApplicationContext,新增加两个主要方法:refresh() 和 close(), 让 ApplicationContext 具有启动、刷新和关闭上下文的能力 * ApplicationContext * 在初始化上下文时就实例化所有单例的 Bean。 * WebApplicationContext * WebApplicationContext 是专门为 WEB 应用而准备的,它允许从相对于 WEB 根目录的路径中完成初始化工作 -------------------- ## **DI** ## 在Spring目前支持 3 依赖注入方式。 * 属性注入 * 属性注入即通过 setter 方法注入Bean 的属性值或依赖的对象 * 属性注入使用 元素, 使用 name 属性指定 Bean 的属性名称,value 属性或 子节点指定属性值 * 属性注入是实际应用中最常用的注入方式 * **一个栗子** 其中 Orders 是一个 Entity。 <bean id="orderOne" class="com.spring.example.entiry.Orders"> <property name="orderId" value="123465798"></property> <property name="tradeArea" value="PECIA"></property> <property name="tradeTime" value="July,12th,2017"></property> </bean> * 构造器注入 * 通过构造方法注入Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用 * 构造器注入在 元素里声明属性, 中没有 name 属性 * **一个栗子** <bean id = "jedisPool" class="redis.clients.jedis.JedisPool"> <constructor-arg index="0" ref="jedisPoolConfig"/> <constructor-arg index="1" value="${redis.host}"/> <constructor-arg index="2" value="${redis.port}" type="int"/> <constructor-arg index="3" value="${redis.timeout}" type="int"/> <constructor-arg index="4" value="${redis.password}"/> </bean> * 工厂方法注入(很少使用,不推荐) -------------------- ## **小结** ## * 就目前而言Spring 是一个非常优秀的Framework。在项目使用时Spring 不仅大大地提高了开发效率还能满足不同的扩张需求(比如与第三方 Dev. Tool相结合)。 * IOC 和 DI是 Spring 的两个核心体现。 [SouthEast]: /images/20220605/4c239ef46c764c56afdde18ec2c63de0.png [SouthEast 1]: /images/20220605/ef1e81563276499bb97200c006a9018b.png
还没有评论,来说两句吧...