《Spring攻略(第2版)》——1.3 调用构造程序创建Bean

1.3 调用构造程序创建Bean

1.3.1 问题
你想要调用构造程序在Spring IoC容器中创建一个Bean,这是创建Bean最常见和直接的方法。这和Java中使用new操作符创建对象相同。

1.3.2 解决方案
通常,当你为一个Bean指定了class属性,就将要求Spring IoC容器调用构造程序创建Bean实例。

1.3.3 工作原理
假定你打算开发一个在线销售产品的购物应用程序。首先,你创建一个Product类,这个类有多个属性,比如产品名称和价格。因为商店中有许多类型的产品,所以你定义Product类为抽象类,用于不同产品子类的扩展。

package com.apress.springrecipes.shop;

public abstract class Product {

   private String name;
   private double price;

   public Product() {}

   public Product(String name, double price) {
     this.name = name;
     this.price = price;
   }

   // Getters and Setters
   ...

   public String toString() {
     return name + " " + price;
   }
}

然后你创建两个产品子类:Battery和Disc。每个类都有自己的属性。

package com.apress.springrecipes.shop;

public class Battery extends Product {

   private boolean rechargeable;

   public Battery() {
     super();
   }

   public Battery(String name, double price) {
     super(name, price);
   }
   // Getters and Setters
   ...
}

package com.apress.springrecipes.shop;

public class Disc extends Product {

   private int capacity;

   public Disc() {
     super();
   }

   public Disc(String name, double price) {
     super(name, price);
   }
   // Getters and Setters
   ...
   }

为了在Spring IoC容器中定义一些产品,创建如下Bean配置文件:

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <bean id="aaa" class="com.apress.springrecipes.shop.Battery">
     <property name="name" value="AAA" />
     <property name="price" value="2.5" />
     <property name="rechargeable" value="true" />
   </bean>

   <bean id="cdrw" class="com.apress.springrecipes.shop.Disc">
     <property name="name" value="CD-RW" />
     <property name="price" value="1.5" />
     <property name="capacity" value="700" />
   </bean>
</beans>

如果没有指定元素,将会调用默认的不带参数的构造程序。然后对于每个元素,Spring将通过设值方法注入值。前述的Bean配置等价于如下代码片段:

Product aaa = new Battery();
aaa.setName("AAA");
aaa.setPrice(2.5);
aaa.setRechargeable(true);

Product cdrw = new Disc();
cdrw.setName("CD-RW");
cdrw.setPrice(1.5);
cdrw.setCapacity(700);

相反,如果有一个或者多个元素,Spring将调用匹配参数的最合适的构造程序。

<beans ...>
   <bean id="aaa" class="com.apress.springrecipes.shop.Battery">
     <constructor-arg value="AAA" />
     <constructor-arg value="2.5" />
     <property name="rechargeable" value="true" />
   </bean>

   <bean id="cdrw" class="com.apress.springrecipes.shop.Disc">
     <constructor-arg value="CD-RW" />
     <constructor-arg value="1.5" />
     <property name="capacity" value="700" />
   </bean>
</beans>

因为Product类和子类在构造程序上没有歧义,前述的Bean配置等价于下面的代码片段:

Product aaa = new Battery("AAA", 2.5);
aaa.setRechargeable(true);

Product cdrw = new Disc("CD-RW", 1.5);
cdrw.setCapacity(700);
你可以编写下面的Main类从Spring IoC容器读取产品进行测试:

package com.apress.springrecipes.shop;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

   public static void main(String[] args) throws Exception {
     ApplicationContext context =
        new ClassPathXmlApplicationContext("beans.xml");
     Product aaa = (Product) context.getBean("aaa");
     Product cdrw = (Product) context.getBean("cdrw");
     System.out.println(aaa);
     System.out.println(cdrw);
   }
}
时间: 2024-07-31 02:48:23

《Spring攻略(第2版)》——1.3 调用构造程序创建Bean的相关文章

《Spring攻略(第2版)》——导读

前言 Spring框架正在成长.它始终与选择相关.Java EE关注于少数几项技术,很大程度上阻碍了更好的替代解决方案出现.当Spring框架出现时,没有多少人还会承认Java EE是当今最佳的架构. 随后Spring被大张旗鼓地推出,因为它寻求简化Java EE.此后其每个版本都引入设计用来简化和实现解决方案的新特性. 从2.0版本之后,Spring框架开始针对多平台.和往常一样,该框架提供了现有平台之上的服务,但是尽可能去除与底层平台的耦合.Java EE仍然是主要的参考点,但是不是唯一的目

阿里妈妈联盟申请注册攻略(站长版)

