一、Spring2大核心之一IOC

标签: spring ioc 解耦 bean工厂
7人阅读 评论(0) 收藏 举报
分类:

一、Spring2大核心之一IOC

一、spring简介及作用

Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。
spring主要包括两个核心IOC和AOP,本节主要来看spring核心之一的AOP

二、关于传统编程的耦合问题

1.传统Java 程序中,我们直接在对象内部通过new进行创建对象,这样我们程序就主动引入了依赖关系,单依赖关系发生变化修改,甚至我们还没有编写好依赖对象时,我们的代码就会报错,这对我们的后期维护,以及分模块开发造成极大的不变。
由此我们需要解耦合,及将强耦合变为松散耦合。
强耦合:例如直接new对象
松散耦合:面向接口编程,通过反射、配置文件、注解等创建对象,这就涉及到spring的核心之一IOC
2.耦合的分类:(源于百度百科)
耦合按从强到弱的顺序可分为以下几种类型:
(1)内容耦合。当一个模块直接修改或操作另一个模块的数据,或者直接转入另一个模块时,就发生了内容耦合。此时,被修改的模块完全依赖于修改它的模块。
(2)公共耦合。两个以上的模块共同引用一个全局数据项就称为公共耦合。
(3)外部耦合。若一组模块都访问同一全局数据项,则称为外部耦合。
(4)控制耦合。一个模块在界面上传递一个信号(如开关值、标志量等)控制另一个模块,接收信号的模块的动作根据信号值进行调整,称为控制耦合。
(5)标记耦合。模块间通过参数传递复杂的内部数据结构,称为标记耦合。此数据结构的变化将使相关的模块发生变化。
(6)数据耦合。模块间通过参数传递基本类型的数据,称为数据耦合。
(7)非直接耦合。模块间没有信息传递时,属于非直接耦合。
如果模块间必须存在耦合,就尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,坚决避免使用内容耦合。

三、IOC

Inversion of Control,即“控制反转”不是一种技术,是一种设计思想

谁控制谁,控制什么:传统Java 程序中,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建

为何是反转,哪些方面反转了:传统JAVA程序中,由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,依赖对象的获取被反转了。

四、使用ioc创建对象

传统方式创建对象

  //创建对象  主动引入了依赖AccountServiceImpl,如若该类没有写(分模块开发时,业务层可能由其他人完成),或者后期维护类名被修改时候,web层也需要进行修改
  AccountService accountService = new AccountServiceImpl();
  //调用方法
  accountService.addAccount();

ioc创建对象测试方法


//1.创建spring容器:ApplicationContext , 需要在类路径下创建一个bean.xml的spring配置文件
 ApplicationContext ac = new ClassPathXmlApplicationContext("config/bean.xml");
//2.从容器中获取对象
AccountService accountService = (AccountService)ac.getBean("accountService"); //通过唯一标识,从容器中获
//3.调用对象的方法 调用账户的添加方法
accountService.addAccount();

bean.xml配置文件


<?xml version="1.0" encoding="UTF-8"?>
<!-- 导入约束 :xsd -->
<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">


    <!-- 创建accoutDao交给spring容器管理 -->
    <bean id="accountService" class="cn.itcast.dao.impl.AccountServiceImpl"></bean>
</beans>

五、关于IOC的工厂模式(scope作用域)

1.多例工厂(scope属性值为prototype)
调用一次创建一个对象
通过获取接口的实现类对象所的全限定类名,反射创建对象
2.单例工厂:(scope属性值为singleton,spring默认模式)
1).创建对象
①.第一此访问:创建对象并存储到容器(key-value类型,类似map)
②.从内存(容器)中获取已创建好的对象
2).其他的线程都是使用以创建好的对象

六、IOC在spring中创建对象,交给spring容器管理的三种方式

