闲谈Spring-IOC容器
闲聊
无论是做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,@Service,Controller,@repository,这几个注解本身功能并没有差异,只是习惯上或者说命名上有差异,分别对应了开发中的服务层,控制层,DAO层。
优点:非常简单,强烈推荐
缺点:注解其实也算是侵入了代码,有些功能没有xml强大
3、 java配置方式:
使用@Configuration注解在java类上,创建对象的方法上使用 @Bean 注解,即可将方法返回的对象注册到IOC容器中。
优点:创建对象的过程清晰可见
缺点:配置的太多的话,好啰嗦啊!
一般都是使用在构建的对象非常复杂的情况的,我们需要手工给对象初始化值,便于修改维护。
最后
Spring的设计思想博大精深,有待继续学习思考。对有点东西的理解需要时间,时间到了就会茅塞顿开,恍然大悟。
闲谈Spring-IOC容器的更多相关文章
- Spring IoC容器的初始化过程
Spring IoC容器的初始化包括 BeanDefinition的Resource定位.载入和注册 这三个基本的过程.IoC容器的初始化过程不包含Bean依赖注入的实现.Bean依赖的注入一般会发生 ...
- 【Spring】非Spring IOC容器下获取Spring IOC上下文的环境
前言 在Spring Web项目中,有些特殊的时候需要在非Spring IOC容器下获取Spring IOC容器的上下文环境,比如获取某个bean. 版本说明 声明POM文件,指定需引入的JAR. & ...
- 学习Spring(一) 实例化Spring IoC容器
实例化Spring IoC容器 1,读取其配置来创建bean实例 2,然后从Spring IoC容器中得到可用的bean实例 Spring提供两种IoC容器实现类型 a,一种为bean工厂 b,应用程 ...
- MyEclipse Spring 学习总结一 Spring IOC容器
一.Spring IOC容器---- Spring AllicationContext容器 程序的结构如下: 1.首先在MyEclipse 创建创建Java Project 2.创建好后,添加spin ...
- 对Spring IoC容器实现的结构分析
本文的目标:从实现的角度来认识SpringIoC容器. 观察的角度:从外部接口,内部实现,组成部分,执行过程四个方面来认识SpringIoC容器. 本文的风格:首先列出SpringIoC的外部接口及内 ...
- spring IOC容器实例化Bean的方式与RequestContextListener应用
spring IOC容器实例化Bean的方式有: singleton 在spring IOC容器中仅存在一个Bean实例,Bean以单实例的方式存在. prototype 每次从容器中调用Bean时, ...
- 解读Spring Ioc容器设计图
在Spring Ioc容器的设计中,有俩个主要的容器系列:一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器最基本的功能:另外一个是ApplicationContext应用上下 ...
- 纯注解快速使用spring IOC容器
使用spring的ioc容器实现对bean的管理与基本的依赖注入是再经典的应用了.基础使用不在详述. 这里主要介绍下使用注解实现零配置的spring容器.我相信你也会更喜欢使用这种方式.Spring ...
- Spring IOC容器分析(2) -- BeanDefinition
上文对Spring IOC容器的核心BeanFactory接口分析发现:在默认Bean工厂DefaultListableBeanFactory中对象不是以Object形成存储,而是以BeanDefin ...
- Spring IOC容器分析(4) -- bean创建获取完整流程
上节探讨了Spring IOC容器中getBean方法,下面我们将自行编写测试用例,深入跟踪分析bean对象创建过程. 测试环境创建 测试示例代码如下: package org.springframe ...
随机推荐
- [SQL Server] 常用sql脚本
1.添加表 GO IF NOT EXISTS(SELECT * FROM sys.tables WHERE name='table_name') BEGIN CREATE TABLE [dbo].[t ...
- jquery spa
1.hashchange监听 2.根据url加载不同页面 $.ajax({ url:"/xx/xx.html" type:"get", dataType:&qu ...
- BOM对象和DOM对象
一.BOM对象 BOM(Browser Object Model)是指浏览器对象模型,可以对浏览器窗口进行访问和操作.使用 BOM,开发者可以移动窗口.改变状态栏中的文本以及执行其他与页面内容不直接相 ...
- PHP开发错误锦集(持续更新)
1.trait 命名问题. 问题:trait 里定义的方法找不到 <?php namespace app\controllers; trait Example { public function ...
- hdu2013 蟠桃记【C++】
蟠桃记 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- 学习笔记——TCP“三次握手”和“四次挥手”,简单介绍
TCP/IP协议中,TCP协议提供可靠的连接服务,采用“三次握手”建立一个连接. (1)第一次握手:客户端发送SYN包(SYN=j)到服务器,并进入SYN_SEND状态,等待服务器确认. (2)第二次 ...
- CODEVS1281 Xn数列 (矩阵乘法+快速乘)
真是道坑题,数据范围如此大. 首先构造矩阵 [ f[0] , 1] * [ a,0 ] ^n= [ f[n],1 ] [ c,1 ] 注意到m, a, c, x0, n, g<=10^18,所以 ...
- [转]十五天精通WCF——第十四天 一起聊聊FaultException
我们在玩web编程的时候,可能你会不经意的见到一些http500的错误,我想你应该不会陌生的,原因你应该也知道,服务器异常嘛, 这时候clr会把这个未处理的异常抛给iis并且包装成http500的错 ...
- Android图片异步载入框架Android-Universal-Image-Loader
Android-Universal-Image-Loader是一个图片异步载入,缓存和显示的框架.这个框架已经被非常多开发人员所使用,是最经常使用的几个Android开源项目之中的一个,主流的应用,随 ...
- 【2014秋季版】【辛星php】【0】清晰的认识一下PHP语言
*********************PHP情结***************** 1.假设您和我经历非常相似,也可能会有这种PHP情结,为什么呢.由于我最先学习的是Java.然后学习了C++,开 ...