spring的原理

来源:互联网 发布:python post 文件 编辑:程序博客网 时间:2024/05/22 08:08

我们在工作的时候,如果使用的是Java,基本没有不使用spring的,虽然我们都知道怎么去用,但是却没有去理解为什么要这么用,为什么能这么用,开发spring的人员为什么能设计出这个优秀的框架,我们又要使用什么思维去理解,下面就简单介绍一下spring的原理。

1、首先需要知道的,spring使用的IOC和DI,也就是控制反转和依赖注入:
控制反转:举例来说,我们如果要吃饭,用程序来实现的话,我们就要去创建食物,创建餐具,然后才能把米饭做好。而如果使用了控制反转,相当于我直接叫了份外卖,我需要米饭对象,我直接要别人给我送过来就可以了。这就是控制反转

依赖注入:既然控制反转已经知道了,那么什么是依赖注入?依赖注入是实现控制反转的方式。也就是我们上面说的要别人送饭过来,而不需要我自己去做饭。至于为什么spring能够提供这样一个类似外卖的供应商,底层是使用到了注解(或xml)和java的反射机制的。

2、我们来看一下初始化spring容器的代码:

public static void main(String[] args) {        ApplicationContext context = new FileSystemXmlApplicationContext(                "applicationContext.xml");        Animal animal = (Animal) context.getBean("animal");        animal.say();    }

相信这段代码大家在实际开发中基本没写过,因为我们一般都会使用ssm或ssh这样的框架整合了,但是这段代码却很重要,首先,是使用了FileSystemXmlApplicationContext去加载spring的主要配置文件applicationContext.xml文件。一般来说,在实际开发中,我们都会在这个文件中添加context:annotation-config或者context:component-scan这样的标签,我的理解是:这是要告诉spring容器需要去初始化哪些bean对象(使用了注解),第一行代码执行完,那么你根据你的配置,所有对应的bean就都初始化好了,那么这个时候如果需要某个对象,直接向spring中去获取就可以了。

3、为什么使用getBean方法就可以直接获取到对象?
1、spring中定义了一个bean类(用来保存所有的对象):

    /* Bean Id :该对象的唯一标识*/      private String id;       /* Bean Class:用来保存这个对象属于哪个类 */      private String type;       /* Bean Property:用来保存这个对象的属性 */      private Map<String, Object> properties = new HashMap<String, Object>();  

2、有了这个类以后,我们知道,以前在application.xml文件中是使用bean标签来生成对象的,那么这个时候spring就可以通过xml解析的方式获取到这个对象的相关类信息和属性(注解原理也一样),然后就可以把xml里面的数据信息保存到这个bean类的实例对象中。具体的实现方式可以好好看源码(存在反射机制等)

3、既然能够把xml里面的bean的配置信息保存到spring的bean类中去,那么当我们需要某个对象的时候,根据id从这个bean类中取出对象应该就不难理解了吧