闲聊

无论是做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. linux中的umask命令

    转载:http://blog.51cto.com/1123697506/882064 一 权限掩码umask umask是chmod配套的,总共为4位(gid/uid,属主,组权,其它用户的权限),不 ...

  2. Linq表达式写法

    Linq表达式,实现按照某个字段排序的简单写法. 做项目的时候遇到的一个简单问题,于是记下来. 列举一个例子: <T> model=new <T>(); 加入model中有要根 ...

  3. vue 底部bottomnav

    <template> <div id="foot"> <div class="tabBar"> <div class= ...

  4. 【Codeforces 1B】Spreadsheets

    [链接] 我是链接,点我呀:) [题意] A~Z分别对应了1~26 AA是27依次类推 让你完成双向的转换 [题解] 转换方法说实话特别恶心>_< int转string 得像数位DP一样一 ...

  5. hdu_1285_确定比赛名次_201312081335

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  6. 【ACM】nyoj_14_会场安排问题_201308151955

    会场安排问题时间限制:3000 ms  |  内存限制:65535 KB 难度:4描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办.小刘的工作就是安 ...

  7. MySQL Master High Available 理论篇(一)

  8. 解释为什么word2vec也被称作deep learning

    作者:orangeprince链接:https://www.zhihu.com/question/27689129/answer/39117725来源:知乎著作权归作者所有.商业转载请联系作者获得授权 ...

  9. 理解linux安装软件

    http://www.codecoffee.com/tipsforlinux/articles/27.html -------------------------------------------- ...

  10. 多个机器获取微信access-token导致的有效性问题

    多个机器获取微信access-token导致的有效性问题 单个机器获取的access-token,只有最后一个是有效的: 多个机器各自获取自己的access-token,都是各自有效的: 在服务器和本 ...