spring01—工厂

引言
EJB(Enterprise Java Bean)存在的问题:EJB 是重量级的框架。

运行环境苛刻
代码移植性差
什么是 Spring?
Spring是?个轻量级的 JavaEE 解决方案,整合众多优秀的设计模式。

什么是轻量级?

对于运行环境是没有额外要求的;
开源:tomcat、resion、jetty
收费:weblogic、websphere
代码移植性高:不需要实现额外接口。
JavaEE 的解决方案:
spring01—工厂

整合设计模式:

  1. 工厂
  2. 代理
  3. 模板
  4. 策略

什么是设计模式?

  • ?义概念:面向对象设计中,解决特定问题的经典代码。
  • 狭义概念:GOF4人帮定义的23种设计模式:工厂、适配器、装饰器、门面、代理、模板…

工厂设计模式

什么是工厂设计模式?

概念:通过工厂类,创建对象;

User user = new User();
UserDAO userDAO = new UserDAOImpl();

好处:解耦合
耦合:指定是代码间的强关联关系,?方的改变会影响到另?方;
问题:不利于代码维护;
简单:把接口的实现类,硬编码在程序中;

UserService userService = new UserServiceImpl();

简单工厂的设计

package com.baizhiedu.basic;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class BeanFactory {
    private static Properties env = new Properties();
    
    static{
        try {
            //第一步 获得IO输入流
            InputStream inputStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties");
            //第二步 文件内容 封装 Properties集合中 key = userService value = com.baizhixx.UserServiceImpl
            env.load(inputStream);

            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    
    /*
	   对象的创建方式:
	       1. 直接调用构造方法 创建对象  UserService userService = new UserServiceImpl();
	       2. 通过反射的形式 创建对象 解耦合
	       Class clazz = Class.forName("com.baizhiedu.basic.UserServiceImpl");
	       UserService userService = (UserService)clazz.newInstance();
     */

    public static UserService getUserService() {
        UserService userService = null;
        try {
            //com.baizhiedu.basic.UserServiceImpl
            Class clazz = Class.forName(env.getProperty("userService"));
            userService = (UserService) clazz.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return userService;
    }

    public static UserDAO getUserDAO(){
        UserDAO userDAO = null;
        try {
            Class clazz = Class.forName(env.getProperty("userDAO"));
            userDAO = (UserDAO) clazz.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return userDAO;
    }

}

配置文件 applicationContext.properties:

# Properties 集合 存储 Properties文件的内容
# 特殊Map key=String value=String
# Properties [userService = com.baizhiedu.xxx.UserServiceImpl]
# Properties.getProperty("userService")

userService = com.baizhiedu.basic.UserServiceImpl
userDAO = com.baizhiedu.basic.UserDAOImpl

通用工厂的设计

问题:简单工厂会存在大量的代码冗余。

spring01—工厂

通用工厂的代码:

package com.baizhiedu.basic;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class BeanFactory {
    private static Properties env = new Properties();
    static{
        try {
            //第一步 获得IO输入流
            InputStream inputStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties");
            //第二步 文件内容 封装 Properties集合中 key = userService value = com.baizhixx.UserServiceImpl
            env.load(inputStream);

            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
     /*
      key 小配置文件中的key [userDAO,userService]
      */
     public static Object getBean(String key){
         Object ret = null;
         try {
             Class clazz = Class.forName(env.getProperty(key));
             ret = clazz.newInstance();
         } catch (Exception e) {
            e.printStackTrace();
         }
         return ret;
     }

}

配置文件 applicationContext.properties:

# Properties 集合 存储 Properties文件的内容
# 特殊Map key=String value=String
# Properties [userService = com.baizhiedu.xxx.UserServiceImpl]
# Properties.getProperty("userService")

userService = com.baizhiedu.basic.UserServiceImpl
userDAO = com.baizhiedu.basic.UserDAOImpl

通用工厂的使用方式
定义类型 (类)
通过配置文件的配置告知工厂
applicationContext.properties 中 key = value;
通过工厂获得类的对象
Object ret = BeanFactory.getBean("key");
总结:
Spring本质:工厂 ApplicationContext (applicationContext.xml)

spring01—工厂

上一篇:nginx静态资源配置(转发)


下一篇:红黑树