1.XML配置里的Bean自动装配

Spring IOC 容器可以自动装配 Bean,需要做的仅仅是在 <bean> 的 autowire 属性里指定自动装配的模式。自动装配方式有:

  • byType(根据类型自动装配): 若 IOC 容器中有多个与目标 Bean 类型一致的 Bean. 在这种情况下, Spring 将无法判定哪个 Bean 最合适该属性, 所以不能执行自动装配.
  • byName(根据名称自动装配): 必须将目标 Bean 的名称和属性名设置的完全相同.

示例代码:

Person.java,Person里面有三个属性:name,address,car。

package com.java.spring.autowire;

public class Person {
private String name;
private Address address;
private Car car;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
@Override
public String toString() {
return "Person [name=" + name + ", address=" + address + ", car=" + car + "]";
}
}

Address.java

package com.java.spring.autowire;

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 + "]";
}
}

Car.java

package com.java.spring.autowire;

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 + "]";
}
}

1.1 使用byName进行自动装配

使用byName根据bean的名字和当前bean的setter风格的属性名进行自动装配,若有匹配的自动转配,没有匹配的赋值为空。

<bean id="address" class="com.java.spring.autowire.Address" p:city="上海" p:street="南京路"></bean>
<bean id="car" class="com.java.spring.autowire.Car" p:brand="Audi" p:price="500000.0000"></bean>
<bean id="person" class="com.java.spring.autowire.Person" p:name="Tom" autowire="byName"></bean>

运行后输出:

Person [name=Tom, address=Address [city=上海, street=南京路], car=Car [brand=Audi, price=500000.0]]

若配置如下:

<bean id="address1212" class="com.java.spring.autowire.Address" p:city="上海" p:street="南京路"></bean>
<bean id="car" class="com.java.spring.autowire.Car" p:brand="Audi" p:price="500000.0000"></bean>
<bean id="person" class="com.java.spring.autowire.Person" p:name="Tom" autowire="byName"></bean>

address1212与setter风格的属性名address不一致,则address不能被赋值:

Person [name=Tom, address=null, car=Car [brand=Audi, price=500000.0]]

1.2 使用byType进行自动装配

byType根据bean的类型和当前bean的属性的类型进行自动装配,若IOC容器中有1个以上的类型匹配的bean,则抛异常。

<bean id="address" class="com.java.spring.autowire.Address" p:city="上海" p:street="南京路"></bean>
<bean id="car" class="com.java.spring.autowire.Car" p:brand="Audi" p:price="500000.0000"></bean>
<bean id="person" class="com.java.spring.autowire.Person" p:name="Tom" autowire="byType"></bean>

运行后输出:

Person [name=Tom, address=Address [city=上海, street=南京路], car=Car [brand=Audi, price=500000.0]]

若配置如下:

<bean id="address" class="com.java.spring.autowire.Address" p:city="上海" p:street="南京路"></bean>
<bean id="car" class="com.java.spring.autowire.Car" p:brand="Audi" p:price="500000.0000"></bean>
<bean id="car1231" class="com.java.spring.autowire.Car" p:brand="Audi" p:price="500000.0000"></bean>
<bean id="person" class="com.java.spring.autowire.Person" p:name="Tom" autowire="byType"></bean>

抛异常显示:(原因是有两个Car类型的bean)

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.java.spring.autowire.Car] is defined: expected single matching bean but found 2: car,car1231

在 Bean 配置文件里设置 autowire 属性进行自动装配将会装配 Bean 的所有属性. 然而, 若只希望装配个别属性时, autowire 属性就不够灵活了. autowire 属性要么根据类型自动装配, 要么根据名称自动装配, 不能两者兼而有之.一般情况下,在实际的项目中很少使用自动装配功能,因为和自动装配功能所带来的好处比起来,明确清晰的配置文档更有说服力一些。

2.Bean之间的关系:继承和依赖

