Spring bean的三种创建方式

1、创建Spring工程

使用eclipse创建一个Spring工程,一个简单的方法就是先创建一个Java工程,然后将Spring的Jar包全部放入到工程里面即可开始编写基于Spring框架的程序。Spring的Jar包可以从github上的源码中取得,下载地址是:https://github.com/spring-projects/spring-framework

下面是在学习《Spring实战》时创建的一个Spring工程,其目录结构如下:

在Spring中,创建应用对象之间协作关系的行为通常被称为装配(wiring),这也是依赖注入的本质,而依赖注入和AOP则是Spring框架的核心。下面就是Spring中Bean的装配,从Spring3.0开始,Spring容器就提供了两种Bean装配方式:XML文件和Java注解,先从XML文件配置学起。

2、创建Bean

Spring的xml配置文件如下:

注意:

Spring的xml配置文件中xsd文件路径原本使用的网络路径,但是也可以使用本地的类库路径,因为在引入的spring包中spring-beans-3..*.RELEASE.jar中有spring-beans-3.0.xsd文件。

Bean配置文件中构造函数的参数顺序默认情况下必须与类定义中的参数顺序一致,也可以使用index(从0开始)属性来指定参数对应顺序。对于非基本类型,需要使用ref属性来引用其他bean。

对于Bean的创建,主要有三种方式:

http://my.oschina.net/itblog/blog/205172

1、构造器注入创建

对于有公共的构造方法的类(无论是默认的还是显示申明的构造方法),都可以使用构造器注入来创建为Bean

package lucien;

public class PoeticJuggler extends Juggler {
	private Poem poem;

	public PoeticJuggler(Poem poem) {
		this.poem = poem;
	}

	public PoeticJuggler(int beanbags, Poem poem) {
		super(beanbags);
		this.poem = poem;
		System.out.println("构造器注入创建PoeticJuggler");
	}

	public void perform() {
		super.perform();
		System.out.println("reciting...");
		poem.recite();
	}
}

2、工厂方法创建

对于没有公共构造方法的类,可以使用它的一个静态方法(无论该方法是private还是public,只要是static即可)来创建Bean。

package lucien;

public class Stage {

	//私有的构造方法
	private Stage() {
	}

	//静态的内部类
	private static class StageSingletonHolder {
		static Stage instance = new Stage();
	}

	//静态方法
	public static Stage getInstance() {
		System.out.println("工厂方法创建Stage");
		return StageSingletonHolder.instance;
	}

	public void perform() {
		System.out.println("Stage performance");
	}
}

3、工厂类创建

使用工厂类的非静态方法(private和public均可,但必须是非static的)

package lucien;

public class Juggler implements Performer {
	private int beanBags = 3;

	public Juggler() {
	}

	public Juggler(int beanBags) {
		this.beanBags = beanBags;
	}

	@Override
	public void perform() {
		// TODO Auto-generated method stub
		System.out.println("JUGGLING " + beanBags + " BEANBAGS");
	}
}
package lucien;

public class JugglerFactory {
	public Juggler getJuggler() {
		System.out.println("工厂类创建Juggler");
		return new Juggler();
	}

}
package lucien;

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

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ApplicationContext ctx = new ClassPathXmlApplicationContext("ConfigFile.xml");
		Performer performer = (Performer) ctx.getBean("poeticDuke");
		performer.perform();

		Stage stage = (Stage) ctx.getBean("stage");
		stage.perform();

		Juggler juggler = (Juggler) ctx.getBean("duke2");
		juggler.perform();

	}

}
时间: 2024-12-12 01:07:26

Spring bean的三种创建方式的相关文章

Spring三 Bean的三种创建方式

创建Bean的三种方式在大多数情况下,Spring容器直接通过new关键字调用构造器来创建Bean实例,而class属性指定Bean实例的实现类,但这不是实例化Bean的唯一方法.实际上,Spring支持使用以下三种方式来创建Bean:(1)调用构造器创建Bean(2)调用静态工厂方法创建Bean(3)调用实例工厂方法创建Bean一 构造器创建Bean实例如果不采用构造注入,Spring底层会调用Bean类的无参数构造器来创建实例,因此该类必须要提供无参数的构造器,并且class属性的值就是该B

