Spring基于IOC容器基本原理

一、简介
    org.springframework.beans及org.springframework.context包 是Spring IoC容器
的基础。BeanFacotry提供的高级配置机制,使得管理各种对象成为可能,ApplicationContext是BeanFactory的扩展,因而BeanFactory所具备的能力和行为也适用于ApplicationContext,并且功能得到了进一步增强,比如更易 与Spring AOP集成、资源处理(国际化处理)、事件传递及各种不同应用层的context实现。
总之,BeanFactory提供了配制框架及基本功能,而 ApplicationContext 则增加了更多支持企业核心内容的功能。

二、 容器和bean
在Spring中,那些组成你应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean。 简单地讲,bean就是由Spring容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象(pojo)没有什么区别了。


1、容器

BeanFactory 是Spring IoC容器的实际代表者,IoC容器负责容纳所描述的bean,并对bean进行管理。
在Spring中,BeanFactory是IoC容器的核心接口。 它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。

1.1、实例化bean
bean定义描述如何创建一个或多个对象实例。容器从bean定义列表中取得一个指定的bean定义,并根据bean定义里面的配置元数据,使用反射机制来创建实际对象。bean的实例化的定义方式如下:

//用构造器来实例化
<bean id="exampleBean" class="examples.ExampleBean"/>

//使用静态工厂方法实例化
<bean id="exampleBean"
      class="examples.ExampleBean2"
      factory-method="createInstance"/>

//使用实例工厂方法实例化
<bean id="serviceLocator" class="com.foo.DefaultServiceLocator">
</bean>
<!-- the bean to be created via the factory bean -->
<bean id="exampleBean"
      factory-bean="serviceLocator"
      factory-method="createInstance"/>


1.2、实例化容器
spring团队倾向于把xml配置文件拆成多个部分的做法。通过将xml配置文件的路径作为参数传给ApplicationContext构造器,生成一个ApplicationContext实例,即实例了BeanFactory,BeanFacotry从多个配置文件读取bean定义。
ApplicationContext加载xml文件写法可以这样:

//1 第一种方法,使用数组
ApplicationContext context = new ClassPathXmlApplicationContext(
        new String[] {"services.xml", "daos.xml"});
//2 使用通配符
ApplicationContext contex=new ClassPathXmlApplicationContext("s*.xml");

//3 使用组合的方式
ApplicationContext contex=new ClassPathXmlApplicationContext("services.xml");
在services.xml中
     <import resource="daos.xml"/>  执行resource路径为相对daos.xml的路径 


其他加截xml配置文件实例化IOC容器的方法有:

//applicationContext.xml放在工程目录下,也可以写成绝对路径
Resource resource = new FileSystemResource("applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(resource);

//位于src目录下
ClassPathResource resource = new ClassPathResource("applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(resource);
 
ApplicationContext context = new FileSystemXmlApplicationContext("applicationContext.xml");
//位于src目录下
ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml", "applicationContext2.xml"});
BeanFactory factory = (BeanFactory) context;


三、使用容器
BeanFactory factory = context;

获得BeanFactory容器后,接着使用getBean(String)就可以取得bean实例。

四、简单的例子(基于IOC的bean注入,将bean注入到执行类Test里)
首先创建一个对象HelloWorld(bean)
public class HelloWorld {
	private String msg;

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}
	
}


然后修改spring配置文件applicationContext.xml,在配置文件中实例化bean
<bean id="helloBean" class="com.spring.demo.HelloWorld">
       <property name="msg" value="Hello World!"/>
   </bean> 


再创建一个将要把bean注入进的类Test
public static void main(String[] args){
		//读取配置文件,获得BeanFactory
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		BeanFactory factory = context;
		
		HelloWorld hello = (HelloWorld)factory.getBean("helloBean");
		
		System.out.println(hello.getMsg());	
	}

通过Bean上下文工具获取Bean对象并注入给Test,然后输出其中的属性.

你可能感兴趣的:(spring,bean,xml,配置管理,IOC)