2.装配bean(一)

        创建应用对象之间协作的行为,称为装配,其实质是spring容器建立bean之间关系依赖的过程。spring提供两种方式来进行创建,基于XML的配置与基于注解的配置。

        在spring中有两种容器,一种为beanFactory,是所有容器的父级,第二种为ApplicationContext,ApplicationContext拥有一些特定的功能,比beanFactory更加丰富,除非有特定的情况,一般考虑用ApplicationContext作为容器,另外beanFactory是延迟加载,即当第一次使用bean的时候才进行加载,而applicationContext是初始化就加载,在容器启动时候有利于检验bean的错误。

 

        以下是spring XML配置文件中的10个命名空间:

命名空间用途
aop为声明切面以及@AspectJ注解的类代理为spring切面提供了配置元素
beans支持声明bean和装配bean,是spring最核心和最原始的命名空间
context为配置spring应用上下文提供了配置元素,包括自动检测和自动装配bean,注入非spring直接管理的对象
jee提供了与java EE API的集成,例如EJB和JNDI
jms为声明消息驱动的POJO提供了配置元素
lang支持配置由groovy,Jruby或者beanSheel等脚本实现的bean
mvc启动spring MVC的能力,例如面向注解的控制器,视图控制器和拦截器
oxm支持spring的对象到xml的映射配置
tx提供声明式事务配置
util提供各种各样的工具类元素,包括把集合配置为bean,支持属性占位符

 

        最基础的spring xml配置文件如下:

 

<?xml version="1.0" encoding="UTF-8"?>
<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">


</beans>

 

 

声明一个bean:

 

package org.robbie.test.spring.inf;

import org.robbie.test.spring.exception.PerformerException;

public interface Performer {
	
	void perform() throws PerformerException;
	
}

 

package org.robbie.test.spring.beans;

import org.robbie.test.spring.exception.PerformerException;
import org.robbie.test.spring.inf.Performer;

public class Juggler implements Performer{
	
	private int beanBags = 3;
	
	public Juggler() {}
	
	public Juggler(int beanBags){
		this.beanBags = beanBags;
	}
	

	@Override
	public void perform() throws PerformerException {
		System.out.println("Juggling " + beanBags + " Beanbags");
	}

}

 

<?xml version="1.0" encoding="UTF-8"?>
<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="duke" class="org.robbie.test.spring.beans.Juggler">
		
	</bean>
	
</beans>

 

package org.robbie.test.spring;

import org.robbie.test.spring.beans.Juggler;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class BeanTest {

	public static void main(String[] args) throws Exception {
		ApplicationContext context = new ClassPathXmlApplicationContext("spring/basic.xml");
		Juggler juggler = (Juggler)context.getBean("duke");
		juggler.perform();
	}
	
}

 通过构造器注入:

 

 

<?xml version="1.0" encoding="UTF-8"?>
<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="duke" class="org.robbie.test.spring.beans.Juggler">
		<constructor-arg value="5"></constructor-arg>
	</bean>
	
</beans>

 如果有多个参数,通过index属性标识位置,下标从0开始

 

 

通过构造器注入对象引用:

 

package org.robbie.test.spring.inf;

public interface Poem {
	
	void recite();
}

 

package org.robbie.test.spring.beans;

import org.robbie.test.spring.inf.Poem;

public class Robbie implements Poem{

	@Override
	public void recite(){
		System.out.println("recite poem !!");
	}

}

 

<?xml version="1.0" encoding="UTF-8"?>
<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="duke" class="org.robbie.test.spring.beans.Juggler">
		<constructor-arg value="5"></constructor-arg>
		<constructor-arg ref="robbie"></constructor-arg>
	</bean>
	<bean id="robbie" class="org.robbie.test.spring.beans.Robbie"></bean>
	
</beans>

 通过工厂方法创建:

 

 

package org.robbie.test.spring.beans;

public class Stage {
	
	private Stage(){}
	
	private static class StageSingletonHolder{
		static Stage instance = new Stage();
	}
	
	public static Stage getInstance(){
		return StageSingletonHolder.instance;
	}
}

 注意:该类中用到了延迟实例化创建单例,并考虑线程同步问题。

 

 

<?xml version="1.0" encoding="UTF-8"?>
<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="stage" class="org.robbie.test.spring.beans.Stage" factory-method="getInstance"></bean>
	
</beans>

 如果要用其他工厂(spring bean)进行创建,则需要配置factory-bean

 

 

<?xml version="1.0" encoding="UTF-8"?>
<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="stage" factory-method="getInstance" factory-bean="XXXXXBean"></bean>
	
</beans>

 bean的作用域:

 

作用域定义
singleton在每一个Spring容器当中,一个Bean定义只有一个对象实例(默认)
prototype允许bean的定义可以被实例化任意次(每次调动都创建一个实例)
request

在一次HTTP请求当中,每个Bean定义对应一个实例,该作用域只在基于web的spring上下文中(例如spring mvc)有效

session在一次HTTP session当中,每个Bean定义对应一个实例,该作用域只在基于web的spring上下文中(例如spring mvc)有效
global-session在一个全局的HTTP-session中,每个bean定义对应一个实例,该作用域只在portlet上下文中有效

 

初始化和销毁bean:

<?xml version="1.0" encoding="UTF-8"?>
<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="testBean" class="test.bean" init-method="initMethod" destroy-method="destroyMethod">
	</bean>
	
</beans>

 配置init-method和destroy-method属性调用不同方法在bean创建和销毁时进行方法回调。如果是全局的在某个配置文件上都需要用同样的方法来处理初始化和销毁,则可以进行全局配置:

<?xml version="1.0" encoding="UTF-8"?>
<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" 
           default-init-method="initMethod" default-destroy-method="destroyMethod">
</beans>

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值