package com.tan.spring.ioc; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; public class IOCDemo1 { /** * * 控制反转模式( 也叫做依赖性介入) 基本的概念: 不创建对象,但是描述创建他们的方式. * 在代码中不直接与对象和服务连接, 但是在配置文件中描述哪一个组件需要那一项服务 * 容器( Spring 框架中 是IOC容器) 负责这些联系在一起 * * * IOC场景中让其创建了所有的对象, 并设置必要的属性将他们联系在一起,决定什么时间调用方法 * * 实现的模式: * ①: 服务需要实现专门的接口,通过接口,由对象提供这些服务, * 可以从对象查询依赖性( 例如需要的附加的服务 ) * ②: 通过 JavaBean 的属性 (例如 setter 方法) 分配依赖性 * ③: 依赖性以构造函数的形式提供, 不以javabean属性的形式公开 * @param args */ public static void main(String[] args) { /* * Spring设计的核心就是 org.springframework.beans 包,它的设计目标与 JavaBean组件一起使用。 * 这个包通常不是由用户直接使用, 而是由服务器将其用作其他的多数功能的底层中介。下一个最高级抽象是 * BeanFactory接口,是工厂设计的模式的实现,允许通过名称创建和检索对象。 * BeanFactory也可以管理对象之间的关系. * * BeanFactory 支持两个对象的模型。 * - 单态: 提供了具有特定名称的对象的共享实例,可以再查询时候对其进行检索。Singleton 是默认的也是最常用的对象的模型。对于无状态服务对象很理想。 * - 原型: 确保每次检索都会创建单独的对象。在每个用户都需要自己的对象的时候,原型模型最适合。 * bean 工厂的概念是 Spring 作为 IOC 容器的基础。 IOC 将处理事情的责任从应用程序代码转义到框架。 * * */ /* * BeanFactory 接口 * org.springframework.beans.factory.BeanFactory 是一个简单的接口,所以可以针对各种底层存储方法实现。最常用的BeanFactory 定义是 * XmlBeanFactory, 根据 Xml文件的定义装入 bean * */ // 实例化 Spring IOC 容器的方式一 Resource resource = new FileSystemResource("mybean.xml"); BeanFactory factory1 = new XmlBeanFactory(resource); // 实例化 Spring IOC 容器的方式二 ClassPathResource classPathResource = new ClassPathResource( "mybean.xml"); BeanFactory factory2 = new XmlBeanFactory(classPathResource); // 实例化 Spring IOC 容器的方式三 ApplicationContext context1 = new FileSystemXmlApplicationContext( "mybean.xml"); ApplicationContext context2 = new ClassPathXmlApplicationContext( new String[] { "applicationContext.xml", "applicationContext-part2.xml" }); // of course, an ApplicationContext is just a BeanFactory BeanFactory factory3 = (BeanFactory) context1; BeanFactory factory4 = (BeanFactory) context2; } }
package com.tan.spring.util; import java.io.File; import java.io.FilenameFilter; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; /** * * @author Administrator * */ public class ApplicationContextUtil { private static ApplicationContext context; public static ApplicationContext buildApplicationContext(final String path) { if (path == null || path.trim().length() == 0) { String root = ApplicationContextUtil.class.getResource("/").getFile(); File dir = new File(root); String[] xmls = dir.list(new FilenameFilter(){ public boolean accept(File dir, String name) { return name.toLowerCase().endsWith(".xml"); } }); for (String xml : xmls) { System.out.println(xml); } return new ClassPathXmlApplicationContext(xmls); } return new FileSystemXmlApplicationContext(path); } public static ApplicationContext buildApplicationContext(final String ... paths) { if (paths == null || paths.length == 0) { return new ClassPathXmlApplicationContext("applicationContext.xml"); } return new ClassPathXmlApplicationContext(paths); } public static ApplicationContext getApplicaionContext() { return context; } }