Spring bean的三种注入方式

Spring的一个重要原理就是IOC(Inverse Of Control),即控制反转.IOC就是一种将组件依赖关系的创建和管理置于程序外部的技术,在Spring中Bean组件的实例化和依赖关系的管理控制都由Spring容器负责,对象与对象之间的关系可以简单的理解为对象之间的依赖关系:在 类 A 需要类 B 的一个实例来进行某些操作时,比如在类 A 的方法中需要调用类 B 的方法来完成功能,叫做类 A 依赖于类 B.依赖注入(DI:Dependency Injection) :两个对象之间的依

2019年6月14日 Web框架之Django_07 进阶操作(MTV与MVC、多对多表三种创建方式、前后端传输数据编码格式contentType、ajax、自定义分页器)

摘要 MTV与MVC 多对多表三种创建方式 ajax ,前后端传输数据编码格式contentType 批量插入数据和自定义分页器 一.MVC与MTV MVC(Model View Controller 模型-视图-控制器)是一种Web架构的模式,所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业务对象与数据库的对象(ORM),视图负责与用户的交互(页面),控制器(C)接受用户的输入调用模型和视图完成用户的请求. M

Python Django 多对多三种创建方式 form组件 cookie和session

一 表中多对多关系三种创建方式 以Book表和Author表多对多关系例 1.第一种方式:全自动(推荐使用):models.ManyToManyField(to='类名') 优点:不需要你手动创建第三张表 缺点:第三张表不是你手动创建的,字段是固定的无法拓展 class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalField(max_digits=8,decimal_place

多对多三种创建方式、forms组件、cookies与session

多对多三种创建方式.forms组件.cookies与session 一.多对多三种创建方式 1.全自动 # 优势:不需要你手动创建第三张表 # 不足:由于第三张表不是你手动创建的,也就意味着第三张表字段是固定的无法做扩展 class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalField(max_digits=8,decimal_places=2) authors = mode

多对多三种创建方式,forms组件,cookie和session

多对多三种创建方式 1.全自动 优点:不需要自己手动创建第三章表缺点:由于第三张表不是自己创建的,也就是说第三张表字段是固定的没有办法做扩展 class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalField(max_digits=8,decimal_places=2) authors = models.ManyToManyField(to='Author') class Au

Django框架进阶6 多对多三种创建方式, Ajax, Content-Type前后端传输数据编码格式, Ajax发送文件数据, django内置的序列化功能, Ajax结合sweetalert实现删除二次确认, 批量插入数据, 自定义分页器, ajax结合sweetalert实现删除二次确认

多对多三种创建方式 1.全自动(较为常用) class Book(models.Model): title = models.CharField(max_length=32) authors = models.ManyToManyField(to='Author') # orm就会自动帮你创建第三张表 class Author(models.Model): name = models.CharField(max_length=32) ''' 好处:第三张表自己创建 不足之处:第三张表无法扩展额外

Spring IOC 中三种注入方式

项目错误知识点记录 正文 最近在项目的时候,用到Spring框架,Spring框架提供了一种IOC的自动注入功能,可以很轻松的帮助我们创建一个Bean,这样就省的我们四处写new Object()这样的代码了.IOC提供了三种注入方式,接口注入,set方法注入以及构造器注入,三种注入方式使用起来都很easy,具体的使用方法网上都有很多,大家可以自行搜索百度... 那天当我使用接口注入的时候,发现IDEA给我一个警告(以前也有这样的警告,只不过我没太注意),看了看是让我采用构造器注入方式.这就让我

Spring IOC的三种注入方式

Spring IOC三种注入方式: 1.    接口注入 2.    getter,setter方式注入 3.    构造器注入 对象与对象之间的关系可以简单的理解为对象之间的依赖关系:A类需要B类的一个实例来进行某些操作,比如在A类的方法中需要调用B类的方法来完成功能,叫做A类依赖于B类.控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术,由容器控制程序之间的关系,而不是由代码直接控制. 1.接口注入 public class ClassA {  private InterfaceB