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
猜你喜欢
- 目标效果: 点击动画按钮之后每张牌各自旋转 散开到屏幕上半部分的任意位置之后回到初始位置 比较像LOL男刀的技能动画 : )1: 创建卡牌对
- pom.xml配置<dependency> <groupId>org.springframework.
- 1.在res上面右键->New->Android resource directory2.点击之后,出现下图Resource t
- 本文实例为大家分享了OpenCV实现人脸识别程序的具体代码,供大家参考,具体内容如下//Haar特征检测,人脸识别算法,是用xml作为训练后
- 前言我们一说到spring,可能第一个想到的是 IOC(控制反转) 和 AOP(面向切面编程)。没错,它们是spring的基石,得益于它们的
- 前言工作中使用mybatis时我们需要根据数据表字段创建pojo类、mapper文件以及dao类,并且需要配置它们之间的依赖关系,这样的工作
- 前言Java8 由Oracle在2014年发布,是继Java5之后最具革命性的版本。Java8吸收其他语言的精髓带来了函数式编程,lambd
- 前言很多时候,当你以为掌握了事实真相的时间,如果你能再深入一点,你可能会发现另外一些真相。比如面向切面编程的最佳编程实践是AOP,AOP的主
- 近期,Apache SkyWalking 修复了一个隐藏了近4年的Bug - TTL timer 可能失效问题,这个 bug 在 SkyWa
- 前言在一个 Web 请求中,参数我们无非就是放在地址栏或者请求体中,个别请求可能放在请求头中。放在地址栏中,我们可以通过如下方式获取参数:S
- 本篇给大家详细讲解了MTKAndroid平台开发流程,大致分为44个步骤,我们把每个步骤的命令详细讲解了下,一起来学习下。1.拷贝代码仓库从
- 本文实例讲述了C#创建临时文件的方法。分享给大家供大家参考。具体分析如下:C#可以通过Path.GetTempFileName获得一个临时文
- 简要:EigenFace是基于PCA降维的人脸识别算法,PCA是使整体数据降维后的方差最大,没有考虑降维后类间的变化。 它是将图像
- 一、使用Optional引言1.1、代码问题引出在写程序的时候一般都遇到过 NullPointerException,所以经常会对程序进行非
- 一、项目概述之前有不少粉丝私信我说,能不能用Android原生的语言开发一款在手机上运行的游戏呢?说实话,使用java语言直接开发游戏这个需
- 最近正式入坑Flutter,首先从环境搭建开始,看了网上好多关于Windows环境搭建的资料,基本都是按官方文档写的,看完的感受是,还不如直
- Android的应用被限制为最多占用16m的内存,至少在T-Mobile G1上是这样的(当然现在已经有几百兆的内存可以用了——译者注)。它
- 通用配置#下面介绍的整合JDBC和整合MyBatis都需要添加的实体类和配置数据库表#CREATE TABLE `user` ( `id`
- 本篇实例内容是关于C#读取CAD文件的,直接看代码//在不使用任务插件的情况下读取DWG文件的缩略图,以便在没有安装AutoCAD的计算机上
- 线程池中ThreadGroup的坑在Java中每一个线程都归属于某个线程组管理的一员,例如在主函数main()主工作流程中产生一个线程,则产