BeanFactory & ApplicationContext
在spring中容器分为两类:
n BeanFactory
n ApplicationContext
BeanFactory:
从名字上面可以看出,BeanFactory使用的是工厂设计模式。也就是说这个类可以分发所有的Bean。
BeanFactory接口有多种实现,常用的为XmlBeanFactory。
//用BeanFactory读取classpath中的spring配置文件 BeanFactory factory = new XmlBeanFactory(new ClassPathResource("spring.xml")); |
或
//用BeanFactory读取文件系统中的spring配置文件 BeanFactory factory = new XmlBeanFactory(new FileSystemResource("C:/spring.xml")); |
ApplicationContext:
对于简单的应用BeanFactory已经足够强大了,但是为了获得spring提供的更强大的功能,则要使用更高级的spring容器ApplicationContext。ApplicationContext和BeanFactory都是从配置文件中载入Bean的定义,进行装配,然后根据需要进行分发Bean。但是ApplicationContext提供了如下的更多功能:
n 提供了文本解析工具,包括I18N国际化;
n 提供了载入文件资源的通用方法;
n 可以向注册为监听器的Bean发送事件。
在ApplicationContext的实现中,三个实现经常用到:
n ClassPathXmlApplicationContext 从classpath(包含jar)中读取spring配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); |
n FileSystemXmlApplicationContext 从文件系统中读取spring配置文件
ApplicationContext context = new FileSystemXmlApplicationContext("C:/spring.xml"); |
n XmlWebApplicationContext 从web系统中读取spring配置文件
除了ApplicationContext提供的附加功能外,,ApplicationContext和BeanFactory的一个重要区别是关于单例Bean是如何被载入的。BeanFactory延迟加载所有的Bean,直到getBean()方法被调用的时候Bean才会被创建。ApplicationContext则会预载入单例Bean,当调用getBean()方法的时候,Bean已经被创建成功。
spring配置文件的schema
<?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-2.0.xsd"> </beans> |
在spring配置文件中配置一个bean
<bean id="userDao" class="com.kay.dao.impl.UserDAOImpl"></bean> |
或
<bean name="userDao" class="com.kay.dao.impl.UserDAOImpl"></bean> |
注意id和name属性的区别及联系:
id和name属性都是用来指定bean标识符。id具有唯一性,并且是xml中真正的id属性,受到xml解析器的验证功能,在使用中必须和java中命名变量一样去命名id的值,比如不能以数字开始等约束。但是name属性值则没有要求,如果愿意,可以赋给的值为“123”等,name属性还可以使用”,”号来进行分割多个为该bean指定的标识(别名),例如:
<bean name="userDao,dao,user" class="com.kay.dao.impl.UserDAOImpl"></bean> |
name属性并不是必须的,当不写name属性时,spring容器会自动生成name属性值。
<bean class="com.kay.dao.impl.UserDAOImpl"></bean> |
那么在获取该bean的时候,name属性和class属性值相同。
如果在spring配置文件中同时这样声明了三个相同的bean:
<bean class="com.kay.dao.impl.UserDAOImpl"></bean> <bean class="com.kay.dao.impl.UserDAOImpl"></bean> <bean class="com.kay.dao.impl.UserDAOImpl"></bean> |
那么name的值分别为:
com.kay.dao.impl.UserDAOImpl com.kay.dao.impl.UserDAOImpl#1 com.kay.dao.impl.UserDAOImpl#2 |