2.1 Spring 允许继承 Bean 的配置, 被继承的 Bean 称为父 Bean. 继承这个父 Bean 的 Bean 称为子 Bean。子 Bean可以 从父 Bean 中继承配置, 包括 Bean 的属性配置,子 Bean 也可以覆盖从父 Bean 继承过来的配置。

<bean id="car" class="com.java.spring.autowire.Car" p:brand="Audi" p:price="500000.0000"></bean>
<bean id="car2" class="com.java.spring.autowire.Car" p:price="300000.0000" parent="car"></bean>

在主方法中获取Bean实例:

Car car=(Car) ctx.getBean("car2");

运行后输出:

Car [brand=Audi, price=300000.0]

2.2 父 Bean 可以作为配置模板, 也可以作为 Bean 实例. 若只想把父 Bean 作为模板, 可以设置 <bean> 的abstract 属性为 true, 这样 Spring 将不会实例化这个 Bean。

若设置为抽象Bean,则不能被实例化。

<bean id="car" class="com.java.spring.autowire.Car" p:brand="Audi" p:price="500000.0000" abstract="true"></bean>

在主方法中获取实例:

Car car=(Car) ctx.getBean("car");

报异常:

Exception in thread "main" org.springframework.beans.factory.BeanIsAbstractException: Error creating bean with name 'car': Bean definition is abstract

并不是 <bean> 元素里的所有属性都会被继承. 比如: autowire, abstract 等.也可以忽略父 Bean 的 class 属性, 让子 Bean 指定自己的类, 而共享相同的属性配置. 但此时 abstract 必须设为 true。

2.2 Spring 允许用户通过 depends-on 属性设定 Bean 前置依赖的Bean,前置依赖的 Bean 会在本 Bean 实例化之前创建好。如果前置依赖于多个 Bean,则可以通过逗号,空格或的方式配置Bean 的名称。

<bean id="car" class="com.java.spring.autowire.Car" p:brand="Audi" p:price="500000.0000"></bean>
<bean id="person" class="com.java.spring.autowire.Person" p:name="Tom" p:address-ref="address" depends-on="car"></bean>

若没有配置car这个Bean,则会报错。

3.Bean的作用域

3.1 singleton

在 Spring 中, 可以在 <bean> 元素的 scope 属性里设置 Bean 的作用域. 默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创建唯一一个实例, 整个 IOC 容器范围内都能共享该实例:所有后续的 getBean() 调用和 Bean 引用都将返回这个唯一的 Bean 实例.该作用域被称为singleton, 它是所有 Bean 的默认作用域。

<bean id="address" class="com.java.spring.autowire.Address" p:city="上海" p:street="南京路"></bean>
<bean id="car" class="com.java.spring.autowire.Car" p:brand="Audi" p:price="500000.0000"></bean>
<bean id="person" class="com.java.spring.autowire.Person" p:name="Tom" p:address-ref="address" p:car-ref="car"></bean>

在主方法中获取实例:

public class Main {
public static void main(String[] args){
ApplicationContext ctx=new ClassPathXmlApplicationContext("beans-relation.xml");
Person person1=(Person) ctx.getBean("person");
Person person2=(Person) ctx.getBean("person");
System.out.println(person1==person2);
}

System.out.println(person1==person2);打印结果为true,person1和person2为同一个对象。

3.2 prototype

原型的,容器初始化时不创建Bean实例,而是在每次请求时都创建一个新的Bean实例并返回。

wx搜索“程序员考拉”,专注java领域,一个伴你成长的公众号!

Bean的自动装配及作用域的更多相关文章

  1. bean的自动装配,使用注解开发,使用java的方式配置Spring

    bean的自动装配 自动装配是Spring满足bean依赖一种方式! Spring会在上下文中自动寻找,并自动给bean装配属性! 在Spring中有三种装配的方式 在xml中显示的配置 在java中 ...

  2. Spring基础——在 Spring Config 文件中基于 XML 的 Bean 的自动装配

