引言【Spring学习笔记一】

232 阅读2分钟

1、EJB存在的问题

QQ截图20211029225928.png

2、什么是Spring

Spring是一个轻量级的JavaEE解决方案,整合众多优秀的设计模式。

  • 轻量级

    # 1.对于运行环境是没有额外要求的
    - 开源 tomcat,resion,jetty
    - 收费 weblogic websphere
    # 2.代码移植性高
    - 不需要实现额外代码
    
  • JavaEE的解决方案

QQ截图20211029230512.png

  • 整合设计模式

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

3、设计模型

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

4、工厂设计模型

4.1、什么是工厂设计模式

1. 概念:通过工厂类,创建对象
	User user = new User();
	UserDAO userDAO = new UserDAOImpl();
2. 好处:解耦合
	耦合:指的是代码间的强关联关系,一方的改变会影响到另一方
	问题:不利于代码维护
	简单:把接口的实现类,硬编码在程序中
		UserService userService = new UserServiceImpl();

4.2、简单工厂的设计

package cn.edu.njtech;

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("/application.properties");

            // 第二步 文件内容封装到Properties中 key = userService val = cn.edu.njtech.UserServiceImpl
            env.load(inputStream);

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

    }

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

     */
    public static UserService getUserService() {
        UserService userService = null;
        try {

            // cn.edu.njtech.UserServiceImplNew
            Class clazz = Class.forName(env.getProperty("userService"));
            userService = (UserService) clazz.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException 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 (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return userDAO;
    }
}
# Properties 集合 存储 Properties文件的内容
# 特殊Map key = String value = String
# Properties [userService = cn.edu.njtech.UserServiceImpl]
# Properties.getProperties("userService)
#
userService=cn.edu.njtech.UserServiceImpl
userDAO=cn.edu.njtech.UserDAOImpl
person=cn.edu.njtech.Person

4.3、通用工厂的设计

  • 问题

    简单工厂会存在大量的代码冗余

  • 通用工厂的代码

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;
}

4.4、通用工厂的使用方式

1. 定义类型
2. 通过配置文件的配置告知工厂(applicationContext.properties)
	key = value
3. 通过工厂获得类的对象
    Object ret = BeanFactory.getBean("key")

5、总结

Spring本质:工厂 ApplicationContext(applicationContext.xml)