Spring-Bean的获取

Spring-Bean的获取

要使应用程序中的Spring容器成功启动,需要同时具备以下3方面的条件:

  1. Spring框架的类包都已经放到应用程序的类路径下。
  2. 应用程序为Spring提供完备的Bean配置信息。
  3. Bean的类都已经放到应用程序的类路径下。

  Spring通过一个配置文件描述了Bean及Bean之间的依赖关系,利用Java语言的反射功能实例化Bean并建立Bean之间的依赖关系。Spring的IoC容器在完成这些底层工作的基础上,还提供了Bean实例缓存、生命周期管理、Bean实例代理、事件发布、资源装载等高级服务。

  Spring启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配好Bean之间的依赖关系,为上层应用提供准备就绪的运行环境。

  Bean配置信息是Bean的元数据信息,它由以下4个方面组成。

  1. Bean的实现类。
  2. Bean的属性信息,如数据源的连接数、用户名、密码等。
  3. Bean的依赖关系,Spring根据依赖关系配置完成Bean之间的装配。
  4. Bean的行为配置,如生命周期范围及生命周期各过程的回调函数等。

它们的相互关系,如下

关系

BeanFactory

  诚如其名,BeanFactory是一个类工厂,但它和传统的类工厂不同,传统的类工厂仅负责构造一个或几个类的实例,而BeanFactory是类的通用工厂,他可以创建并管理各种类的对象。

通过BeanFactory获取Bean

beans.xml Cat的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="c" class="com.smart.model.Cat"
p:weigth="50"
p:age="4"
p:color="白色"
/>
<bean id="c2" class="com.smart.model.Cat"
p:weigth="40"
p:color="橘色"
p:age="2"
/>
<bean class="com.smart.model.Cat"/>
</beans>

test类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import com.smart.model.Cat;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;

public class test1 {
public static void main(String[] args) {
ResourcePatternResolver resolver=new PathMatchingResourcePatternResolver();
Resource res=resolver.getResource("classpath:beans/cat.xml");
BeanFactory bf=new XmlBeanFactory(res);
System.out.println("使用XmlBeanFactory启动Spring容器");
Cat c=bf.getBean("c", Cat.class);
System.out.println(c.getAge()+" "+c.getColor()+" "+c.getWeigth());
}
}

结果

测试


  XmlBeanFactory通过Resource装载Spring配置信息并启动IoC容器,然后就可以通过BeanFactory #getBean(beanName)方法从IoC容器中获取Bean了。通过BeanFactory启动IoC容器时,并不会初始化配置文件中定义的Bean。

通过ApplicationContext获取Bean

  ApplicationContextBeanFactory派生而来,提供了更多面向实际应用的功能。在BeanFactory中,很多功能需要以编程的方式实现,而在ApplicationContext中则可以通过配置的方式实现。

  在获取ApplicationContext实例后,就可以像BeanFactory一样调用getBean(beanName)返回Bean了。

  1. 配置文件放置在类路径下

      优先使用ClassPathXmlApplicationContext实现类.

    1
    ApplicationContext ctx=new ClassPathXmlContext("路径");

  2. 配置文件放置在文件系统的路径下

      可以考虑优先使用FilySystemXmlApplicationContext实现类

    1
    ApplicationContext ctx=new FilySystemXmlApplicationContext("路径");

  3. 指定一组配置文件

    1
    ApplicationContext ctx=new ClassPathXmlApplicationContext(new String[]{"路径1","路径2"});

  4. 类注解配置(@Configuration)

      使用AnnotationConfigApplicationContext实现类

    1
    ApplicationContext ctx=new AnnotationConfigApplicationContext("路径");

示例

1
2
3
4
5
6
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("beans/cat.xml");
Cat c=ctx.getBean("c", Cat.class);
System.out.println("使用ClassPathXmlApplicationContext启动Spring容器");
System.out.println(c.getAge()+" "+c.getColor()+" "+c.getWeigth());
}

PS:使用的是IDEA,需要注意路径,xml配置文件要放在resources文件夹里中不要放在java文件夹里

ps

它们的区别

  ApplicationContext的初始化和BeanFactoy的初始化有一个重大的区别:BeanFactey在初始化容器 时,并未实例化Bean,直到第一次访问某个Bean时才实例化目标Bean;而ApplicationContext在初始化应用上下文时就实例化所有单实例的Bean。因此ApplicationContext的初始化时间会比BeanFactey稍长一些。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×