【spring】1.spring ioc原理和demo

我们先做一个简单的spring例子。


面向接口编程,我们先来定接口


IHelloWorld

package com.services;

public interface IHelloWorld {
	
	public void sayHello();

}

写一个实现类,并且声明一个String属性,提供set方法注入

package com.services.impl;

import com.services.IHelloWorld;

public class HelloWorld implements IHelloWorld {

	private String helloWorld;

	public void setHelloWorld(String helloWorld) {
		this.helloWorld = helloWorld;
	}

	@Override
	public void sayHello() {
		System.out.println("hello world");
	}

}

编写配置文件

<pre name="code" class="html"><?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-3.1.xsd">

	<bean id="helloWorldBean" class="com.services.impl.HelloWorld">
		<property name="helloWorld">
			<value>helloworld !!!</value>
		</property>
	</bean>

</beans>


注意看。配置文件的含义:

beans里面是各种bean对象的声明。

bean对象里面描述了bean的信息,里面包括bean名称,对应的class文件,class文件里的属性和值。

编程测试文件:

package com;

import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.core.io.ClassPathResource;

import com.services.IHelloWorld;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		ClassPathResource resource = new ClassPathResource(
				"applicationContext.xml");
		DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
		XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
		reader.loadBeanDefinitions(resource);
		IHelloWorld hello = (IHelloWorld) factory.getBean("helloWorldBean");
		hello.sayHello();
	}

}


技术分享

ioc原理简单分析:

我们看看测试代码:


                //这里其实是读取xml文件

ClassPathResource resource = new ClassPathResource(
"applicationContext.xml");

                //创建bean工厂,把读取到的载入我们的xml的reader当中

DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(resource);


//这里其实是通过反射,获得bean对象

IHelloWorld hello = (IHelloWorld) factory.getBean("helloWorldBean");
hello.sayHello();


简述ioc原理:如果我们不使用spring,那么bean对象创建就是通过new等方式硬代码的方式写入程序中。

ioc其实是把bean的信息写入xml文件,通过jdom去解析到bean节点信息,然后里面包含bean的id或者name,还有bean对应的class全路径,那么我们通过getBean方法,就可以获取到bean的类全路径,通过反射就可以得到bean对象,程序内部其实是用hashMap来保存xml解析出来的信息的,hashMap的key其实就是我们写在xml里面的id,而值就是class对应的类全路径,然后通过对象工厂,得到bean工厂后getBean就可以反射得到bean对象。类的创建过程是spring来帮你完成,我们自己的代码中并未创建对象,也没有对属性赋值,整个过程spring容器完成,这也就是通常所说的依赖注入,或者说叫控制反转(创建对象的过程是spring容器完成的,控制权发生了变化)


ioc其实里面应用到了jcom(解析xml),反射(xml里面的类全路径后getBean得到对象),工厂设计模式。


部分源码:


BeanFactory为顶层接口:该接口有很多常见的子接口和实现类,大家可能还会看到很多其他人代码用的XmlBeanFactory等子类实现,该接口有很多方法,我们常用获得bean的方法getBean方法如下:


技术分享


技术分享


而大家代码第一步获取xml对象的方法,对应接口其实是Resource接口,里面也有很多常见的实现类。

技术分享

太具体的源码 大家自己看看api就都懂了  粗浅的原理还是很容易懂得

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。