闲聊

无论是做j2ee开发还是做j2se开发,spring都是一把大刀。当下流行的ssh三大框架中,spring是最不可替代的,如果不用hibernate和struts,我觉得都无关紧要,但是不能没有spring,可能有人说spring有啥用啊?直接new对象又有何妨,搞了个ioc这么麻烦,又难以理解,多了这么多配置,写代码时也没有感觉到它存在的价值,曾经我一直这么认为,就是带着这些疑问不断学习spring,渐渐了解它的价值。其实spring带来的不是某种持久化技术、mvc框架,缓存组件等等,它是一种设计思想(IOC,AOP),并且利用这种思想容纳百川。真正的高深的武功不是他的招式!

Ioc容器介绍

Ioc—Inversion of Control,即“控制反转”。这么拗口,谁起的名字也不知道。我要是起肯定直接叫“对象容器”,虽然不完全正确,但是基本就是这么个意思。把我们编写的一个个类定义好,注册到spring容器中,需要用到某个对象的使用不是直接new一个,而是从这个对象容器中取一个就好了。对象的创建原来可以不用new了直接取?这么吊,对就是这么吊。A类中引用了个B类,一般直接在B类中new B(),使用A类的时候new A()初始化的时候就会new B(),如果使用spring那就是直接get(“A”),而B会自动注入到A对象中。这就是“控制反转”:将创建对象的权利,反转给IOC容器。不知道这么说理解了没有,画个图来表达一下吧。

利用IOC我们在使用创建A对象的时候不用创建B对象,因为B对象由IOC创建好了,拿来就用就好了。“拿来主义多么的好”。

Ioc的作用

那么换成从spring容器中取对象有啥好处呢?我还不如直接new个对象来的方便直接,没有spring程序还不是照常运行。其实这么说没有错,new对象多么方便,但是有个词相信大家都听过“解耦”,就是软件中组件间要尽量减少耦合,解耦可以能够使软件易于维护,高复用。上面的A类在代码层次上跟B类的实现不关联,哪天B类被换成C类又何妨?

有人说A类中不是还有一个B类的引用吗?

没错,是有一个引用指向B对象,但是spring倡导的面相借口编程,A类中持有的是一个B类的接口,所以C类只要和B类是同一个接口即可。

正是有了IOC容器这种“控制反转”的设计思想,使得spring几乎可以兼容任何流行插件或框架。

使用spring-ioc难道就没有什么弊端吗?

原来在使用spring2.0的时候采用xml配置方式的时候,spring配置文件太多,太繁琐,但是这个问题在使用了注解方式之后就完全不存在了。

如果你的系统太小了,不用ioc又何妨呢?但是用了也没什么坏处,说不定哪天你的系统又大了呢?

Spring bean的三种配置方式

1、  xml配置方式:

优点:经典,spring提供的功能都可以通过xml方式配置实现;

缺点:每个类都要注册配置,繁琐!

2、  注解配置方式:

使用<context:component-scan base-package="www.xufei.com"/> 配置,spring就可以在初始化容器时扫描指定包下的注解,自动注册到IOC容器中,使用以下:@Component@ServiceController@repository这几个注解本身功能并没有差异,只是习惯上或者说命名上有差异,分别对应了开发中的服务层,控制层,DAO层。

优点:非常简单,强烈推荐

缺点:注解其实也算是侵入了代码,有些功能没有xml强大

3、  java配置方式:

使用@Configuration注解在java类上,创建对象的方法上使用 @Bean 注解,即可将方法返回的对象注册到IOC容器中。

优点:创建对象的过程清晰可见

缺点:配置的太多的话,好啰嗦啊!

一般都是使用在构建的对象非常复杂的情况的,我们需要手工给对象初始化值,便于修改维护。

最后

Spring的设计思想博大精深,有待继续学习思考。对有点东西的理解需要时间,时间到了就会茅塞顿开,恍然大悟。

