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 ACM/ICPC Asia Regional Dalian Online 1010 Weak Pair dfs序+分块

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submissio ...

  2. 2016-2-1 Servlet细节

    Servlet的一些细节(韩顺平老师视频讲解)(1)由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序想要被外界访问,必须把servlet程序映射到一个URL地址上.这个工作在 ...

  3. mac安装java8

    http://stackoverflow.com/questions/24342886/how-to-install-java-8-on-mac brew tap caskroom/cask brew ...

  4. oracle EXP导出一张表时使用query参数指定where条件

    oracle exp 导出一个表的部分内容,使用query参数可加上SQL的where条件进行过滤 注意:如果需要使用到日期字符串格式等单引号,需要使用双引号将where条件括起来,而且双引号要用\做 ...

  5. spark scala学习笔记

    搞清楚几个概念: 闭包 柯里化 搭建了intellij idea 的scala 开发环境

  6. iOS 与 惯性滚动

    注:以下所有例子均 只 在 iOS 的微信中测试过,但对于饿了么APP的内置浏览器同样适用(两者使用相同内核) 引题 工作中常常有需要显示大量信息的情况,列表超出一屏就涉及到滚动的问题.例如 - va ...

  7. $(function(){}) 与(function(){})()在执行时的优先级

    $(function(){}) 是在页面DOM元素加载完成后执行,这时页面中的DOM对象都可以找到; (function(){})()是匿名函数,按页面从上到下顺序,执行到它时才执行,这时可能有的在此 ...

  8. monodroid 调用 JNI Native 的一些问题

    在Android版本开发的过程中,需要使用一些用JNI开发的NDK的native库.这里谈一谈踩到的坑,给大家参考. 虽然java的程序我还算熟悉,但是没有了解过 JNI Native 的开发,一般是 ...

  9. eclipse常见问题

    使用eclipse进入断点,当弹出"Confir Perspective Switch"视图时,选择"Yes".之后每次进入断点都会自动切换到debug视图. ...

  10. JavaScript_js模拟键盘输入

    function fireKeyEvent(el, evtType, keyCode) { var evtObj; if (document.createEvent) { if (window.Key ...