1.bean标签直接创建(

<bean id="accountService"  class="cn.it.service.impl.AccountServiceImpl" ></bean>

2.静态工厂

1.AccountServiceImpl的静态工厂
2.通过工厂的静态方法创建对象
<bean id="accountServiceStaticFactory" class="cn.it.factory.StaticFactory" factory-method="getAccountService"></bean>

3.实例化工厂

1.实例化工厂(创建工厂对象交给spring容器管理)
<bean id="accoutServiceFactory" class="cn.it.factory.DymicFactory"></bean>
2.通过实例化工厂创建AccountServiceImpl对象
<!-- 通过工厂创建对象:accountServiceImpl -->
<bean id="accountServiceDymicFactory" factory-bean="accoutServiceFactory" factory-method="getAccountService"></bean>
   //实例化工厂方法
   public class BeanFactory {
      public UserService getUserService() {
            return new UserServiceImpl();
                           }
  }
  //静态工厂方法
  public class StaticBeanFactroy {

    public static UserService getUserService() {

        return new UserServiceImpl();
    }
}

七、知识点

1.创建对象交给spring容器管理
bean
id : 唯一标识 (不能重复,可以通过id从spring容器中获取对象)
class:实现类的全限定类名(要交给spring管理的类)

2 创建对象的作用域scope属性
scope :(默认值:singleton)
singleton :单例,创建单实例对象,随着容器的创建而创建,随着容器的关闭而销毁
prototype :多例,创建多实例对象,一个请求创建一次对象,自动垃圾回收
request :http请求,创建对象存入request域中(一般不用)
session :httpsession,创建对象存入session域中(一般不用)

init-method : 初始化方法 (对象中方法名称)
创建对象之后,立即执行对象中的方法
destory-method:销毁方法 (对象中方法名称)
销毁对象之前,立即执行的对象中的方法

    <bean id="accountService" init-method="init"  destroy-method="destory" scope="prototype" class="cn.it.service.impl.AccountServiceImpl"></bean>
查看评论

Spring三大核心思想之三:AOP

一.前言     在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://w...
  • zcs20082015
  • zcs20082015
  • 2017-08-09 13:19:42
  • 891

啃啃老菜:Spring IOC核心源码学习(一)

啃啃老菜:Spring IOC核心源码学习(一)   本文主要以spring ioc容器基本代码骨架为切入点,理解ioc容器的基本代码组件结构,各代码组件细节剖析将放在后面的学习文章里。   ...
  • novelly
  • novelly
  • 2014-02-20 20:34:32
  • 705

深入理解Spring的两大特征(IOC和AOP)

众所周知,Spring的核心特性就是IOC和AOP,IOC(Inversion of Control),即“控制反转”;AOP(Aspect-OrientedProgramming),即“面向切面编程...
  • gloomy_114
  • gloomy_114
  • 2017-04-05 11:46:53
  • 23531

Spring三大核心思想一:IOC

首先,spring最核心,最基础的概念是什么?将spring类比java,java最核心,最基础的概念就是object了。java中,所有的操作都是针对object的(基础类型除外),java中,一切...
  • zcs20082015
  • zcs20082015
  • 2017-08-09 13:11:56
  • 424

Spring(2)--Spring核心机制:依赖注入

Spring的核心机制就是Ioc(控制反转)容器,IoC的另外一个称呼就是依赖注入(DI),通过依赖注入,JavaEE应用中的各种组件不需要以硬编码的方法进行耦合,当一个Java实例需要其他Java实...
  • an_2016
  • an_2016
  • 2016-08-05 00:08:10
  • 1844

Spring源码剖析——核心IOC容器原理

IOC介绍  相信大多数人在学习Spring时 IOC 和 Bean 算得上是最常听到的两个名词,IOC在学习Spring当中出现频率如此之高必然有其原因。如果我们做一个比喻的话,把Bean说成Spr...
  • lisongjia123
  • lisongjia123
  • 2016-08-05 15:06:16
  • 6018

深入剖析Spring(一)——IoC的基本概念(从面向对象角度介绍)

IoC与DIIoC和DI是Spring的两个核心概念,很多人都把它们视为相同的东西,但事实并非如此。 IoC(Inversion of Control):控制反转。 DI(Dependency I...
  • u010425776
  • u010425776
  • 2017-02-16 18:30:59
  • 1852

Spring两大核心-AOP和IoC

1、IoC(Iinversion of Control,控制反转)。IoC的本质是实现了对象只见一栏关系的转移。通过使用Spring框架,开发人员将不在 自己的代码中维护对象之间的依赖关系,只需要在...
  • Ghost_T
  • Ghost_T
  • 2010-08-31 14:16:00
  • 6810

Spring核心组件-IOC的介绍

Spring核心组件包括IOC和AOP,我们主要学习的就是这俩个模块 (1)、Spring Core(IOC) 核心容器,提供组件的创建、装备、销毁 (2)、Spring Context Spri...
  • qq_33642117
  • qq_33642117
  • 2016-07-13 19:22:01
  • 587

spring的两大核心技术之一:控制反转

Spring框架的核心就是控制反转(Inversion of Control)和依赖注入(Dependency Injection),通过这两方面来实现松耦合。     使用IoC,对象是被动的接受依...
  • Ideality_hunter
  • Ideality_hunter
  • 2016-05-24 09:04:39
  • 1240
    个人资料
    等级:
    访问量: 0
    积分: 157
    排名: 0
    文章存档
    最新评论