浅谈Spring IOC容器构建

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容器。

2.1:IOC容器的特点

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

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

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

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

2.2:IOC容器问题的关键

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

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

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

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

2.3:DI问题的关键

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

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

2.4:DI的优点

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

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

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

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


3:IOC容器的构建

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

        

        操作的流程大致如下

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

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

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

3.1:SpringIOC的构建方式

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

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

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

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

        

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

3.2:通过XML配置的方式构建IOC容器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:contex="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="iocone" class="com.myspring713.ioc_one"/>
    <bean id="ioctow" class="com.myspring713.ioc_two"/>

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

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

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


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

    <bean id="iocone" class="com.myspring713.ioc_one">
        <constructor-arg name="name" value="张三"/>
        <constructor-arg name="year" value="18"/>
    </bean>

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

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

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;


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

    @Bean(name = "hashmap")
    public HashMap<Integer, String> GetHashMap() {
        HashMap<Integer, String> hashMap = new HashMap<Integer, String>();
        hashMap.put(1, "一");
        hashMap.put(2, "二");
        hashMap.put(3, "三");
        hashMap.put(4, "四");
        return hashMap;
    }

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context =
                new AnnotationConfigApplicationContext(BlogConfigApplication.class);
        String string = (String) context.getBean("Hello");
        HashMap<Integer,String> hashMap = (HashMap) context.getBean("hashmap");
        System.out.println(string);
        System.out.println(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容器的构建就总结到这里,仅供自己学习使用。

猜你喜欢

转载自blog.csdn.net/qq_38449518/article/details/81040318
今日推荐