springIoC概述

来源:互联网 发布:怎么进入服务器数据库 编辑:程序博客网 时间:2024/04/29 09:11

概述

       在java开发领域spring框架非常有名,尤其是在java领域,如果不知道spring框架,你就太low了(当然牛逼到爆的人除外)。spring框架的英文名就是springFramework,翻译过来就是spring框架。spring框架其实只是SpringSource公司的一个项目,SpringSource公司有很多项目,这是项目主页,你会看到非常多多项目。但是springFramework是最基础的,也就是最核心的。基础和核心的就是其他spring项目都要依赖springFramework项目,换句话说其他项目都是在springFramework的基础之上延伸出来的。
spring项目关系图
       其他项目和springFrameWork的关系就是这样的。Spring还有其他很多东西,比如它的历史什么的,读者可以闲暇时自己百度。关于它的优点我会慢慢道来。

1IoC容器

1.1介绍

       容器(container)这个词感觉已经被滥用了,什么都是容器。容器顾名思义就是装东西的东西。例如水杯是一个容器,用来装水。IoC容器就是用来装应用中的对象实例。注意我强调的是对象,这意味着同一类型的对象你可以在IoC容器中放好几个。IoC容器中,IoC的意思就是Inversion of Control(控制反转)。首先明确一下这里的控制是控制什么?这里的控制范范的说就是控制对象的生命周期,明确到一个典型点来说就是对象的实例化,再具体一点来说就是将对象依赖的其它对象传递给该对象。在一般情况下,建立一个对象都是通过new,静态方法,工厂方法等等手段。springFramework采用了一种比较高效的机制,它将实例化好的对象全部存在一个类似map结构的容器当中,每一个key都对应一个实例化对象。

Object0 obj0 = new Object0();Object1 obj1 = new Object1();Object2 obj2 = new Object2();Object3 obj3 = new Object3();Object4 obj4 = new Object4();Object5 obj5 = new Object5();Object6 obj6 = newObject6(obj0,obj1,obj2,obj3,obj3,obj4,obj5); 

采用springFramework之前的管理对象的方法。

public class obj6{@Autowiredpublic Object0 obj0@Autowiredpublic Object1 obj1@Autowiredpublic Object2 obj2@Autowiredpublic Object3 obj3@Autowiredpublic Object4 obj4@Autowiredpublic Object5 obj5}public class Boot{    public static void main(String[] argv){    IoC ioc = new IoC();    Object0 obj0 = new Object();    ioc.put("obj0",obj0);    Object1 obj1 = new Object();    ioc.put("obj1",obj1);    Object2 obj2 = new Object();    ioc.put("obj2",obj2);    Object3 obj3 = new Object();    ioc.put("obj3",obj3);    Object4 obj4 = new Object();    ioc.put("obj4",obj4);    Object5 obj5 = new Object();    ioc.put("obj5",obj5);    Object6 obj6 = ioc.getBean(Object6.class);    }}

采用springFramework之后使用IoC容器来管理对象。
       初看之下,发现采用IoC容器似乎要更加麻烦,要多写很多代码,但假设一下,这些对象的重用率非常高,这样的话,通过传递IoC容器就可以在不同的函数中使用这些对象。当然这个优点非常牵强,使用起来也非常不方便,在实际的开发中并不会传递IoC容器,是通过注解的方式来获取IoC容器中的对象,这样就非常方便。但这里要强调的是IoC容器的强大之处在于对象生命周期的管理,这里面涉及到很多知识,包括前面提到的注解,在下面的文章中会详细介绍。本文的重点是springFramework的使用和背后的思想,并不会深究springFramework的实现。

1.2IoC容器的实现

之前只是阐述了IoC容器的思想,现在介绍一下IoC容器在springframework中的实现。

BeanFactory

Bean工厂,bean只的就是对象实例。bean其实没有任何限制,并不需要它的类有set和get方法,只是一半情况下因为习惯和其他一些因素,都会加上set和get方法。BeanFactory就是IoC容器的最基本实现,可以实现存放对象的功能。BeanFactory只会在极少(我至今都没有见过使用BeanFactory的情况)的情况下使用。一般情况下都会使用ApplicationContext,因为BeanFactory的功能实在太基础类,也就是太弱了。

ApplicationContext

ApplicationContext是IoC容器的另一个实现,当然是在BeanFactory基础上的扩展。ApplicationContext包含了很多强大的功能,能够更加精确的控制对象的生命周期,加载资源等等。

1.3如何定义一个对象实例

       因为对象需要装填到IoC容器中,因此目前最迫切的事情就是实例化一个对象。实例化一个对象有多种方式,spring将其分为来两类,一类是通过xml的方式来实例化一个对象,另一种是通过代码,也就是new关键字,工厂方法等形式来实例化一个对象,当然随着springFramework的发展,极力推荐采用通过代码的形式实例化对象。因此我会采用抛砖引玉的方式,先讲砖,而且会一带而过,因为不想在砖上话太多时间,也完全没有必要。在这里xml形式就是砖。

1.2.1通过XML实例化对象

现在我不会讲解具体实践的细节,比如这个demo需要哪些jar,xml放在哪里等等。

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd">    <bean id="user" class="org.liu.spring.entity.User">        <property name="id" value="1"/>        <property name="name" value="liu"/>        <property name="password" value="pass"/>    </bean></beans>
public class App {    public static void main( String[] args )    {        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");        User user = context.getBean(User.class);        System.out.println(user.getName());    }}

着差不多就是spring基于XML的HelloWorld了,但是我觉的还是麻烦,因为得配置一个麻烦的xml,及其容易让人出错。
这是这个项目的地址
好了,到这里为止,砖已经介绍完了,该讲玉了。就是采用java编写代码的形式使用对象实例的定义。

1.2.2通过JAVAConfig实例化对象

之前采用的是从classpath加载xml配置,因此采用ClassPathXmlApplicationContext.现在采用javaConfig的形式就需要一种新的ApplicationContext了,就是AnnotationConfigApplicationContext。

public class App {    public static void main( String[] args )    {        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);        User user = context.getBean(User.class);        System.out.println( user.getName());    }}

这是项目地址.这个强烈建议下载下来。
采用javaConfig的目录结构

采用XML的形式
少了一个xml是令人多么爽,我个人对xml深恶痛绝。
这里主要为让这个示例项目讲解一下,App和AppConfig不要放在默认的包路径下,一定要有包名。App顾名思义就是应用程序的执行类,拥有main函数。AppConfig就是配置类,这个配置类特殊一点,有一个@ComponentScan注解,用于扫描其它带有注解的类。因此一定要将带有@ComponentScan的类房子比较顶级的包路径下,虽然@ComponentScan是可配置的,但是为例省事不出错,就放在顶级目录下用默认配置就好。因为使用的是AnnotationConfigApplicationContext,这个context有个特点就是会把带有@Configuration的类作为配置类。在这个项目中首先将AppConfig添加到了context中,然后AppConfig声明了@ComponentScan会把所有带有注解到类扫描进来,这其中就包括config包下带有@Configuration的配置类。在这个类中配置类一个Pserson的实例对象,因此可以在App中可以直接获通过context获取到Person的实例。

小结

本章只是介绍类IoC容器的概念,以及在springIoC容器的使用。

0 0
原创粉丝点击