当前位置 : 主页 > 编程语言 > java >

Spring2.0 学习笔记

来源:互联网 收集:自由互联 发布时间:2022-07-14
Spring2 学习笔记 ​​1. Spring 依赖注入(DI)和控制反转(Ioc)的理解:​​ ​​2.Spring framework七个模块:​​ ​​2.1. Spring Core​​ ​​2.2. Spring Context​​ ​​2.3. Spring DAO​​ ​​


Spring2 学习笔记

  • ​​1. Spring 依赖注入(DI)和控制反转(Ioc)的理解:​​
  • ​​2.Spring framework七个模块:​​
  • ​​2.1. Spring Core​​
  • ​​2.2. Spring Context​​
  • ​​2.3. Spring DAO​​
  • ​​2.4. Spring ROM​​
  • ​​2.5. Spring AOP​​
  • ​​2.6. Spring Web​​
  • ​​2.7. Spring MVC​​

1. Spring 依赖注入(DI)和控制反转(Ioc)的理解:

​​想要全面的了解spring 那么我们首先要了解是什么是依赖注入(DI)和控制反转(Ioc)。​​

public class Worker {
private Person person;
public Worker(Person person) {
this.person = person;
}
}

      如上段代码,Worker依赖Person,Person通过Worker的构造函数注入到Worker类。这就是依赖注入。注入的方式还有setter注入和接口注入。
      控制反转

public class Worker {
private Person person;
public Worker() {
this.person = new Person();
}
}

      上段代码,worker 依赖 Person,底层依赖上层 ,传统应用的话使用worker需要自己newPerson对象。这两个类之间高耦合。有了依赖注入之后(把底层类作为参数传入上层类,实现上层类对对下层类的控制),用构造方法实现的依赖注入实现控制反转。

      因为采用了依赖注入,在初始化的过程中就不可避免的会写大量的new。这里IoC容器就解决了这个问题。这个容器可以自动对你的代码进行初始化,你只需要维护一个Configuration(可以是xml可以是一段代码),而不用每次初始化一辆车都要亲手去写那一大段初始化的代码。这是引入IoC Container的第一个好处。

      IoC Container的第二个好处是:我们在创建实例的时候不需要了解其中的细节。在上面的例子中,我们自己手动创建一个车instance时候,是从底层往上层new的:

      创建 一个Worker实例——》new Person()——》注入new Worker()

      这个过程中,我们需要了解整个Worker/Person类构造函数是怎么定义的,才能一步一步new/注入。

      而IoC Container在进行这个工作的时候是反过来的,它先从最上层开始往下找依赖关系,到达最底层之后再往上一步一步new(有点像深度优先遍历):

      创建一个Worker实例——》查config——》需要Person——》往上创建——》new Person——》注入——》new Worker()

      这里IoC Container可以直接隐藏具体的创建实例的细节,在我们来看它就像一个工厂:

      创建一个Worker实例——》查config——》需要Person——》往上创建——》new Person——》注入——》new Worker()

      我们就像是工厂的客户。我们只需要向工厂请求一个Worker实例,然后它就给我们按照Config创建了一个Worker实例。我们完全不用管这个Worker实例是怎么一步一步被创建出来。

      Spring中的依赖注入

      上面我们提到,依赖注入是实现控制反转的一种方式。下面我们结合Spring的IoC容器,简单描述一下这个过程。

class MovieLister...
private MovieFinder finder;
public void setFinder(MovieFinder finder) {
this.finder = finder;
}
class ColonMovieFinder...
public void setFilename(String filename) {
this.filename = filename;
}

      我们先定义两个类,可以看到都使用了依赖注入的方式,通过外部传入依赖,而不是自己创建依赖。那么问题来了,谁把依赖传给他们,也就是说谁负责创建finder,并且把finder传给MovieLister。答案是Spring的IoC容器。要使用IoC容器,首先要进行配置。这里我们使用xml的配置,也可以通过代码注解方式配置。下面是spring.xml的内容

<beans>
<bean id="MovieLister" class="spring.MovieLister">
<property name="finder">
<ref local="MovieFinder"/>
</property>
</bean>
<bean id="MovieFinder" class="spring.ColonMovieFinder">
<property name="filename">
<value>movies1.txt</value>
</property>
</bean>
</beans>

      在Spring中,每个bean代表一个对象的实例,默认是单例模式,即在程序的生命周期内,所有的对象都只有一个实例,进行重复使用。通过配置bean,IoC容器在启动的时候会根据配置生成bean实例。具体的配置语法参考Spring文档。这里只要知道IoC容器会根据配置创建MovieFinder,在运行的时候把MovieFinder赋值给MovieLister的finder属性,完成依赖注入的过程。下面给出测试代码

public void testWithSpring() throws Exception {
ApplicationContext ctx = new FileSystemXmlApplicationContext("spring.xml");//1
MovieLister lister = (MovieLister) ctx.getBean("MovieLister");//2
Movie[] movies = lister.moviesDirectedBy("Sergio Leone");
assertEquals("Once Upon a Time in the West", movies[0].getTitle());
}
  • 根据配置生成ApplicationContext,即IoC容器。
  • 从容器中获取MovieLister的实例。
  •       总结
          控制反转是一种在软件工程中解耦合的思想,调用类只依赖接口,而不依赖具体的实现类,减少了耦合。控制权交给了容器,在运行的时候才由容器决定将具体的实现动态的“注入”到调用类的对象中。
    依赖注入是一种设计模式,可以作为控制反转的一种实现方式。依赖注入就是将实例变量传入到一个对象中去(Dependency injection means giving an object its instance variables)。
    通过IoC框架,类A依赖类B的强耦合关系可以在运行时通过容器建立,也就是说把创建B实例的工作移交给容器,类A只管使用就可以。


    2.Spring framework七个模块:

    ​​Spring 框架包含许多特性,并被很好的组织在下图所示的七个模块中。将依次介绍每个模块。​​

    Spring2.0 学习笔记_学习

    2.1. Spring Core

          Core 封装包是框架的最基础部分,提供IoC和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需求,并真正允许你从程序逻辑中分离出依赖关系和配置。

    单例模式(Singleton Pattern)是 Java
    中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
    这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
    注意:
    1、单例类只能有一个实例。
    2、单例类必须自己创建自己的唯一实例。
    3、单例类必须给所有其他对象提供这一实例。

    2.2. Spring Context

    2.3. Spring DAO

    2.4. Spring ROM

    2.5. Spring AOP

    2.6. Spring Web

    2.7. Spring MVC

    请关注!未完待续…



    网友评论