Spring(二)——Spring管理Bean的原理

一、创建用户库

       创建一个用户库,导入JAR包

二、模拟Spring容器

    ①、建立一个类ItcastClassPathApplicationContext
    ②、在这个类中读取XML文件
    
public class ItcastClassPathApplicationContext {

	// 存放Bean的集合
	private List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>();

	private Map<String,Object> sigletons = new HashMap<String, Object>();
	
	public ItcastClassPathApplicationContext(String filename) {
		this.readXML(filename);		
		
		//实例化Bean对象
		this.instanceBeans();
	}
		

	//实例化Bean对象
	private void instanceBeans() {
           for(BeanDefinition beanDefinition : beanDefines){
                try {
                     if(beanDefinition.getClassName()!=null && !"".equals(beanDefinition.getClassName().trim()))
                     sigletons.put(beanDefinition.getId(), Class.forName(beanDefinition.getClassName()).newInstance());
                } catch (Exception e) {
                     e.printStackTrace();
                }
          }

        }

	/*
	 * 读取配置文件
	 */
	private void readXML(String filename) {

		//创建一个读取器
		SAXReader saxReader = new SAXReader();
		Document document = null;
		try {

			//取得这个文件
			URL xmlpath = this.getClass().getClassLoader()
					.getResource(filename);
			
			//读取文件内容
			document = saxReader.read(xmlpath);
			
			//新建一个Map对象
			Map<String, String> nsMap = new HashMap<String, String>();
			
			//读取配置的命名空间
			nsMap.put("ns", "http://www.springframework.org/schema/beans");
			
			// 创建beans/bean查询路径
			XPath xsub = document.createXPath("//ns:beans/ns:bean");
			
			xsub.setNamespaceURIs(nsMap);// 设置命名空间
			List<Element> beans = xsub.selectNodes(document);// 获取文档下所有bean节点
			
			//取得所有的Bean
			for (Element element : beans) {
				String id = element.attributeValue("id");// 获取id属性值
				String clazz = element.attributeValue("class");
				BeanDefinition beanDefine = new BeanDefinition(id, clazz);							
				//放到集合中
				beanDefines.add(beanDefine);
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

	}
	
	/**
	 * 获取bean实例
	 * @param beanName
	 * @return
	 */
	public Object getBean(String beanName){
		return this.sigletons.get(beanName);
	}
}
     ③、建立存放Bean中id和Class的类——BeanDefinition
         
public class BeanDefinition {
	private String id;
	private String className;
	
	public BeanDefinition(String id, String className) {
		this.id = id;
		this.className = className;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getClassName() {
		return className;
	}
	public void setClassName(String className) {
		this.className = className;
	}
	
}
     ④、建立一个单元测试
     
@Test public void instanceSpring(){
		ItcastClassPathXMLApplicationContext ctx = new ItcastClassPathXMLApplicationContext("beans.xml");
		PersonService personService = (PersonService)ctx.getBean("personService");
		personService.save();
	}
     ⑤、结果
     调用save方法成功
     

三、Spring管理Bean的作用域

    通过上面的代码,我们可以测试出,在容器启动时实例化bean。这时我们每次调用的bean是同一个bean,如果我们想每次从容器获取bean都是新的对象,则在bean中加入scope="prototype"


评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值