spring定义和装配bean详解

作者:kite___ 时间:2023-08-23 00:33:18 

在阅读本文之前,大家可先参阅简单理解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容器的强大之处。

总结

Java之Spring注解配置bean实例代码解析

Spring配置使用之Bean生命周期详解

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

来源:http://blog.csdn.net/daguanjia11/article/details/49227951

标签:spring,bean
0
投稿

猜你喜欢

  • 深入了解Java对象的克隆

    2021-10-29 13:59:35
  • Android 使用地图时的权限请求方法

    2023-08-25 15:02:18
  • JAVA基础之注解与反射的使用方法和场景

    2022-02-23 19:50:00
  • Spring Cloud Gateway全局通用异常处理的实现

    2022-05-08 08:03:10
  • 解决Android使用Handler造成内存泄露问题

    2022-11-10 09:07:13
  • springboot redis分布式锁代码实例

    2023-12-05 21:40:10
  • SpringBoot 整合 Shiro 密码登录的实现代码

    2023-11-10 11:27:59
  • .NET企业级项目中遇到的国际化问题和解决方法

    2022-12-03 08:18:06
  • Java实现爬取百度图片的方法分析

    2023-12-19 23:51:27
  • Spring Security OAuth2认证授权示例详解

    2022-09-11 19:45:47
  • 详解C# WinForm如何实现自动更新程序

    2022-03-04 02:19:29
  • java中的数组初始化赋初值方式

    2021-11-23 03:08:37
  • android中图片加载到内存的实例代码

    2023-05-23 06:04:35
  • java利用udp实现发送数据

    2023-03-21 18:30:49
  • JAVA实现红包分发的示例代码

    2022-10-08 06:18:15
  • C# 中 “$” 符号的作用以及用法详解

    2022-09-11 17:03:50
  • Android PowerManagerService省电模式策略控制

    2023-11-25 02:46:53
  • Unity Shader实现线框效果的制作步骤

    2023-10-10 06:14:54
  • Spring Cloud之配置中心的搭建

    2023-04-02 21:19:49
  • Java环境下高德地图Api的使用方式

    2022-06-13 06:43:59
  • asp之家 软件编程 m.aspxhome.com