A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

前言
工厂模式是一种在工程中广泛应用的设计模式,对代码的解耦合起到了很大的作用。实际上,我们可以将Spring理解成封装了我们工程中大量重复代码的一种工具,上一节说了,Spring中最为重要的组件就是IOC,而IOC中非常重要的部分就是应用了工厂模式的代码。而工厂模式依赖于Java的反射机制,所以,我们从反射机制讲起,一步步了解Spring的Bean工厂。

Java中的反射机制
我们在此处并不会详细介绍反射机制,只会讲述一些简单的内容,详细的东西我会整合成一篇文章供大家参考。
反射机制是指程序在运行的过程中,对于任意的一个类,我们都能够获取它的所有属性、方法,对于任何一个对象,都能调用它的任意方法和属性。
你还记得我们使用JDBC的流程吗?
[Java] 纯文本查看 复制代码
//1.加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
//2.获得数据库链接
Connection conn=DriverManager.getConnection(URL, USER, PASSWORD);
……
……

Class.forName()方法就是在程序运行的过程中,动态的将Driver这个类加加载到JVM(Java虚拟机)中并初始化,然后我们就能够直接调用这个类及其方法。实际上最简单的工厂模式就是用的这个方法,在JVM运行期直接通过forName方法创建某个类。了解了这些我们就开始工厂模式的讲解。

工厂模式
工厂模式提供了一种绝佳的创建对象的方法。在工厂模式中,我们并不会直接使用new来创建一个对象,而是使用一个共同的接口类来指定其实现类,这就大大降低了系统的耦合性——我们无需改变每个调用此接口的类,而直接改变实现此接口的类即可完成软件的更新迭代。直接来看一下下面这个工厂模式的代码。
[Java] 纯文本查看 复制代码
import java.util.ResourceBundle;

/**
 * 使用此工厂类创建bean实例
 */
public class BeanFactory {
    //加载配置文件
    private static ResourceBundle bundle;
    static {
        bundle = ResourceBundle.getBundle("instance");
    }

    //根据指定的key,读取配置文件的全路径,创建对象
    public static <T>T getInstance(String key,Class<T> clazz){
        String className = bundle.getString(key);

        try {
            return (T)Class.forName(className).newInstance();
        }catch (Exception e){
            throw new RuntimeException();
        }
    }
}

Class.forName(className).newInstance()方法就会返回className对应的类,这样我们就能够使用了。
ResourceBundle这个类是用来读取classpath中文件,这个文件需要放在resources文件夹或java包的根路径下,文件名必须是*.properties这个配置文件类型。这样读取到的文件流就形成了键值对的存储形式。配置文件的示例如下(使用键值对的方式配置):
[XML] 纯文本查看 复制代码
#service instance
foodTypeService=service.impl.FoodTypeService
dinnerTableService=service.impl.DinnerTableService

注意,配置文件中配置的需是接口的实现类,因为在工厂创建Bean的时候我们是使用接口来接收实现类的,这样才能够实现解耦合。笨着方法想,我们不能够直接new一个接口,对不对。
调用的时候如此调用:
[Java] 纯文本查看 复制代码
protected IDinnerTableService dinnerTableService = BeanFactory.getInstance("dinnerTableService",IDinnerTableService.class);

我们传入key和DinnerTableService的class,通过这种方法就能够得到一个对象。

Spring中的工厂模式
工厂模式的思想正好契合SpringIOC的设计思想:某一接口的具体实现类的选择控制权从调用类中移除,转而交给第三方决定,即借由Spring的Bean配置来实现控制,这同样也是工厂模式的思想。
在Spring中有两个最基本的工厂,BeanFactory和ApplicationContext。BeanFactory是Spring框架的基础设施,面向的是Spring本身,也就是用于创建Spring扩展的其他内容,如Spring Security、Spring JDBC等,而ApplicationContext这个工厂是面向开发者的,也就是应用上下文——配置文件等,开发者能够使用这个工厂实现自己的功能。


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马