【Spring 工厂】工厂设计模式,那些BAT大厂的Java面试官到底在想些什么

本文介绍了Spring框架的起源,作为轻量级JavaEE解决方案的优势,并详细讲解了工厂设计模式,包括简单工厂和通用工厂的实现。接着展示了如何创建第一个Spring程序,涉及环境搭建、核心API及配置文件的使用。最后提到了Spring5.x与日志框架的整合,为后续的学习提供了基础。
摘要由CSDN通过智能技术生成
  • 引言

    • 什么是 Spring?

    • 工厂设计模式

      • 简单工厂的设计

      • 通用工厂的设计

      • 通用工厂的使用方式

  • 第一个 Spring 程序

    • 环境搭建

    • Spring 的核心API

    • 程序开发

    • 细节分析

      • Spring 工厂的相关的方法

      • 配置文件中的细节

    • Spring工厂的底层实现原理(简易版)

    • 思考

  • Spring5.x 与 日志框架 的整合

更多内容请查看笔记目录:【Spring 5.x】学习笔记汇总

引言

=====================================================================

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

  1. 运行环境苛刻

  2. 代码移植性差

什么是 Spring?


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

什么是轻量级?

  1. 对于运行环境是没有额外要求的;

    开源:tomcat、resion、jetty

    收费:weblogic、websphere

  2. 代码移植性高:不需要实现额外接口。

JavaEE 的解决方案

在这里插入图片描述

整合设计模式:

  1. 工厂

  2. 代理

  3. 模板

  4. 策略

什么是设计模式?

  • ⼴义概念:面向对象设计中,解决特定问题的经典代码。

  • 狭义概念:GOF4人帮定义的23种设计模式:工厂、适配器、装饰器、门面、代理、模板…

工厂设计模式


什么是工厂设计模式?

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

    User user = new User();

    UserDAO userDAO = new UserDAOImpl();

    
    
  2. 好处:解耦合

    耦合:指定是代码间的强关联关系,⼀方的改变会影响到另⼀方;

    问题:不利于代码维护;

    简单:把接口的实现类,硬编码在程序中;```

    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 

[](

)通用工厂的设计

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

在这里插入图片描述

通用工厂的代码:


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 

[](

)通用工厂的使用方式

  1. 定义类型 (类)

  2. 通过配置文件的配置告知工厂

    applicationContext.propertieskey = value

  3. 通过工厂获得类的对象

    Object ret = BeanFactory.getBean("key");

总结

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

第一个 Spring 程序

================================================================================

环境搭建


依赖查询网站:https://mvnrepository.com/

配置 Spring 的 jar 包:


<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->

<dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-context</artifactId>

    <version>5.1.4.RELEASE</version>

</dependency> 

Spring 的配置文件:

  1. 配置文件的放置位置:任意位置,没有硬性要求;

  2. 配置文件的命名 :没有硬性要求,建议:applicationContext.xml

思考:日后应用 Spring 框架时,需要进行配置文件路径的设置。

Spring 的核心API


ApplicationContext

  • 作用:Spring 提供的 ApplicationContext 这个工厂,用于对象的创建;

    好处:解耦合

  • ApplicationContext 是接口类型;

    接口:屏蔽实现的差异

    非 web 环境 (main junit) :ClassPathXmlApplicationContext

    web 环境 :XmlWebApplicationContext

    在这里插入图片描述

  • 重量级资源:

    ApplicationContext 工厂的对象占用大量内存。

    不会频繁的创建对象 ,⼀个应用只会创建⼀个工厂对象。

    A pplicationContext 工厂:⼀定是线程安全的(多线程并发访问)。

程序开发


  1. 创建类型:Person.java
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值