Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系,少写几个ref

autowire:

  no ---默认情况,不自动装配,通过ref手动引用

  byName---根据名字自动装配

  byType---根据类型自动装配

  constructor---根据构造函数参数的数据类型,进行byType模式的自动装配。 (麻烦,不推荐)

  autodetect--- 首先尝试使用constructor进行自动装配,如果失败,再使用byType进行自动装配(麻烦,不推荐)

看一个例子:Person类有name属性、Car对象属性、Address对象属性

 package com.guigu.spring.autowire;
// Car类
public class Car {
private String brand;
private double price;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Car [brand=" + brand + ", price=" + price + "]";
}
}
 package com.guigu.spring.autowire;
// Address 类
public class Address {
private String city;
private String street;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
@Override
public String toString() {
return "Address [city=" + city + ", street=" + street + "]";
}
}
 package com.guigu.spring.autowire;
// Person类
public class Person {
private String name;
private Car car;
private Address address; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "Person [car=" + car + ", address=" + address + "]";
}
}
 public class Main {
// main
public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("autowire.xml");
Person person = (Person) ctx.getBean("person");
System.out.println(person); }
}
 <beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="address" class="com.guigu.spring.autowire.Address"
p:city="BeiJing" p:street="HuiZhou"></bean>
<bean id="car" class="com.guigu.spring.autowire.Car"
p:brand="Audi" p:price="200000"></bean>
<!-- 手动装配
<bean id="person" class="com.guigu.spring.autowire.Person"
p:name="Tom" p:address-ref="address" p:car-ref="car"></bean>
-->
<!-- 自动装配 -->
<bean id="person" class="com.guigu.spring.autowire.Person"
p:name="Tom" autowire="byName"></bean> </beans>

结果会输出正确toString信息。

补充一下 P:city ,这是用p命名空间,配置属性更简便

 <bean id="address" class="com.guigu.spring.autowire.Address"
p:city="BeiJing" p:street="HuiZhou"></bean> <!--等同于-->
<bean id="address" class="com.guigu.spring.autowire.Address">
<property name="city" value="BeiJing"></property>
<property name="street" value="HuiZhou"></property>
</bean>

继续说自动装配,autowire="byName"达到了和手动装配一样的效果。

它的匹配方法是依据person类有两个属性,一个是address,一个是car,正好有两个bean名字就是对应两个属性名,就会自动匹配上了。

缺点是当bean的id变成address1,返回null,因为名字不匹配。。

     <bean id="address1" class="com.guigu.spring.autowire.Address"
p:city="BeiJing" p:street="HuiZhou"></bean>
<bean id="car1" class="com.guigu.spring.autowire.Car"
p:brand="Audi" p:price="200000"></bean>
<!-- 手动装配
<bean id="person" class="com.guigu.spring.autowire.Person"
p:name="Tom" p:address-ref="address" p:car-ref="car"></bean>
-->
<!-- 自动装配 -->
<bean id="person" class="com.guigu.spring.autowire.Person"
p:name="Tom" autowire="byType"></bean>

这样,即使名字不能匹配,但可以用类型匹配。person类有两个属性,一个是Address类,一个是Car类,正好前面两个bean是这样类型的,就匹配上了。不管它们叫什么名字

缺点是,若前面有多个Car类,那它就不知道匹配谁了,会报异常。。如下

     <bean id="address" class="com.guigu.spring.autowire.Address"
p:city="BeiJing" p:street="HuiZhou"></bean>
<bean id="car" class="com.guigu.spring.autowire.Car"
p:brand="Audi" p:price="200000"></bean>
<bean id="car1" class="com.guigu.spring.autowire.Car"
p:brand="Baoma" p:price="300000"></bean> <!-- 自动装配 -->
<bean id="person" class="com.guigu.spring.autowire.Person"
p:name="Tom" autowire="byType"></bean>

缺点:

1、autowire属性将自动装配bean的所有属性,若只希望装配个别属性时,显得不那么灵活。

2、一般用byName或byType,不能二者一起用

在实际中较少用,在一些整合框架中用到。

