一、容器概览
1、元数据的配置
元数据的配置,一般来说可以分为三种方式:最简单直接的就是使用xml配置文件,另外两个就是spring注解配置与使用java注解的配置。这次我们先从xml开始谈起,逐步进行深入。
在xml里,使用<bean>和</bean>来定义一个元数据。一般来说,你可以定义service层的对象,data access 对象,表示层对象(如 Structs Action)等等。如下,给出了xml配置的元数据的基本结构:
2、初始换一个容器
在spring里,最经典的容器就是ApplicationContext,其初始化如下:
ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"services.xml", "daos.xml"});
当中service.xml服务层对象实例如下:
接着就是daos.xml数据访问对象:
?xml version="1.0" encoding="UTF-8"?>
在上面的Demo里,服务层对象是PetStoreServiceImpl类对象,两个data access对象分别是SqlMapAccountDao和SqlMapItemDao类对象,这两个data access对象都是基于iBatics ORM框架的。
如果有多个xml元数据的配置文件,可以将他们组合成一个基于xml的配置文件,如下:
如上,加载了三个外部文件,services.xml , messageSource.xml 和 themeSource.xml,其中services.xml必须在classpath路径下,而messageSource.xml和themeSource.xml则需要在resources文件夹下。
3.使用容器
所有配置的最终目的都是为了使用,现在来看一下如何使用容器ApplicationContext。ApplicationContext在维护一个各个Bean和其依赖项的注册表。使用方法T getBean(String name,Class<T> requiredType>,可以获得对应Bean的实例。如下:
// 创建容器ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"services.xml", "daos.xml"});// 获取配置Bean的实例PetStoreServiceImpl service = context.getBean("petStore", PetStoreServiceImpl.class);// 使用实例List userList = service.getUsernameList();
二、Bean的概览
ioc容器管理着一个或多个bean。这些bean都可以通过指定的配置方式,提供给ioc容器。如上文谈到的xml的配置方式<bean/>
相对于容器本身来说,这些bean都会作为 BeanDefinition 的对象,一般包含了以下元数据:
- 全限定名(包+类名):java bean 类名
- bean的行为:指定了bean在容器里的行为,包括作用域 scope,生命周期的回调方法等等
- bean的依赖对象
- 其他属性配置:如连接池的连接数量
如下,是一些常用的bean属性:class,name,scope,constructor arguments,properties,autowiring mode,lazy-initialization mode,initialization method,destruction method。
1、命名Bean
在xml配置文件里,可以使用属性 id 或 name 来命名一个bean。当中 id 是bean的唯一标志名,在整个 xml 文档中唯一。属性 name 用来为 id 指定一个或多个别名,多个别名之间用逗号”,“,分号”;“或者空格来分开。
当你没有为bean 指定 id 或 name 时,容器会自动为此bean 指定一个唯一的标志名。当然了,如果你需要 ref 指向此 bean ,就必须为其指定一个name
2、bean 的别名
3、实例化 bean
spring 提供了三种方式实例化一个 bean。基于xml配置的,可以使用类构造器,静态工厂方法,实例工厂方法
- 使用类构造器实例化bean,如下:
- 使用静态工厂方法
静态工厂方法要求类需要包含一个静态工厂方法, 同时需要再xml配置文件里指定工厂方法,如下:(createInstance 必须是static方法)
ClientService类设计如下:
public class ClientService { private static ClientService clientService = new ClientService(); private ClientService() {} public static ClientService createInstance() { return clientService; }}
- 实例工厂方法
与静态工厂方法类似,实例化工厂方法是使用容器里已存在 factory bean 的非静态方法来实例化一个新bean。使用这种方式实例化bean,应该将属性 name 设置为空,设置 factory-bean指定factoryBean,属性 factory-method指定实例化方法,如下:
DefaultServiceLocator设计如下:
public class DefaultServiceLocator { private static ClientService clientService = new ClientServiceImpl(); private DefaultServiceLocator() {} public ClientService createClientServiceInstance() { return clientService; }}
public class DefaultServiceLocator { private static ClientService clientService = new ClientServiceImpl(); private static AccountService accountService = new AccountServiceImpl(); private DefaultServiceLocator() {} public ClientService createClientServiceInstance() { return clientService; } public AccountService createAccountServiceInstance() { return accountService; }}