频道栏目
首页 > 资讯 > 其他 > 正文

浅谈Spring IOC容器构建

18-07-21        来源:[db:作者]  
收藏   我要投稿

1、Spring开源框架的简介

Spring是一个在2003年兴起的一个轻量级的Java开发框架,是为了解决企业应用开发的复杂性而创建的,框架的主要优势之一是分层架构,分层架构可以让开发者随意的选择任何一个组件来进行开发。但是Spring的用途不仅仅局限于服务器端的开发,从简便性、可测试性和低耦合的角度来看,Spring框架可以使几乎所有Java程序从中受益。

简单来说,Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。

IOC(Inversion Of Control):控制反转(控制权从应用程序转移到框架本身,如IOC容器),是框架的共有特性。

IOC容器:实现了IOC思想的容器就叫做IOC容器,就是具有依赖注入功能的容器,是可以创建对象的容器,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。一般来说,new一个实例,控制权由程序员控制,而"控制反转"是指new实例工作不由程序员来做而是交给Spring容器来做。

AOP(Aspect Oriented Programming):面向切面编程,其思想是在执行某些代码之前先执行另外的代码,使程序更灵活,扩展性更好,可以说随意的添加,删除某些功能。

Spring的基本框架主要包含六大模块:DAO,WEB,CORE,ORM,JEE,AOP

Spring DAO:Spring提供对JDBC操作的支持。

Spring ORM:Spring和ORM框架整合,例如Spring整合了Hibernate框架,其中Spring还提供了一些工具类,简化了Hibernate框架的操作。

Spring WEB:Spring提供了对Struts、Springmvc的支持,支持WEB开发。与此同时Spring自身也提供了基于MVC的解决方案。

Spring AOP:Spring提供面向切面的编程,可以给某一层提供事务管理。

Spring JEE:J2EE提供的规范支持,例如EJB。

Spring Core:提供IOC容器对象的创建和处理对象关系。

由于知识有限,本博客只介绍Spring Core的IOC容器构建

2、Spring中的IOC容器和DI

DI:依赖注入( Dependency Injection ):用一个单独的对象(装配器)来装配对象之间的依赖关系 ,IOC容器应具有依赖注入的功能,因此也可以叫做DI容器。

21:IOC容器的特点

(1):不需要主动new对象,只需要描述对象如何被创建即可,IOC容器会自动创建对象。

(2):不需要主动装配对象之间的依赖关系,而是描述需要哪个服务(组件),IOC容器会自动帮助装配(负责将他们关联到一起),被动接受装配。

(3):迪米特法则:不用知道依赖的具体实现,只知道需要提供某类服务的对象(面向抽象编程),松散耦合,一个对象应当对其他对象有尽可能少的了解。

(4):IoC是一种让服务消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖的设计原则。

22:IOC容器问题的关键

1:以前是由应用程序控制,现在是由IOC容器控制,所以叫做控制反转。

2:控制的使应用程序所需要的资源(文件,对象)。

3:因为要解耦组件之间的关系,所以需要控制。

4:控制反转的是程序的控制权,从应用程序转移到了IOC容器。

23:DI问题的关键

1:应用程序依赖于IOC容器的装配功能。

2:IOC容器将程序需要的资源(类之间的依赖关系)注入应用程序。

24:DI的优点

1:看清组件之间的依赖关系,我们只需要观察依赖注入的机制,就可以掌握整个依赖(类与类之间的关系)。

2:组件与组件之间的依赖关系由容器在运行期决定,即有容器动态将依赖关系注入到组件之中。

3:依赖注入的目标并非为软件系统带来更多的功能,而是为了提升组件重用的概率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不用关心具体的资源来自何处、由谁实现。

但是,由于DI的限制,组件与IOC容器之间并不会存在依赖关系,所以组件只能获得配置信息中提供的服务,无法获得更多的信息。

3:IOC容器的构建

Spring框架实际上是IOC的容器,同时也有DI的功能,下面将介绍如何创建SpringIOC容器,首先看下面的关系图。

