springIoc容器详解

闲聊

无论是做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的设计思想博大精深,有待继续学习思考。对有点东西的理解需要时间,时间到了就会茅塞顿开,恍然大悟。

时间: 2024-10-08 09:46:58

springIoc容器详解的相关文章

Spring-- IOC容器详解(转)

Spring作为一个在java界广泛使用且评价颇高的一个开源框架,给我们提供了好多的功能,极大的方便了我们的开发.此处我介绍IOC容器和AOP概念. IOC(Inversion of Control)控制反转:本来是由应用程序管理的对象之间的依赖关系,现在交给了容器管理,这就叫控制反转,即交给了IOC容器,Spring的IOC容器主要使用DI方式实现的.不需要主动查找,对象的查找.定位和创建全部由容器管理. 通俗点说就是不创建对象.以前我们要调用一个对象的方法,首先要new一个对象.但使用IOC

Cocos2d-x3.0模版容器详解之三:cocos2d::Value

1.概述 版本: v3.0 beta 语言: C++ 定义在 "COCOS2DX_ROOT/cocos/base" 路径下的 "CCValue.h" 的头文件中. ? 1 class Value; cocos2d::Valie 是一个包含了很多原生类型(int,float,double,bool,unsigned char,char* 和 std::string)外加 std::vector<Value>, std::unordered_map<s

Cocos2d-x3.0模版容器详解之——cocos2d::Vector&lt;T&gt;, cocos2d::Map&lt;K,V&gt;, cocos2d::Value

Cocos2d-x3.0模版容器详解之一:cocos2d::Vector<T>  http://www.cocoachina.com/bbs/read.php?tid=199793Cocos2d-x3.0模版容器详解之二:cocos2d::Map<K,V>  http://www.cocoachina.com/bbs/read.php?tid=199916Cocos2d-x3.0模版容器详解之三:cocos2d::Value  http://www.cocoachina.com/b

关联容器详解(一)

本文为对<C++ primer (中文版第五版)>中有关关联容器的讲解和网上大神们的博客整理而成. 关联容器和顺序容器的根本不同在于:关联容器中的元素是按关键字来保存和访问的,而顺序容器中的元素则是按它们在容器中的位置来顺序保存和访问的.顺序容器有vector.deque.list.forward_list.array.string等,更多详情,可见melonstreet的博客. 关联容器支持高效的关键字查找和访问.主要的关联容器类型是map和set,其中map中的元素是一些关键字-值(key

SpringIOC框架详解

1.SpringIOC是什么? 就是一个用来管理实体类bean的容器 2.创建cppdy.xml文件(模拟springmvc.xml文件) <?xml version="1.0" encoding="UTF-8"?> <beans> <bean id="user1" class="com.cppdy.UserTest"> <property key="name" v

搭建部署Docker容器详解实操

Docker 容器 :    容器是Docker又一核心的概念,简单来说,容器是独立运行的一个或一组应用,以及它们的运行态环境.对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用. 接下来具体介绍如何管理一个容器,包括创建.启动和停止等. 启动容器有两种方式:          (1.) 第一种是基于镜像新建一个容器并启动.   所需要的命令主要为docker run    实例:            -t:让docker分配一个为终端(pase

Spring框架:Spring容器详解

Spring容器 Spring容器可以帮助你管理所有的Bean对象,专业术语称之为IoC控制反转.在传统的程序中,对象的生成都是由开发者完成的.而在控制反转中,对象的生成全部都交给框架完成.这样的好处就是减少了程序的依赖性. Bean在Spring中的生命周期如下: 实例化.Spring通过new关键字将一个Bean进行实例化,JavaBean都有默认的构造函数,因此不需要提供构造参数. 填入属性.Spring根据xml文件中的配置通过调用Bean中的setXXX方法填入对应的属性. 事件通知.

Docker 容器详解

容器是 Docker 又一核心概念,简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境.对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用. 本章将具体介绍如何来管理一个容器,包括创建.启动和停止等. 启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动. 新建并启动 所需要的命令主要为docker run 下面的命令则启动一个 bash 终端,允许用户进行交互. -t 选项让 D

list容器详解

首先说说STL ( STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件.STL现在是C++的一部分,因此不用额外安装什么.它被内建在你的编译器之内.因为STL的list是一个简单的容器,所以我打算从它开始介绍STL如何使用.如果你懂得了这个概念,其他的就都没有问题了.另外,list容器是相当简单的,我们会看到这一点. STL容器可以保存对象,内建对象和类对象.它们会安全的保存对象,并定义我们能够操作的这个对象的接口.放在蛋架上的鸡蛋不会滚到桌上.它们很安全.因此,在STL容器中的对