闲谈Spring-IOC容器的更多相关文章

  1. Spring IoC容器的初始化过程

    Spring IoC容器的初始化包括 BeanDefinition的Resource定位.载入和注册 这三个基本的过程.IoC容器的初始化过程不包含Bean依赖注入的实现.Bean依赖的注入一般会发生 ...

  2. 【Spring】非Spring IOC容器下获取Spring IOC上下文的环境

    前言 在Spring Web项目中,有些特殊的时候需要在非Spring IOC容器下获取Spring IOC容器的上下文环境,比如获取某个bean. 版本说明 声明POM文件,指定需引入的JAR. & ...

  3. 学习Spring(一) 实例化Spring IoC容器

    实例化Spring IoC容器 1,读取其配置来创建bean实例 2,然后从Spring IoC容器中得到可用的bean实例 Spring提供两种IoC容器实现类型 a,一种为bean工厂 b,应用程 ...

  4. MyEclipse Spring 学习总结一 Spring IOC容器

    一.Spring IOC容器---- Spring AllicationContext容器 程序的结构如下: 1.首先在MyEclipse 创建创建Java Project 2.创建好后,添加spin ...

  5. 对Spring IoC容器实现的结构分析

    本文的目标:从实现的角度来认识SpringIoC容器. 观察的角度:从外部接口,内部实现,组成部分,执行过程四个方面来认识SpringIoC容器. 本文的风格:首先列出SpringIoC的外部接口及内 ...

  6. spring IOC容器实例化Bean的方式与RequestContextListener应用

    spring IOC容器实例化Bean的方式有: singleton 在spring IOC容器中仅存在一个Bean实例,Bean以单实例的方式存在. prototype 每次从容器中调用Bean时, ...

  7. 解读Spring Ioc容器设计图

    在Spring Ioc容器的设计中,有俩个主要的容器系列:一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器最基本的功能:另外一个是ApplicationContext应用上下 ...

  8. 纯注解快速使用spring IOC容器

    使用spring的ioc容器实现对bean的管理与基本的依赖注入是再经典的应用了.基础使用不在详述. 这里主要介绍下使用注解实现零配置的spring容器.我相信你也会更喜欢使用这种方式.Spring ...

  9. Spring IOC容器分析(2) -- BeanDefinition

    上文对Spring IOC容器的核心BeanFactory接口分析发现:在默认Bean工厂DefaultListableBeanFactory中对象不是以Object形成存储,而是以BeanDefin ...

  10. Spring IOC容器分析(4) -- bean创建获取完整流程

    上节探讨了Spring IOC容器中getBean方法,下面我们将自行编写测试用例,深入跟踪分析bean对象创建过程. 测试环境创建 测试示例代码如下: package org.springframe ...

随机推荐

  1. [SQL Server] 常用sql脚本

    1.添加表 GO IF NOT EXISTS(SELECT * FROM sys.tables WHERE name='table_name') BEGIN CREATE TABLE [dbo].[t ...

  2. jquery spa

    1.hashchange监听 2.根据url加载不同页面 $.ajax({ url:"/xx/xx.html" type:"get", dataType:&qu ...

  3. BOM对象和DOM对象

    一.BOM对象 BOM(Browser Object Model)是指浏览器对象模型,可以对浏览器窗口进行访问和操作.使用 BOM,开发者可以移动窗口.改变状态栏中的文本以及执行其他与页面内容不直接相 ...

  4. PHP开发错误锦集(持续更新)

    1.trait 命名问题. 问题:trait 里定义的方法找不到 <?php namespace app\controllers; trait Example { public function ...

  5. hdu2013 蟠桃记【C++】

    蟠桃记 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  6. 学习笔记——TCP“三次握手”和“四次挥手”,简单介绍

    TCP/IP协议中,TCP协议提供可靠的连接服务,采用“三次握手”建立一个连接. (1)第一次握手:客户端发送SYN包(SYN=j)到服务器,并进入SYN_SEND状态,等待服务器确认. (2)第二次 ...

  7. CODEVS1281 Xn数列 (矩阵乘法+快速乘)

    真是道坑题,数据范围如此大. 首先构造矩阵 [ f[0] , 1] * [ a,0 ] ^n= [ f[n],1 ] [ c,1 ] 注意到m, a, c, x0, n, g<=10^18,所以 ...

  8. [转]十五天精通WCF——第十四天 一起聊聊FaultException

     我们在玩web编程的时候,可能你会不经意的见到一些http500的错误,我想你应该不会陌生的,原因你应该也知道,服务器异常嘛, 这时候clr会把这个未处理的异常抛给iis并且包装成http500的错 ...

  9. Android图片异步载入框架Android-Universal-Image-Loader

    Android-Universal-Image-Loader是一个图片异步载入,缓存和显示的框架.这个框架已经被非常多开发人员所使用,是最经常使用的几个Android开源项目之中的一个,主流的应用,随 ...

  10. 【2014秋季版】【辛星php】【0】清晰的认识一下PHP语言

    *********************PHP情结***************** 1.假设您和我经历非常相似,也可能会有这种PHP情结,为什么呢.由于我最先学习的是Java.然后学习了C++,开 ...