Spring的依赖注入——概念

来源:互联网 发布:rsyslog windows 编辑:程序博客网 时间:2024/05/18 03:44

Spring核心容器就是一个大工厂,所有的对象都会被当成Spring核心容器管理的对象——Spring把容器的中一切对象统称为Bean。对于Spring框架而言,一切Java对象都是Bean。`

一个简单的例子

先定义一个简单的类Axe

public class Axe{    public String shop()    {        return "使用斧头砍柴“;    }}

再定义一个简单类Person

public class Person{    private Axe axe;    public void setAxe(Axe axe)    {        this.axe = axe;    }    pubilc void useAxe()    {        System.out.println("我打算去砍点柴火");        System.out.println(axe.chop());    }}

Spring通过配置文件来管理Bean,因此为该项目增加XML配置文件

<bean id="person" class="service.Person">    <property name="axe" ref="axe" /></bean><bean id="axe" class="service.Axe">

每个< bean…/>元素默认驱动Spring调用该类无参数构造器创建实例,并将该实例作为Spring容器中的Bean。在Spring配置文件中,class属性值必须是Bean实现类的带包名的完整类名。上面配置文件中还包括一个< property…/>子元素,它通常作为< bean…/>元素的子元素,驱动Spring在底层执行一次setter方法。其中name属性值决定执行哪个setter方法,value或ref属性决定setter方法的传入参数:

  • 如果传入参数是基本类型及其包装类、String类等,则使用value属性
  • 如果以容器中其它Bean作为传入参数,则使用ref属性

所以,上面配置文件驱动Spring在底层调用无参数构造器依次创建Person和Axe这两个类的对象,并把它们当成容器中的Bean。其中id为person的< bean…/>元素还包括一个< property…/>子元素,因此Spring会在创建完person Bean后,以容器中id为axe的Bean为参数调用person Bean的setAxe()方法,及容器中id为axe的Bean被赋值给person对象的axe实例变量。
下面是本程序的主代码

public class BeanTest{    public static void main(String[] args) throws Exception    {        //从类加载路径下搜索配置文件,并根据配置文件创建Spring容器        ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");        //获取id为person的Bean,即java对象        Person p = ctx.getBean("person",Person.class);        //调用useBean()方法        p.useAxe();    }}

Spring容器获取Bean对象主要有以下两种方法:

  • Object getBean(String id)
    根据容器中Bean的id来获取指定Bean,获取之后需要进行强制类型转换。
  • T getBean(String name,Class< T> requiredType)
    根据容器中Bean的id来获取指定Bean,但该方法带泛型参数,因此获取后无需进行类型转换。

编译运行该程序,可看到以下输出:

我打算去砍点柴火
使用斧头砍柴

依赖注入

如上面例子所显示,程序代码并没有主动为Person对的的axe成员变量设置值,但执行Person对象的useAxe方法时,可以正常访问axe对象,并调用Axe对象的chop()方法。
纵观所有Java应用,都大量存在A对象需要调用B对象的方法的情况,这种情况在Spring中称为依赖。依赖注入达到的效果:当某个java实例需要其它java实例时,系统自动提供所需要的实例,无需程序显示获取。

0 0
原创粉丝点击