中介交易 SEO诊断 淘宝客 云主机 技术大厅 阿里妈妈注册攻略(站长版) 阿里妈妈面世已经快一个月了,有很多朋友对于阿里妈妈的注册以及发布广告位流程不是很清楚.特别是作为 卖家,对于发布广告位之类的操作了解不多,特发布注册秘笈,以帮助大家更好的理解阿里妈妈的运作流程. 整体来说,要想成功在阿里妈妈注册,需要完成三个步骤: 一.注册成为阿里妈妈的会员 二.登记网站并发布广告位 三.投放广告代码 注意:上面这三个步骤主要是针对卖家在阿里妈妈出售广告位. 话不多说,开始注册了! 第一部分 注册成为阿

《Spring攻略(第2版)》——1.2 配置Spring IoC容器中的Bean

1.2 配置Spring IoC容器中的Bean 1.2.1 问题 Spring提供了一个强大的IoC容器来管理组成应用的bean.为了利用容器服务,你必须配置运行于Spring IoC容器中的Bean. 1.2.2 解决方案 你可以通过XML文件.属性文件.注释甚至API来配置Spring IoC容器中的Bean. Spring允许你在一个或者多个bean配置文件中配置bean.对于简单的应用程序,可以在单个配置文件中集中配置bean.但是对于有许多bean的大型应用,你应该根据其功能(例如控

《Spring攻略(第2版)》——1.5 指定Bean引用

1.5 指定Bean引用 1.5.1 问题 组成应用程序的Bean往往需要互相协作完成应用功能.为了Bean之间的相互访问,你必须在Bean配置文件中指定Bean引用. 1.5.2 解决方案 在Bean配置文件中,你可以用元素为Bean属性或者构造程序参数指定Bean引用.只需要用元素指定一个简单值就可以轻松完成这一工作.你也可以像内部Bean一样直接地在属性或者构造程序中包含一个Bean声明. 1.5.3 工作原理 在你的序列生成器中接受字符串值作为前缀的灵活性不足以满足将来的要求.如果前缀生

《Spring攻略(第2版)》——1.12 用@Autowired和@Resource自动装配Bean

1.12 用@Autowired和@Resource自动装配Bean 1.12.1 问题 在Bean配置文件中设置autowire属性进行的自动装配将装配一个Bean的所有属性.这样的灵活性不足以仅仅装配特定的属性.而且,你只能通过类型或者名称自动装配Bean.如果这两种策略都不能满足你的需求,就必须明确地装配Bean. 1.12.2 解决方案 从Spring 2.5起,自动装配功能进行了多处改进.你可以通过用@Autowired或者@Resource(在JSR-250:Java平台常见注解中定

《Spring攻略(第2版)》——1.11 用XML配置自动装配Bean

1.11 用XML配置自动装配Bean 1.11.1 问题 当一个Bean需要访问另一个Bean时,你可以显式指定引用装配它.但是,如果你的容器能够自动装配Bean,就可以免去手工配置装配的麻烦. 1.11.2 解决方案 Spring IoC容器能够帮助你自动装配Bean.你只要在的autowire属性中指定自动装配模式就可以了.表1-2列出了Spring支持的自动装配模式. *默认模式是no,但是可以设置根元素的default-autowire属性修改.这个默认模式将被Bean自己指定的模式覆

《Spring攻略(第2版)》——第1章 Spring简介 1.1实例化Spring IoC容器

第1章 Spring简介 在本章中,你将参加关于Spring.核心容器以及容器所提供的一些全局可用设施的一个速成班(或者一次复习),你还将了解Spring XML配置格式,以及注释驱动的支持.本章将带给你应付本书余下部分中引入的概念所需要的知识.你将学习Spring IoC容器中的基本组件配置.在Spring框架的核心部分,IoC容器的设计具有高度的适应性和可配置性,提供了使你的组件配置尽可能简单的一组工具.你能够很简单地设置运行于Spring IoC容器中的组件. 在Spring中,组件也被称

《Spring攻略(第2版)》——1.14 从Classpath中扫描组件

1.14 从Classpath中扫描组件 1.14.1 问题为了便于Spring IoC容器对组件的管理,你需要在Bean配置中逐个声明它们.但是,如果Spring能够自动地监测你的组件而不需要手工配置,将会大大地节省你的工作量. 1.14.2 解决方案Spring提供一个强大的功能--组件扫描.这个功能能够利用特殊的典型化注解,从classpath中自动地扫描.检测和实例化你的组件.指示Spring管理组件的基本注解是@Component.其他特殊的典型化注解包括@Repository.@Se

《Spring攻略(第2版)》——1.7 使用Spring的FactoryBean创建Bean

1.7 使用Spring的FactoryBean创建Bean 1.7.1 问题你可能希望用Spring的工厂Bean在Spring IoC容器中创建Bean.工厂Bean(Factory bean)是作为创建IoC容器中其他Bean的工厂的一个Bean.概念上,工厂Bean与工厂方法非常类似,但是它是Bean构造期间可被Spring IoC容器识别的Spring专用Bean. 1.7.2 解决方案工厂Bean的基本要求是实现FactoryBean接口.为了方便,Spring提供了抽象模板类Abs