    一.Spring IOC 容器支持自动装配 Bean,所谓自动装配是指,不需要通过 <property> 或 <constructor-arg> 为 Bean 的属性注入值的过 ...

  3. spring实战二之Bean的自动装配(非注解方式)

    Bean的自动装配 自动装配(autowiring)有助于减少甚至消除配置<property>元素和<constructor-arg>元素,让Spring自动识别如何装配Bea ...

  4. Spring bean的自动装配属性

    bean的自动装配属性能简化xml文件配置. bean 的自动装配属性分为四种: 1.byName 2.byTyoe 3.constructor 4. autodetect byName: 它查找配置 ...

  5. Spring(三):bean的自动装配

    Bean的自动装配 自动装配是Spring满足bean依赖的一种方式. Spring会在上下文中自动寻找,并自动给bean装配属性 Spring中三种装配方式 在xml中显式的配置. 在java中显式 ...

  6. Spring-04 Bean的自动装配

    Spring-04 Bean的自动装配 Bean的自动装配 1.自动装配说明 自动装配是使用spring满足bean依赖的一种方法. spring会在应用上下文中为某个bean寻找其依赖的bean. ...

  7. Spring学习03(Bean的自动装配)

    6.Bean的自动装配 6.1 自动装配说明 自动装配是使用spring满足bean依赖的一种方法 spring会在应用上下文中为某个bean寻找其依赖的bean. Spring中bean的三种装配机 ...

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

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

  9. Spring - 配置Bean - 自动装配 关系 作用域 引用外部属性文件

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

随机推荐

  1. 获取 input type="file" 标签的内容,并使用ajax进行请求到服务器

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. HI~

    我是一只来自青岛某鶸校的蒟蒻,很高兴能认识各位,本人水平有限,文章中的不足之处,希望大家不吝赐教 我的邮箱是zhenshiluosuo@gmail.com 微信clearsummerday 联系时烦请 ...

  3. 看个AV也中招之cve-2010-2553漏洞分析

    试想:某一天,你的基友给你了一个视频文件,号称是陈老师拍的苍老师的老师题材的最新电影.avi,你满心欢喜,在确定文件格式确实为avi格式后,愉快的脱下裤子准备欣赏,打开后却发现什么也没有,而随后你的基 ...

  4. Google 推出新搜索引擎以查找数据集

    简评:谷歌推出了一个用于寻找数据集的新搜索引擎,有点厉害! ​​​​该工具可以更轻松地访问 Web 上数千个数据存储库中的数百万个数据集,当前还处于测试版: 什么是 Dataset Search? 数 ...

  5. 终于搞定在VS2010中将CString转换为const char*

    最近碰到了CString 转 const char *的问题. 以前只要简单的一个强制转换就OK了,可现在是不行了,搜索了很多资料,终于搞定,主要是Unicode和ANSI的问题,只要做一个转换就可以 ...

  6. 几种封装javaBean的方法

    开发框架时,经常需要使用java对象(javaBean)的属性来封装程序的数据,封装javaBean的方法有很多,比如反射,内省,以及使用工具类.下面从反射开始介绍. 1.javaBean介绍: 简介 ...

  7. 利用python 学习数据分析 (学习一)

    内容学习自: Python for Data Analysis, 2nd Edition         就是这本 纯英文学的很累,对不对取决于百度翻译了 前情提要: 各种方法贴: https://w ...

  8. jersey annotations

    参照: http://blog.csdn.net/a19881029/article/details/43056429 官网文档翻译版 @Path 用来为资源类或方法定义URI,当然除了静态URI也支 ...

  9. OpenCV识别技术

    OpenCV识别技术# 老师:james 20181019 # 识别技术# Pycharm + Python3 + OpenCV """ 一.识别技术: 什么是OpenC ...

  10. (六)Audio子系统之AudioRecord.release

      在上一篇文章<(五)Audio子系统之AudioRecord.stop>中已经介绍了AudioRecord如何暂停录制,接下来,继续分析AudioRecord方法中的release的实 ...