闲聊

无论是做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. react typescript 子组件给父组件传值

    //父组件 import * as React from 'react'import { Input } from 'antd'const Search = Input.Searchimport &q ...

  2. 使用redis和简单token机制校验身份的思路

    1. 登录时生成token, 以token为键,以用户信息为值,存储在redis中,设置key过期时间 2. 需要身份验证的接口,带上token 3. 接口校验redis中token是否存在 4. 存 ...

  3. Mysql学习总结(41)——MySql数据库基本语句再体会

    1.数据定义语言(DDL):定义和管理数据对象,比如建立数据库.数据表 数据操作语言(DML):用于操作数据库对象中的包含的数据. 数据查询语言(DQL):用于查询数据库对象中包含的数据,能够对表进行 ...

  4. Java 注解之总结

    注解是Spring和Mybatis框架所大量使用的技术,要想掌握框架相关技术,注解是必须要掌握的. 掌握注解的优势: 1.能够读懂别人写的代码,特别是框架相关的代码. 2.本来可能需要很多配置文件,需 ...

  5. Tomcat 7源码学习笔记 -9 tomcat重启后session仍然保留

    使用Tomcat 7缺省的配置,tomcat关闭后重新启动,发现原来的session没有被删掉,用原来的request获取session仍然可以取到.但是并没有配置session持久化. 原因如下: ...

  6. Findbug插件静态java代码扫描工具使用

    本文转自http://blog.csdn.net/gaofuqi/article/details/22679609 感谢作者 FindBugs 是由马里兰大学提供的一款开源 Java静态代码分析工具. ...

  7. Java:解决Servlet的UTF8编码问题

    要让Servlet支持UTF8,需要在doGet或者doPost中添加如下一条语句: request.setCharacterEncoding("UTF-8");

  8. 怎样用Android Studio打多包名APK

    问题:项目中不同的分发渠道可能须要打包多种APK(相同的代码),包名可能是不一样的,假设一个一个改动包名又一次编apk是非常麻烦,能够參考下列步骤在Android Studio上操纵Gradle来打包 ...

  9. boost::shared_ptr

    boost::shared_ptr是boost库中用来管理指针的模板,使用它需要#include <boost/shared_ptr.hpp>.本文介绍它的一些基本用法. 第一,boost ...

  10. Android --------- 自己定义VIew

    package com.example.coustomviewdemo; import android.R.interpolator; import android.content.Context; ...