欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

spring定义和装配bean详解

程序员文章站 2024-02-25 08:53:52
在阅读本文之前,大家可先参阅《简单理解spring之ioc和aop及代码示例》一文,了解下spring中ioc和aop的相关内容。下面进入正题。本篇文章介绍在spring中...

在阅读本文之前,大家可先参阅简单理解spring之ioc和aop及代码示例一文,了解下spring中ioc和aop的相关内容。下面进入正题。本篇文章介绍在spring中如何定义和装载java bean。

业务场景

还是人开车的例子。首先,定义一个car接口和两个实现了benz和bmw,然后定义一个person类,person类依赖car接口。

public interface car {
  void go();
}
public class benz implements car {
  public void go() {
    system.out.println("benz go......");
  }
}
public class bmw implements car {
  public void go() {
    system.out.println("bmw go......");
  }
}
public class person {
  string name = "";

  car car = null;
  public car getcar() {
    return car;
  }

  public void setcar(car car) {
    this.car = car;
  }

  public person(string name) {
    this.name=name;
  }

  public void drive(){
    system.out.println(name+" is driving ...");
    car.go();
  }
}

在person类中我们可以看到,car对象是该类的依赖对象,需要通过构造方法注入到person类中。以上的代码还完全没有spring的影子,下面看看spring是如何来注入

添加spring依赖

现在很多项目都适用maven来管理依赖,本项目也是如此。我在pom.xml中加入一下依赖节点

<dependency>
  <groupid>org.springframework</groupid>
  <artifactid>spring-core</artifactid>
  <version>3.2.6.release</version>
</dependency>
<dependency>
  <groupid>org.springframework</groupid>
  <artifactid>spring-beans</artifactid>
  <version>3.2.6.release</version>
</dependency>
<dependency>
  <groupid>org.springframework</groupid>
  <artifactid>spring-context</artifactid>
  <version>3.2.6.release</version>
</dependency>
<dependency>
  <groupid>org.springframework</groupid>
  <artifactid>spring-context-support</artifactid>
  <version>3.2.6.release</version>
</dependency>

将这些dependency节点放入pom.xml文件的dependencies节点下,eclipse会自动下载相关的包到默认位置。

手动定义和装配bean

在项目的根目录中新建一个名叫bean.xml的xml文件,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<!doctype beans public "-//spring//dtd bean//en" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
  <bean id="car" class="org.zdk.springproj1.bmw" />
  <bean id="tom" class="org.zdk.springproj1.person">
    <constructor-arg value="tom" />
    <property name="car" ref="car" />
  </bean>
</beans>

上面的xml文件首先定义了一个id为car的bean,又定义了一个id为tom的bean,car作为tom的依赖,通过<property name="car" ref="car" />的方式被手动地装配到了tom的car属性中。

创建应用对象之间协作关系的行为被称为装配(wiring),这也是依赖对象注入的本质。
接下来我们在main方法中实例化一个应用上下文对象,并获取bean中的tom节点

public class app 
{
  public static void main( string[] args )
  {
    applicationcontext context = new classpathxmlapplicationcontext("bean.xml");
    person tom=(person) context.getbean("tom");
    tom.drive();
  }
}

运行程序,输出结果为:

tom is driving ...
bmw go......

自动装配

再重复一遍,创建应用对象之间协作关系的行为被称为装配(wiring),而不是实例化对象的过程。在上面的xml文件中,我通过<property name="car" ref="car" />的方式来装配了依赖对象,但是随着应用的不断发展,xml配置文件肯定会越来越复杂,我们通过ref="car"来关联id为car的bean的这种方式已经开始落后了。下面我来介绍一下spring如何实现自动装配bean。

自动装配的类型

spring共四种装配策略,为了降低本文的复杂性,我介绍两种常用的策略,byname方式和bytype方式。顾名思义,byname方式就是看属性的名字和bean的id是否相同,在本例中,person类有一个名叫car的属性,如果将该类或改属性设置为自动装配且装配策略为byname的话,spring会去找id为car(必须是同名)的bean。bytype方式是比较类型是否相同。就本例而言,如果将person类或person类的car属性设置为自动装配且装配策略为bytype的话,由于car属性是car类型,所以,spring在进行自动装配时,会去找类型为car或其子类的bean。

使用xml实现自动装配

下面我来修改代码,使用xml配置的方式来实现自动装配。

<?xml version="1.0" encoding="utf-8"?>
<!doctype beans public "-//spring//dtd bean//en" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
  <bean id="car" class="org.zdk.springproj1.bmw" />
  <bean id="tom" class="org.zdk.springproj1.person" autowire="byname">
    <constructor-arg value="tom" />
  </bean>
</beans>

person类无需做任何修改。

首先,我去掉了<propertyname="car"ref="car"/>这行代码,因为它是手工的方式。然后,我将id为tom的bean增加一个属性autowire="byname",将其设置为通过名字自动装配依赖,在获取person对象时,person的所有属性名称就都有了特殊的含义。spring监测到了person类又一个名叫car的属性,并且在配置文件中发现了一个id为car的bean,于是乎,就将其自动装配给了person的car属性。

通过注解实现自动装配

我们将bean.xml做如下修改

<?xml version="1.0" encoding="utf-8"?>
<!doctype beans public "-//spring//dtd bean//en" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="byname">
  <bean id="car" class="org.zdk.springproj1.bmw" />
  <bean id="tom" class="org.zdk.springproj1.person">
    <constructor-arg value="tom" />
  </bean>
</beans>

将id为tom的bean的一个属性autowire="byname"删除,然后在跟节点beans中添加一个属性default-autowire="byname"来设置该文件内定义的所有bean的自动装配方式的默认值为byname。然后对person 类做一点修改,在car的setter方法上加上@autowired注解,来通知spring对该属性进行自动装配。重新运行代码,输出结果不变。

@autowired
public void setcar(car car) {
  this.car = car;
}

通过注解来实现自动装配的话,需要首先在beans根目录上制定默认的自动装配方式,然后就不需要在配置文件中为每一个需要自动装配的bean来配置autowire属性了(如果方式与默认的不一致,仍然可以单独配置,来覆盖默认的自动装配方式)。注解的方式更加细腻,它可以对需要自动装配的bean达到属性级的控制。

在上面的所有代码中,我们在配置文件中都是使用的org.zdk.springproj1.bmw类作为person类的依赖,如果由于业务需要,person类不需要开宝马车而改开奔驰车了,只需要将该配置修改为org.zdk.springproj1.benz即可,无需修改任何java代码,这就是spring作为ioc容器的强大之处。

总结

以上就是本文关于spring定义和装配bean详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

java之spring注解配置bean实例代码解析

spring配置使用之bean生命周期详解

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!