核心机制是以BeanFactory为基础,管理bean与benn之间的依赖的.Spring以bean防是组织管理java应用中的各组件,组件之间的依赖关系松耦合运行良好.这依赖与spring德核心机制:依赖注入.Spring使用BeanFactory作为应用中富者生产和管理各种组件的工厂,同事也是组件运行的容器.BeanFactory根据配置的文件确定容器中bean的实现.管理bean之间的关系.

  将bean对bean实现类的依赖解耦,变成对接口的依赖,程序从面向具体的类的编程,转向编程面向接口的编程,极大的降低应用中的组件的耦合.

spring能有效的组织j2ee应用各层的对象.不管是控制层的actiong对象.还是业务层的service对象.还有持久层的dao对象,都可以在aispring的管理机制下有机协调的运行,spring将各层的对象以松耦合的访华四组织在一起.阿香体哦那个对象无需关心service.

依赖注入(Dependency Injection)和控制反转(Inversion of contro)是同一个概念,具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个java实例,被调用者)的协助的时候.在传统的程序设计过程中,通常由调用者来创建被调用者的实例,但在spring里面,创建被调用者的工作不再有调用者来完成.因此称为控制反转.创建被调用者实力的工作通常由spring容器来完成.然后注入调用者.因此也称为依赖注入.

原理代码简单重现:

设置注入:

   设置注入是指通过setter方法传入被调用者的实例,这汇总注入方式简单,直观,因而在spring的依赖注入里面大量使用.以下是一个Person接口:

//定义Person接口

Public interface Person

{

   //person接口里面定义的一个使用斧子的方法

   public void useAxe();

}

____________________________________________________________________

public interface Axe

{

  //Axe接口里面有个砍的方法

  public void chop();

}

____________________________________________________________________

Person的实现类如下:

public ckass Chinese implements Person

{

  private Axe axe;//面向Axe接口编程,而不是具体实现类.

  public Chisese(){//默认构造器

  }

  //设置注入所需的setter方法

    public void serAxe(Axe axe)

  {

    this.axe = axe;

  }

   //实现person接口类的useAxe方法

    public void useAdxe(){

    System.out.pringln(axe.chop());

  }

}

____________________________________________________________________

//Axe的第一个实现类 StoneAxe

public class StoneAxe implements Axe

{

   //默认构造器

   public StoneAxe(){}

   //实现Axe接口的chop方法

   public Stirng chop()

   {

      return "用势头斧子去砍柴";

   }

}

____________________________________________________________________

下面是关键,是采用spring的配置文件将person实例和Axe实例组织在一起,配置如下:

____________________________________________________________________

<!--Spring 配置文件的根元素 -->

<beans>

  <!-定义第一bean,该bean得id失chidese,class指定该bean实例的实现类 -->

  <bean id = "chainese" class="lee.Chinese">

 <!-property元素用来指定需要容器注入的属性,axe属性需要容器注入,此处是没有设置注入,因此Chisese类必须拥有setAxe方法 -->

<property name = "axe">

<!-- 此处将另一个bean的引用注入给chinese bean -->

<ref local = "stoneAxe"/>

</property>

</bean>

<!-- 定义stoneAxe bean -->

<bean id = "stoneAxe" class ="lee.StoneAxe"/>

</beans>

下面看主程序部分:

public class BeanTest

{

   public static void main(Sting[] args) throws Exveption

  {

      //因为是独立的应用程序,显式地市厉害spring的上下文

      ApplicationContext ctx = new FileSystemXmlApplicationContest("bean.xml")

      //通过Person Bean的id来获取bean实例,面向接口编程.因此,此处通过强制类型转换为接口类型

      Person p = (Person)ctx.getBean("chinese");

     //直接执行Person的useAxe()方法

     p.useAxe();

  }

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