操作的流程大致如下

1:容器从Bean的配置文件中获取Bean的配置信息,Bean的配置信息可以由三种方式来创建,接下来会介绍。

2:在实例化Bean的时候直接通过Bean的配置信息来获取实例化对象(相当于new操作),并存入Bean的缓存池中。

3:应用程序在使用Bean的实例化对象时直接从容器的缓存池中拿就可以了。

31:SpringIOC的构建方式

1:基于XML配置的方式 (可以开启注解配置,通过注解配置Bean和装配工作)

2:基于Goovy脚本配置的方式(也称:Spring's Groovy Bean Definition DSL )

3:基于Java Config的配置注解方式 (主要通过Configuration和Bean注解)

目前最广泛使用的时第一种和第三种两种构建方式,方法二必须要求开发者先掌握Goovy编程,门槛较高,所以在这篇博客里我先不做介绍。

这三种方式本质上都属于于Configuration Metadata配置,通过配置来完成容器的组装。

32:通过XML配置的方式构建IOC容器



    
    

ApplicationContext context = new ClassPathXmlApplicationContext("applacation-contextxml");//创建IOC容器,配置文件选择一个xml文件
ioc_one ioc_one = (commyspring713ioc_one) contextgetBean("iocone");通过xml中的bean的id来创建对象(默认为Object类型)

XML文件中的bean标签存放类的信息,id属性相当于标志,容器在创建该类的实例化对象只需要指定bean的id就可以创建了。class属性描述bean的实现类的位置。

注意:实现类中如果没有默认的无参构造的话,在描述的时候就必须加上构造方法。

这是一个没有默认无参构造的类,所以,对bean的描述应该改为

    
        
        
    

constructor标签用来描述构造方法,name属性描述类中定义的属性名称,value属性后面加上实例化时需要传入的属性值。例如上面的代码就是在实例化对象的时候把name属性变为“张三”,year属性变为18。

33:基于Java Config的配置注解方式构建IOC容器
这种配置方式现在比较流行,通过使用注解,把一个Java类变成Bean的配置文件,先看代码。
package commyspring713;

import orgspringframeworkcontextannotationAnnotationConfigApplicationContext;
import orgspringframeworkcontextannotationBean;
import orgspringframeworkcontextannotationConfiguration;

import javautilHashMap;


@Configuration
public class BlogConfigApplication {
    @Bean(name = "Hello")
    public String Hello() {
        return "hello world";
    }

    @Bean(name = "hashmap")
    public HashMap GetHashMap() {
        HashMap hashMap = new HashMap();
        hashMapput(1, "一");
        hashMapput(2, "二");
        hashMapput(3, "三");
        hashMapput(4, "四");
        return hashMap;
    }

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context =
                new AnnotationConfigApplicationContext(BlogConfigApplicationclass);
        String string = (String) contextgetBean("Hello");
        HashMap hashMap = (HashMap) contextgetBean("hashmap");
        Systemoutprintln(string);
        Systemoutprintln(hashMap);

    }
}
这种配置方法通过使用@configuration注解,直接把Java类变为了配置文件。这里的@Bean注解相当于XML配置中的Bean标签。注解后括号里的name属性相当于XML配置中的id属性。这里是简单的演示所以只用了几个注解(其实还有很多)。在创建IOC容器的时候配置文件选择的是这个Java类的class文件。对象的创建和XML方法配置的时候一样。

目前最常用的配置方式就是这两种了,不过XML的配置方式更有利于Spring的学习,原因有以下几点

1:XML配置方式是Spring最早支持的方式

2:XML十分严谨,可以在使用的时候避免一些错误

3:XML可视化比较好,通过XML可是较为直观的看到整个容器中的Bean的关联关系

4:XML可以让开发者更好的理解Spring中的一些概念

关于Spring的介绍以及IOC容器的构建就总结到这里

相关TAG标签
上一篇:java读写锁基础:java api并发库中 ReentrantReadWriteLock自带的实例
下一篇:开发中的垂直居中和水平居中方法总结
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站