Spring学习记录(三)---bean自动装配autowire的更多相关文章

  1. Spring学习(三)—— 自动装配案例分析

    Spring_Autowiring collaborators 在Spring3.2.2中自动装配类型,分别为:no(default)(不采用自动装配).byName,byType,construct ...

  2. Spring4学习笔记 - 配置Bean - 自动装配 关系 作用域 引用外部属性文件

    1 Autowire自动装配 1.1 使用:只需在<bean>中使用autowire元素 <bean id="student" class="com.k ...

  3. Spring学习日志之Bean的装配

    Spring容器负责创建应用程序中的bean并通过依赖注入来协调这些对象之间的关系.但是,作为开发人员,要告诉Spring需要创建哪些bean并且如何将其装配在一起.当描述bean如何装配时,Spri ...

  4. Spring Boot(三)自动装配

    @Configuration和@Bean Spring提供了注解@Configuration和@Bean注解用来配置多个Bean,在以前的Spring项目中可以通过xml的方式配置: <bean ...

  5. Spring学习记录(五)---bean的作用域scope

    作用域:singleton:单例,整个应用中只创建一个实例(默认) prototype:原型,每次注入时都新建一个实例 session:会话,每个会话创建一个实例 request:请求,每个请求创建一 ...

  6. Spring学习记录(四)---bean之间的关系:继承、依赖

         继承 这里说的继承和java的继承是不一样的,不是父类子类.但思想很相似,是父bean和子bean 1.父bean是一个实例时.它本身是一个完整的bean 2.父bean是模板,抽象bean ...

  7. Spring学习记录(八)---Bean的生命周期

    之前说过,在调用下面时,就创建了容器和对象 ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml&quo ...

  8. Spring学习记录(三)

    一.AOP的整理总结 aop面向切面编程 横向重复代码,纵向抽取 动态代理 1.通过动态代理可以体现aop思想 2.为什么要哦用动态代理:对目标对象中的方法进行增强 spring aop开发 spri ...

  9. spring——bean自动装配

    注意:自动装配功能和手动装配要是同时使用,那么自动装配就不起作用. beans.xml <?xml version="1.0" encoding="UTF-8&qu ...

随机推荐

  1. 2016-1-30 Servlet中Session管理(Sesssion追踪)

    Session管理(Sesssion追踪)是Web应用程序开发中非常重要的一个主题.这是因为HTTP是无状态的,在默认情况下,Web服务器不知道一个HTTP请求是来自初次用户,还是来自之前已经访问过的 ...

  2. topcoder SRM 628 DIV2 BishopMove

    题目比较简单. 注意看测试用例2,给的提示 Please note that this is the largest possible return value: whenever there is ...

  3. CGContextRef 画线简单用法

    CGContextRef CGContextMoveToPoint(context,150,50);//圆弧的起始点 CGContextAddArcToPoint(context,100,80,130 ...

  4. windows消息机制详解(转载)

    消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键都会使Windows发送一个消息给应用程序.消息本身是作为一个记录传递给应用程序的 ...

  5. 新手 gulp+ seajs 小demo

    首先,不说废话,它的介绍和作者就不在多说了,网上一百度一大堆: 我在这里只是来写写我这2天抽空对seajs的了解并爬过的坑,和实现的一个小demo(纯属为了实现,高手请绕道); 一.环境工具及安装 1 ...

  6. SQl SGA 整理

    --查看诊断位置信息 select * from v$diag_info; --查看sga中内存分配信息 select * from sys.x$ksmfs; --查看内存块还剩余多少 select ...

  7. sqlserver 连接mysql

    配置与电脑相对应的odbc   http://dev.mysql.com/downloads/connector/odbc/

  8. Js函数的概念、作用、创建、调用!

    一.函数是用来帮助我们封装.调用代码的最方便的工具! 二.函数的创建方法有三种: 三.函数的创建方式有3种,调用方式也不是单一的,调用方式有4种!      1.作为一个函数去调用 函数名+();(函 ...

  9. Windows系统上的.Net版本和.NETFramework的C#版本

    前言 注:本文内容摘自维基百科,用于在墙内时当作笔记看. WinForm 需要.Net最低版本 2.0 WPF需要的.Net最低版本 3.0 (Win7及之上版本自带) C#版本 版本 语言规格 日期 ...

  10. .net core 学习

    资源: https://github.com/aspnet/home https://github.com/dotnet/cli