Spring学习笔记(一):工厂模式

Spring学习笔记一:工厂模式

  • 1.简介
  • 2.工厂模式
    • 简单工厂设计
    • 通⽤⼯⼚的设计
      • 通用工厂的使用方式

1.简介

1.Spring是⼀个轻量级的 JavaEE 解决⽅案,整合众多优秀的设计模式。
2.EJB(Enterprise Java Bean):重量级框架,存在问题包括:运行环境苛刻,代码移植性差。
什么是轻量级?

  • 对于运行环境是没用额外要求
    1. 开源 tomcat resion jetty
    2. 收费 weblogic websphere
  • 代码移植性高
    1. 不需要实现额外的接口

JavaEE 的解决方案:
在这里插入图片描述
整合设计模式
⼯⼚,代理,模板,策略

什么是设计模式?

  • ⼴义概念:⾯向对象设计中,解决特定问题的经典代码。
  • 狭义概念:GOF4⼈帮定义的23种设计模式:⼯⼚、适配器、装饰器、⻔⾯、代理、模板…】

2.工厂模式

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

简单工厂设计

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.properties 中 key = value;
  3. 通过⼯⼚获得类的对象
    Object ret = BeanFactory.getBean(“key”);

总结:
Spring本质:⼯⼚ ApplicationContext (applicationContext.xml)

热门文章

暂无图片
编程学习 ·

DAY3-JDBC+Tomcat实现简易登陆系统

目录笔记bean包下User类dao包下UserDao类service包下UserServiceImpl类和UserService接口servlet包下HelloServlet类和LoginServlet类util包下DBUtil类xml文件 笔记 jdbc: 1.加载驱动 2.创建连接 3.写sq| 4.得到statement对象 5.执行sq|得到结果集 6.处理结果集 7.关闭资源 分…
暂无图片
编程学习 ·

C语言 介绍

一.C的历史 编程语言的发展过程: 第1代语言 机器语言↓ 第2代语言 汇编语言↓ 第3代语言 高级语言——结构化:C,Fortran,Basic,Pascal↓分界线:1980s面向对象(OO):Algo,Simula67,Ada,SmallTalkC++,Java,C#结构化语言的缺陷: 操作和数据是分离的C语言的起源: 1969…
暂无图片
编程学习 ·

几种常见的分布式事务解决方案对比

背景 分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在微服务架构中,几乎可以说是无法避免。 ACID 指数据库事务正确执行的四个基本要素: 原子性(Atomicity) 一致性(Consistency) 隔离性(Isolation) 持久性(Durabili…
暂无图片
编程学习 ·

Java工具类-BASE64加解密

1 引入apache commons-codec依赖<dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.10</version> </dependency>2 使用Base64.encodeBase64加密public static String base64Enc…
暂无图片
编程学习 ·

使用go语言寻找最长不含有重复字符的字串,统计数量

go语言Map例题(寻找最长不含有重复字符的字串 )要求 a := abcdabc 那么得出统计说是4,实现下方代码 解题思路lastOccurred[x]不存在,或者无需操作 lastOccurred[x] >= start -> 更新start 更新lastOccurred[x],更新maxLengthfunc lengthOfNonRepeatingSubstr(s strin…
暂无图片
编程学习 ·

linux安装nginx及https化

Linux安装nginx安装操作系统:centos 安装前先确保系统安装了g++、gcc、openssl-devel、pcre-devel和zlib-devel软件yum install gcc-c++ yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel上传nginx安装包nginx-1.13.0.tar.gz至linux指定位置(/usr/loc…
暂无图片
编程学习 ·

一文看懂Chrome浏览器工作原理

转自:https://juejin.im/post/5e182a47e51d453cee48c752本文是笔者对Mario Kosaka写的inside look at modern web browser系列文章的翻译。这里的翻译不是指直译,而是结合个人的理解将作者想表达的意思表达出来,而且会尽量补充一些相关的内容来帮助大家更好地理解。这篇文章…
暂无图片
编程学习 ·

2016 年实验班选拔试题

SUM(10 分) 题目描述:求出在 1 到 N 之间的所有整数的总和。 输入格式:输入包含多组测试数据。每行是一组测试数据,该数据是一个绝对值不 大于 10000 的整数 N。N=0 时,表示输入结束。 输出格式:对于每组测试数据,输出一行,改行包含一个整数,是所有在 1 到 N 之 间的…
暂无图片
编程学习 ·

腾讯疑似回应被骗“辣椒酱不香了”!百度趁机诉苦!

导读:腾讯和老干妈怼怂,百度受伤,我们来看看到底怎么回事? 这一事件从腾讯告老干妈开始,理由是拖欠千万元广告费,故申请冻结老干妈1624万财产,结果老干妈直接发布声明:从未与腾讯公司进行过任何商业合作。 正当我们吃瓜群众等待下文的时候,贵阳警方发了一则通告:3人伪…
暂无图片
编程学习 ·

pandas下-综合练习

综合练习端午节的淘宝粽子交易 端午节的淘宝粽子交易 (1) 请删除最后一列为缺失值的行,并求所有在杭州发货的商品单价均值。 df=pd.read_csv(F:\Datewheel资料\pandas组队学习\Pandas(下)综合练习数据集\端午粽子数据.csv) df.head()df.info()#查看列名 df.columns()注意列名…
暂无图片
编程学习 ·

硕彦博创李飞授——Linux权限、掩码、编译

1、文件的权限 - rw- rw- -w- a.txt 类型 创建者 群组 其他人常用类型有:文件(-),文件夹(d),链接文件(l)等文件的权限:文件允许用户操作的一个权限文件对于用户的分类:创建者(u)群组(g)其他人(o)所有用户(a)文件的权限:r (read)读 …
暂无图片
编程学习 ·

前端未来技术走向(TS, SSR, serverless, flutter,多端统一开发)

TS TS为什么会出现? 1.js是一门弱类型而且还是动态类型的语言,语言本身的类型系统是非常薄弱的,当js去开发大型的前端项目,开发成本和维护成本都会非常的高2.而ts是一门基于js基础之上的编程语言,它在javascript原有的基础之上多了一些扩展特性,主要就是一套更强大的类型…
暂无图片
编程学习 ·

cpu寻址问题

20根地址线,16根数据线,cpu按字节编址和按字编址的寻址范围,分别是1M和512k,但是16根数据线,表明一次向存储单元读写位数16位,那为什么按字编址会是512k而不是1M呢,请解答一下,谢谢
暂无图片
编程学习 ·

创建第一个 Flink 项目(Java版)

一、运行环境介绍Flink执行环境主要分为本地环境和集群环境,本地环境主要为了方便用户编写和调试代码使用,而集群环境则被用于正式环境中,可以借助Hadoop Yarn、k8s 或 Mesos等不同的资源管理器部署自己的应用。环境依赖:【1】JDK环境:Flink核心模块均使用 Java开发,所以…
暂无图片
编程学习 ·

TextRNN的PyTorch实现

本文介绍一下如何使用PyTorch复现TextRNN,实现预测一句话的下一个词 参考这篇论文Finding Structure in Time(1990),如果你对RNN有一定的了解,实际上不用看,仔细看我代码如何实现即可。如果你对RNN不太了解,请仔细阅读我这篇文章RNN Layer,结合PyTorch讲的很详细 现在问题…