Spring5学习随笔-Spring5的基本介绍、工厂设计模式
学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】
Spring系列-工厂 第一章、引言

- Spring IOC工厂是Spring框架中的一个核心组件,它负责创建和管理应用程序中的对象实例。IOC(Inversion of Control,控制反转)是Spring框架的基础,它将对象的创建、管理和使用过程中的控制权从应用程序代码中移动到Spring IOC容器中,以实现松耦合、可重用和可测试的代码。
 - Spring AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,它可以在不修改源代码的情况下,向应用程序中添加新的行为和功能。AOP通过将应用程序划分为多个模块(切面)来实现这一目标,每个模块负责处理特定的功能或关注点,例如安全、日志、事务等。并且是面试中经常问的,尤其是Spring动态代理的底层实现。
 - 持久层集成,通过持久层整合与现有的持久化进行集成,比如Mybatis,大大提高了效率。
 - 事务处理,主要分为1.声明式事务、2.编程式事务。里面事务属性的概念是非常高频的面试内容。
 - MVC框架集成,通过这部分可以和其他Java企业级技术以及非Java技术进行集成,以满足不同应用程序的需求
 - 注解编程,本质上是一种特殊的Java接口,它可以被应用于类、方法、字段、参数等程序元素上,以提供关于这些元素的额外信息。注解可以包含属性,这些属性可以帮助程序员进一步定义元素的行为和用途。
 
1.EJB(Enterprise Java Bean)
EJB指的是企业JavaBean 它提供了一种分层的架构模式。
EJB的优点:
- 分布式事务处理:EJB支持分布式事务处理,可以通过容器来控制事务,保证数据的一致性。
 - 组件化开发:EJB的组件化开发方式可以使得应用程序更加可维护、可重用和可扩展,开发效率也更高。
 - 安全性:EJB提供了安全管理机制,可以对组件进行安全性管理,确保应用程序的安全性。
 - 集成性:EJB可以很好地与其他JavaEE技术进行集成,如JSP、Servlet、JMS等,可以组成一个完整的企业级应用程序。
 - 高性能:EJB可以通过容器来实现连接池、线程池等技术,提高了应用程序的性能。
 
缺点:
- 学习曲线较陡峭:EJB需要掌握较为复杂的技术,包括容器、事务管理、安全管理等,需要一定的学习曲线。
 - 运行环境要求较高:EJB需要依赖于JavaEE容器来运行,需要一定的服务器环境和配置。
 - 运行效率较低:由于EJB需要在容器中运行,因此会带来额外的开销,使得其运行效率较低。
 - 部署复杂:由于EJB需要部署在JavaEE容器中,因此部署过程相对复杂。
 - 可移植性差:不同的JavaEE容器可能对EJB规范的实现有所不同,因此EJB应用程序的可移植性较差。
 
主要问题:
1.运行环境苛刻。
目前我们主要使用的服务器是Tomcat,最为核心的内容就是Servlet引擎,所有的内容都交给Servlet处理,称为WebServer。但是EJB代码不能运行在Tomcat上,只能运行在EJB容器上。
Weblogic服务器是 Oracle的,满足了servlet所有的功能还有EJB容器,称为ApplicationServer并且收费。
Websphere ApplicationServer 收费 IBM
2.代码移植性差。
运行在Weblogic当中需要使用Weblogic的接口,换一个环境或服务器,那么代码也要变。
总结:EJB重量级的框架,体现在上面两点。
2 什么是Spring
Spring 是一个轻量级的JavaEE解决方案,整合众多优秀的设计模式
轻量级
1.对于运行环境是没有额外要求的。
2.可以选择开源的 tomcat reson jetty
3.也可以运行在 收费的 weblogic websphere
解决方案
spring解决了 javaEE分层开发当中的每一层问题。
springmvc解决控制层 Controller的问题
Aop技术解决了Service 事务控制、日志处理的问题。
通过持久化解决方案跟mybatis做整合解决DAO的问题
最大特点:每一个层次都有一个解决。
所以Spring 是一个完整的解决方案。
整合设计模式,所有的特点都基于一系列设计模式的整合来处理的。
1.工厂
2.代理
3.模板
4.策略
……..
合理的封装的使用了这些设计模式
3 设计模式
1.广义概念
面向对象设计中、解决特定问题的经典代码
2.狭义概念
GOF4人帮定义的23种设计模式
其中工厂设计模式是最为重要的
4 工厂设计模式
1.什么是工厂设计模式
1.概念:通过工厂类创建对象  不建议new对象
	User user = new User();
	UserDao userDao = new UserDAOImpl();
