Spring深入浅出(一)IOC详解(二)

2014-11-24 02:55:35 · 作者: · 浏览: 1
oid setGrade(Grade grade) { this.grade = grade; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public int getAge() { return age; } public int getTotleGrade() { return grade.getEnglish()+grade.getMath(); } }
package test2;

public class Grade {
	private int math;
	private int english;
	public int getMath() {
		return math;
	}
	public void setMath(int math) {
		this.math = math;
	}
	public int getEnglish() {
		return english;
	}
	public void setEnglish(int english) {
		this.english = english;
	}
}

Bean.xml配置文件(该文件只要放在test2包里面就好了)
  



  
   //很多豆豆
	
   
    //第一个豆豆,是一个Person类,id名字随便取,还要写上类的全名 
    
     //下面开始把这个类里面的所有属性列出来,并赋值,至于你说难道一定要赋值吗?我想可以,我刚学,不知道 
     
      小龙
     //这里的名字是通过程序里面的set来赋值的,不信你去掉程序里面相关的set,就出错了 
     
     
     
      23
      
     
    
     //这里有点特别,这个grade变量是一个对象,和一般的变量要区别对待 
     //这里指向了本配置文件里面一个名字叫Grade(即id=Grade)的bean 
     
   
	
   
    //同上 
     
     
      99
      
     
     
     
      59
      
     
   

  

Test类
package test2;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import test.ExampleBean;

public class Test {
	public static void main(String args[]){
		Resource input = new ClassPathResource("test2/Bean.xml");//Bean.xml的路径

		System.out.println("resource is:" + input);

		BeanFactory factory = new XmlBeanFactory(input);//把input扔到工厂里面去,这个工厂就能为你提供实例了(我也不知道能不能这样说)

		Person person =(Person) factory.getBean("Person");//你要一个叫Person的东西,那好,工厂就去找“Person"给你
		Grade grade=(Grade)factory.getBean("Grade");
		System.out.println("姓名:"+person.getName());//person可以调用里面相关的方法,就相当于new了一个Person一样
		System.out.println("年龄:"+person.getAge());
		System.out.println("数学成绩:"+grade.getMath());
		System.out.println("英语成绩:"+grade.getEnglish());
		System.out.println("数学,英语总成绩:"+person.getTotleGrade());
	}
}

如此看来,你在对比一开始的那个水果的程序,你会发现,spring配置文件,还是一个工厂,只不过换种形式一样,他管理所有的类,新建的类要到工厂里面去登记,不然就不能被主程序用,这就是为什么说ioc就是工厂模式的升级版。至于配置文件的书写,就跟堆积木一样。
--------------------------------- 顺便提下,关于Spring读取配置文件的方法: applicationcontext--- FileSystemXmlApplicationContext---这个方法是从文件绝对路径加载配置文
ClassPathXmlApplicationContext---这个方法是从classpath下加载配置文件(适合于相对路径方式加载) XmlWebApplicationContext----专为web工程定制的方法,推荐Web项目中使用。
beanfactory--- ClassPathResource --- 从 系统的类路径中加载
FileSystemResource --- 从文件系统加载,比如说自己指定配置文件的全路径
InputStreamResource --- 从输入流中加载
ServletContextResource --- 从Servlet 上下文环境中加载
UrlResource --- 从指定的Url加载
--------------------------------------------- BeanFactory和ApplicationContext的区别 ApplicationContext接口,它由BeanFactory接口派生而来,因而提供BeanFactory所有的功能。ApplicationContext以一种更向面向框架的方式工作以及对上下文进行分层和实现继承,ApplicationContext包还提供了以下的功能:
MessageSource, 提供国际化的消息访问
资源访问,如URL和文件
事件传播
载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层
最主要的就是BeanFactory延迟加载,当使用到getBean的时候才会抛异常,而ApplicationContext在刚开始启动加载的时候就会抛出异常,这样有利于检查所依赖属性是否注入;所以通常情况下我们选择使用ApplicationContext。