创建应用对象之间协作的行为,称为装配,其实质是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:
扫描二维码关注公众号,回复:
633148 查看本文章
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>