2.好处:解耦合
	耦合:指的是代码间的强关联关系,一方的改变会影响另一方
	问题:不利于代码维护
	简单理解:把接口的实现类 硬编码在程序中。
	UserService userService = new UserServiceImpl();//一但出现问题,调用者也会出现问题
	实现:将对象的创建过程封装在工厂类中,通过实现静态或实例工厂的方法创建对象,从而降低耦合性。
				将具体的实现类名放在Resource Bundle 文件中可以将代码和配置分离,使得程序更加灵活,
				在资源包中可以将具体的类名作为key,将其具体实现的类名作为value。当我们需要创建对象
				时只需要读取资源包中的类名即可通过反射创建实例,这个方法也同样属于降低耦合,并且使
				得代码更有可移植性和适应性
2.简单工厂的设计
package com.baizhi.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.baizhi.UserServiceImpl
            **env.load(inputStream);**
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /*
        对象的创建方式
            1.直接调用构造方法 创建对象 UserService userService = new UserServiceImpl();
            2.通过反射的形式创建对象 解耦合
                Class clazz = Class.forName("com.baizhi.basic.UserServiceImpl");
                userService = (UserService) clazz.newInstance();
     */
    public static UserService getUserService() {
        UserService userService = null;
        try {
            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;
    }
}
3.通用工厂的设计
问题
1.简单工厂存在大量的代码冗余

解决 实现通用工厂
1.一个方法的声明需要五个要素
	1.修饰符 2.返回值类型 3.方法名 4.参数列表 5.try(可选)
