【Spring 工厂】工厂设计模式,熬夜整理小米Java面试题

  • 引言

    • 什么是 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

public class Person {} 

  1. 配置文件的配置:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">



        <bean id="person" class="com.yusael.basic.Person"/>



</beans> 

  1. 通过工厂类,获得对象

/**

 * 用于测试Spring的第一个程序

 */

@Test

public void test() {

    // 1、获取spring的工厂

    ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");

    // 2、通过工厂类获得对象

    Person person = (Person)ctx.getBean("person");

    System.out.println(person);

} 

细节分析


名词解释:Spring 工厂创建的对象,叫做 bean 或者 组件 (componet);

[](

)Spring 工厂的相关的方法

getBean:传入 id值 和 类名 获取对象,不需要强制类型转换。


// 通过这种方式获得对象,就不需要强制类型转换

Person person = ctx.getBean("person", Person.class);


### 最后

**面试前一定少不了刷题,为了方便大家复习,我分享一波个人整理的面试大全宝典**

**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)**

*   Java核心知识整理

![2020年五面蚂蚁、三面拼多多、字节跳动最终拿offer入职拼多多](https://img-blog.csdnimg.cn/img_convert/47f44ca2de54ba540968c2334dd765e5.png)

Java核心知识

*   Spring全家桶(实战系列)

![2020年五面蚂蚁、三面拼多多、字节跳动最终拿offer入职拼多多](https://img-blog.csdnimg.cn/img_convert/fc9728dc23fbcdfbe498e931d6aaca84.png)

*   其他电子书资料

![2020年五面蚂蚁、三面拼多多、字节跳动最终拿offer入职拼多多](https://img-blog.csdnimg.cn/img_convert/ca61f5321d0b53eca4fab16c0457a28b.png)

**Step3:刷题**

既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

**以下是我私藏的面试题库:**

![2020年五面蚂蚁、三面拼多多、字节跳动最终拿offer入职拼多多](https://img-blog.csdnimg.cn/img_convert/0c017b477763f2801d623cb84e89c5fd.png)

获取对象,不需要强制类型转换。



// 通过这种方式获得对象,就不需要强制类型转换

Person person = ctx.getBean(“person”, Person.class);

最后

面试前一定少不了刷题,为了方便大家复习,我分享一波个人整理的面试大全宝典

CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】

  • Java核心知识整理

[外链图片转存中…(img-npGbii0T-1630318039184)]

Java核心知识

  • Spring全家桶(实战系列)

[外链图片转存中…(img-foMm0uVu-1630318039186)]

  • 其他电子书资料

[外链图片转存中…(img-zMfniV2h-1630318039187)]

Step3:刷题

既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

以下是我私藏的面试题库:

[外链图片转存中…(img-gWHj4Aim-1630318039189)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值