public static Object getBean(){
	Object ret = null;
	try(
			Class clazz = Class.forName(env.getProperty(key));
			ret = clazz.newInstance();
	)catch(Exception e)(
			e.printStackTrace();
	)
}
通用工厂 解决了大量的代码冗余
创建一切想要的对象
public static Object getBean(String key){
        Object ret = null;
        try {
            Class clazz = Class.forName(env.getProperty(key));
            ret = clazz.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return ret;
    }
4.通用工厂的使用方法
1.定义类型(类)
2.通过配置文件的配置告知工厂(applicationContext.properties)
	key = value
3.通过工厂获得类的对象
	Object ret = BeanFactory.getBean("key")
5.总结
通过了解Spring的基本概念以及工厂设计模式,可以体会到Spring本质就是一个工厂,通过ApplicationContext(配置文件:applicationContext.xml)创建以及管理对象。
Spring5学习随笔-Spring5的基本介绍、工厂设计模式的更多相关文章
- PyQt(Python+Qt)学习随笔:QTabWidget选项卡部件外观展示类属性elideMode、documentMode、tabBarAutoHide、tabShape介绍
		
QTabWidget的外观展示类属性包括tabPosition.tabShape.elideMode.usesScrollButtons.documentMode.tabBarAutoHide和ico ...
 - PyQt(Python+Qt)学习随笔:containers容器部件GroupBox分组框介绍
		
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 1.主要属性 GroupBox分组框是一个对多个部件进行编组的框架容器,可以带有标题(title属性 ...
 - jquery学习随笔
		
转)jquery学习随笔(jquery选择器) jQuery的选择器是CSS 1-3,XPath的结合物.jQuery提取这二种查询语言最好的部分,融合后创造出了最终的jQuery表达式查询语言. ...
 - Python学习随笔:使用xlwings设置和操作excel多行多列数据以及设置数据字体颜色填充色对齐方式的方法
		
☞ ░ 前往老猿Python博文目录 ░ 在前面老猿的文章中,<Python学习随笔:使用xlwings读取和操作Excel文件>.<Python学习随笔:使用xlwings读取和操 ...
 - PyQt(Python+Qt)学习随笔:QDial刻度盘部件功能简介
		
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.概述 Designer中的Dial刻度盘输入部 ...
 - PyQt(Python+Qt)学习随笔: QDoubleSpinBox浮点数字设定部件简介
		
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 在<PyQt(Python+Qt)学习随笔: ...
 - PyQt(Python+Qt)学习随笔:富文本编辑器QTextEdit功能详解
		
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.概述 QTextEdit是一个高级的所见即所得的文档查看器和编辑器 ...
 - PyQt(Python+Qt)学习随笔:QMainWindow的setDockNestingEnabled作用案例图解
		
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 QMainWindow的setDockNestingEnabled的作 ...
 - PyQt(Python+Qt)学习随笔:利用QWidget部件的palette以及ColorGroup、colorRole局部调整部件的特定范围颜色
		
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 在<PyQt(Python+Qt)学习随笔:QWidget部件的 ...
 - PyQt(Python+Qt)学习随笔:QTabWidget选项卡部件概述和属性介绍
		
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 TabWidget选项卡组件是一个带一到多个选项卡栏和对应页面区域的组件,对应类QTabW ...
 
随机推荐
- Java中的线程池使用及原理
			
开篇-为什么要使用线程池?  Java 中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池.在开发过程中,合理地使用线程池能够带来 3 个好处.  第一:降低 ...
 - 【pandas小技巧】--拆分列
			
拆分列是pandas中常用的一种数据操作,它可以将一个包含多个值的列按照指定的规则拆分成多个新列,方便进行后续的分析和处理.拆分列的使用场景比较广泛,以下是一些常见的应用场景: 处理日期数据:在日期数 ...
 - Flutter系列文章-实战项目
			
在本篇文章中,我们将通过一个实际的 Flutter 应用来综合运用最近学到的知识,包括保存到数据库.进行 HTTP 请求等.我们将开发一个简单的天气应用,可以根据用户输入的城市名获取该城市的天气信息, ...
 - 2.0 Python 数据结构与类型
			
数据类型是编程语言中的一个重要概念,它定义了数据的类型和提供了特定的操作和方法.在 python 中,数据类型的作用是将不同类型的数据进行分类和定义,例如数字.字符串.列表.元组.集合.字典等.这些数 ...
 - win10右键添加打开cmd窗口的命令
			
创建文本文档,复制如下内容: Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\b ...
 - 【JMeter】常用线程组设置策略
			
常用线程组设置策略 目录 常用线程组设置策略 一.前言 二.单场景基准测试 1.介绍 2.线程组设计 3.测试结果 三.单场景并发测试 1.介绍 2.线程组设计 3.测试结果 四.单场景容量/爬坡测试 ...
 - LeetCode 周赛上分之旅 #40 结合特征压缩的数位 DP 问题
			
️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问. 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越 ...
 - Chrome116驱动下载路径 解决版本不匹配问题
			
更新于 2023-08-23 后续可能会有同步,就不会引发该问题 要看解决可以直接看最后的总结 背景 执行selenium代码报错 from selenium import webdriver dri ...
 - 通过AOP拦截Spring Boot日志并将其存入数据库
			
本文分享自华为云社区<Spring Boot入门(23):[实战]通过AOP拦截Spring Boot日志并将其存入数据库>,作者:bug菌. 前言 在软件开发中,常常需要记录系统运行时的 ...
 - 准备HarmonyOS开发环境
			
引言 在开始 HarmonyOS 开发之前,需要准备好开发环境.本章将详细指导你如何安装 HarmonyOS SDK.配置开发环境.创建 HarmonyOS 项目. 目录 安装 HarmonyOS S ...