发现一款基于SpringBoot的ERP系统,自带进销存+财务+生产功能

发现一款基于SpringBoot的ERP系统,自带进销存+财务+生产功能

前言

华夏ERP基于SpringBoot框架和SaaS模式,立志为中小企业提供开源好用的ERP软件,目前专注进销存+财务+生产功能。主要模块有零售管理、采购管理、销售管理、仓库管理、财务管理、报表查询、系统管理等。支持预付款、收入支出、仓库调拨、组装拆卸、订单等特色功能。拥有库存状况、出入库统计等报表。同时对角色和权限进行了细致全面的控制,精确到每个按钮和菜单。

项目总述

  • 很多人说华夏ERP(英文名:jshERP)是目前人气领先的国产ERP系统
  • 虽然目前只有进销存+财务+生产的功能,但后面会推出ERP的全部功能,有兴趣请帮点一下 Star 哦
  • 演示地址:http://47.116.69.14 演示账号:jsh,密码:123456

开发初衷

  • 华夏ERP立志为中小企业提供开源好用的ERP软件,降低企业的信息化成本
  • 个人开发者也可以使用华夏ERP进行二次开发,加快完成开发任务 关注Java项目分享
  • 初学JAVA的小伙伴可以下载源代码来进行学习交流

技术框架

  • 核心框架:SpringBoot 2.0.0
  • 持久层框架:Mybatis 1.3.2
  • 日志管理:Log4j 2.10.0
  • JS框架:Jquery 1.8.0
  • UI框架: EasyUI 1.9.4
  • 模板框架: AdminLTE 2.4.0
  • 项目管理框架: Maven 3.2.3
  • API接口框架: swagger2.7.0(ip:port/doc.html)

开发环境

建议开发者使用以下环境,可以避免版本不一致带来的问题

  • IDE: IntelliJ IDEA 2017+
  • DB: Mysql5.7+
  • JDK: JDK1.8
  • Maven: Maven3.2.3+

服务器环境

  • 数据库服务器:Mysql5.7+
  • JAVA平台: JRE1.8
  • 操作系统:Windows、Linux等

开源说明

  • 本系统100%开源,遵守GPL-3.0协议

系统美图

  • 首页
  • 零售管理
  • 采购管理

  • 销售管理

  • 仓库管理

  • 财务管理

  • 报表查询

  • 商品管理

  • 基本资料
  • 系统管理

源码资料获取方式:关注小编+转发文章+私信【 0626】免费获取!!!!

一、什么是Spring?谈谈你对IOC和AOP的理解。

Spring: 是一个企业级java应用框架,他的作用主要是简化软件的开发以及配置过程,简化项目部署环境。Spring的有点:1、Spring低侵入设计,对业务代码的污染非常低。2、Spring的DI机制将对象之间的关系交由框架处理,减少组件的耦合。3、Spring提供了AOP技术,支持将一些通用的功能进行集中式管理,从而提供更好的复用。4、Spring对于主流框架提供了非常好的支持。IOC就是控制反转,指创建对象的控制权转移给Spring来进行管理。简单来说,就是应用不用去new对象了,而全部交由Spring自动生产。IOC有三种注入方式:1、 构造器注入 2、setter方法注入 3、根据注解注入。AOP 面向切面。用于将那些与业务无关,但却能对多个对象产生影响的公共行为。抽取并封装成一个可重用的模块。AOP的核心就是动态代理。JDK的动态代理 和CGLIB动态代理。

二、Spring容器的启动流程是怎么样的?

使用AnnotationConfigApplicationContext 来跟踪一下启动流程: this(); 初始化reader和scannerscan(basePackages); 使用scanner组件扫描basePackage下的所有对象,将配置类的BeanDefinition注册到容器中。refresh(); 刷新容器。prepareRefresh 刷新前的预处理obtainFreshBeanFactory: 获取在容器初始化时创建的BeanFactoryprepareBeanFactory: BeanFactory的预处理工作,会向容器中添加一些组件。postProcessBeanFactory: 子类重写该方法,可以实现在BeanFactory创建并预处理完成后再做进一步的设置。invokeBeanFactoryPostProcessors: 在BeanFactory初始化之后执行BeanFactory的后处理器。

registerBeanPostProcessors: 向容器中注册Bean的后处理器,他的主要作用就是干预Spring初始化Bean的流程,完成代理、自动注入、循环依赖等这些功能。initMessageSource: 初始化messagesource组件,主要用于国际化。initApplicationEventMulticaster: 初始化事件分发器onRefresh: 留给子容器,子类重写的方法,在容器刷新的时候可以自定义一些逻辑。registerListeners: 注册监听器。finishBeanFactoryInitialization: 完成BeanFactory的初始化,主要作用是初始化所有剩下的单例Bean。finishRefresh: 完成整个容器的初始化,发布BeanFactory容器刷新完成的事件。

三、Spring框架中Bean的创建过程是怎样

的?首先,简单来说,Spring框架中的Bean经过四个阶段: 实例化 -》 属性赋值 -》初始化 -》 销毁然后: 具体来说,Spring中Bean 经过了以下几个步骤:1、实例化: new xxx(); 两个时机: 1、当客户端向容器申请一个Bean时,2、当容器在初始化一个Bean时发现还需要依赖另一个Bean。 BeanDefinition 对象保存。-到底是new一个对象还是创建一个动态代理?2、设置对象属性(依赖注入):Spring通过BeanDefinition找到对象依赖的其他对象,并将这些对象赋予当前对象。3、处理Aware接口:Spring会检测对象是否实现了xxxAware接口,如果实现然后,就会调用对应的方法。BeanNameAware、BeanClassLoaderAware、BeanFactoryAware、ApplicationContextAware

4、BeanPostProcessor前置处理: 调用BeanPostProcessor的postProcessBeforeInitialization方法5、InitializingBean: Spring检测对象如果实现了这个接口,就会执行他的afterPropertiesSet()方法,定制初始化逻辑。6、init-method: 如果Spring发现Bean配置了这个属性,就会调用他的配置方法,执行初始化逻辑。@PostConstruct7、BeanPostProcessor后置处理: 调用BeanPostProcessor的postProcessAfterInitialization方法

到这里,这个Bean的创建过程就完成了, Bean就可以正常使用了。

8、DisposableBean: 当Bean实现了这个接口,在对象销毁前就会调用destory()方法。9、destroy-method: @PreDestroy

四、Spring框架中的Bean是线程安全的吗?

如果线程不安全,要如何处理?Spring容器本身没有提供Bean的线程安全策略,因此,也可以说Spring容器中的Bean不是线程安全的。要如何处理线程安全问题,就要分情况来分析。Spring中的作用域: 1、 sington 2、prototype: 为每个Bean请求创建给实例。3、request:为每个request请求创建一个实例,请求完成后失效。 4、 session:与request是类似的。 5、global-session:全局作用域。对于线程安全问题:1> 对于prototype作用域,每次都是生成一个新的对象,所以不存在线程安全问题。2>sington作用域: 默认就是线程不完全的。但是对于开发中大部分的Bean,其实是无状态的,不需要保证线程安全。所以在平常的MVC开发中,是不会有线程安全问题的。

无状态表示这个实例没有属性对象, 不能保存数据,是不变的类。比如: controller、service、dao有状态表示示例是有属性对象,可以保存数据,是线程不安全的, 比如pojo.但是如果要保证线程安全,可以将Bean的作用域改为prototype 比如像 ModelView。另外还可以采用ThreadLocal来解决线程安全问题。ThreadLocal为每个线程保存一个副本变量, 每个线程只操作自己的副本变量。

五、Spring如何处理循环依赖问题?

循环依赖: 多个对象之间存在循环的引用关系,在初始化过程当中,就会出现”先有蛋还是先有鸡”的问题。

一种是使用@Lazy注解: 解决构造方法造成的循环依赖问题另一种是使用三级缓存一级缓存:缓存最终的单例池对象: private final MapsingletonObjects = new ConcurrentHashMap(256);二级缓存:缓存初始化的对象:private final MapearlySingletonObjects = new ConcurrentHashMap(16);三级缓存:缓存对象的ObjectFactory: private final Map singletonFactories = new HashMap(16);

对于对象之间的普通引用,二级缓存会保存new出来的不完整对象,这样当单例池中找到不依赖的属性时,就可以先从二级缓存中获取到不完整对象,完成对象创建建,在后续的依赖注入过程中,将单例池中对象地引用关系调整完成。三级缓存:如果引用的对象配置了AOP,那在单例池中最终就会需要注入动态代理对象,而不是原对象。而生成动态代理是要在对象初始化完成之后才开始的。于是Spring增加三级缓存,保存所有对象的动态代理配置信息。在发现有循环依赖时,将这个对象的动态代理信息获取出来,提前进行AOP,生成动态代理。核心代码就在DefaultSingletonBeanRegistry的getSingleton方法当中。

protected Object getSingleton(String beanName, boolean allowEarlyReference){// Quick check for existing instance without full singleton lockObject singletonObject = this.singletonObjects.get(beanName);if (singletonObject == null &&isSingletonCurrentlyInCreation(beanName)) {singletonObject = this.earlySingletonObjects.get(beanName);if (singletonObject == null && allowEarlyReference) {synchronized (this.singletonObjects) {// Consistent creation of early reference within fullsingleton locksingletonObject = this.singletonObjects.get(beanName);if (singletonObject == null) {singletonObject =this.earlySingletonObjects.get(beanName);if (singletonObject == null) {ObjectFactory singletonFactory =this.singletonFactories.get(beanName);if (singletonFactory != null) {singletonObject =singletonFactory.getObject();this.earlySingletonObjects.put(beanName,singletonObject);this.singletonFactories.remove(beanName}}}}}return singletonObject;}

六、Spring如何处理事务

Spring当中支持编程式事务管理和声明式事务管理两种方式:1、编程式事务可以使用TransactionTemplate。2、声明式事务: 是Spring在AOP基础上提供的事务实现机制。他的最大优点就是不需要在业务代码中添加事务管理的代码,只需要在配置文件中做相关的事务规则声明就可以了。但是声明式事务只能针对方法级别,无法控制代码级别的事务管理理。Spring中对事务定义了不同的传播级别: Propagation1、 PROPAGATION_REQUIRED:默认传播行为。 如果当前没有事务,就创建一新事务,如果当前存在事务,就加入到事务中。2、PROPAGATION_SUPPORTS: 如果当前存在事务,就加入到该事务。如果当前不存在事务,就以非事务的方式运行。

3、PROPAGATION_MANDATORY: 如果当前存在事务,就加入该事务。如果当前不存在事务,就抛出异常。

4、PROPAGATION_REQUIRES_NEW: 无论当前存不存在事务,都创建新事务进行执行。

5、PROPAGATION_NOT_SUPPORTED: 以非事务方式运行。如果当前存在事务必,就将当前事务挂起。

6、PROPAGATION_NEVER : 以非事务的方式运行。如果当前存在事务,就抛出异议常。

7、PROPAGATION_NESTED: 如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则按REQUEIRED属性执行。Spring中事务的隔离级别:1、ISOLATION_DEFAULT: 使用数据库默认的事务隔离级别。2、ISOLATION_READ_UNCOMMITTED: 都未提交。允许事务在执行过程中,必须取其他事务未提交的数据。3、ISOLATION_READ_COMMITTED: 读已提交。允许事务在执行过程中,读取其他事务已经提交的数据。4、ISOLATION_REPEATABLE_READ: 可重复读。 在同一个事务内,任意时刻的查询结果是一致的。5、ISOLATION_SERIALIZABLE: 所有事务依次执行。

七、SpringMVC中的控制器是不是单例模

式?如果是,如何保证线程安全?控制器是单例模式。单例模式下就会有线程安全问题。Spring中保证线程安全的方法1、将scop设置成非singleton。 prototype, request。2、最好的方式是将控制器设计成无状态模式。在控制器中,不要携带数据。但是可以引用无状态的service和dao。

源码资料获取方式:关注小编+转发文章+私信【 0626】免费获取!!!!

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年7月10日
下一篇 2022年7月10日

相关推荐

  • 美的浴霸风华F1突破传统,全域暖风智控恒温更科技

    浴霸是浴室沐浴洗澡不可缺少的组成之一。然而,传统的浴霸送风角度单一,且送暖不均匀,很难给人带来全身的暖意。近日,美的推出了一款浴霸新品——美的浴霸风华F1,让用户尽享3D全域暖风。…

    2022年7月22日
  • 64页管廊管道运维平台建设方案

    智慧管廊管道运维平台的建设,通过系统实施带动管廊软硬件、人员、制度的同步提升,整体提升管廊综合智慧安全能力,是管廊互联网 产业升级的核心工程。系统将具备逐步整合管廊服务相关各软硬件…

    2022年7月3日
  • 自由之刃装备怎么刷?自由之刃装备系统介绍

    大家好,欢迎来到小可说传奇,今天来跟大家介绍一下自由之刃传奇手游的装备系统,自由之刃传奇手游的装备有哪些呢? 自由之刃的装备分为不同的部位,包括头盔、项链、手镯、戒指、腰带和鞋子等…

    2022年7月29日
  • 家里需不需要新风系统?新风系统是智商税吗?

    从雾霾到甲醛,再到疫情反扑导致得猝不及防的居家隔离,大家一直都很关注家居环境的空气质量问题。 那么大家用的新风系统是智商税吗? 或许有些人觉得新风系统是“智商税”,但它实实在在地提…

    2022年8月3日
  • 三原子分子被激光冷却和捕获

    作者:约翰娜·L·米勒 编译:纯珍 图片来源:Loïc Anderegg 随着从两个原子到三个甚至更多原子的进步,适合超冷技术的分子可能开始类似于大多数化学家所认识的分子。 激光可…

    2022年8月17日
  • 360摄像头云台7P,2.5K超清全景,离家更安心

    早上刷到这个微博:装可视门铃后奶奶秒变分享狂魔,每天都会对着摄像头和孙子分享日常,奶奶的每个举动都太戳我了!不过后来我的第一想法是因为奶奶一个人在家,总让我放心不下,如果装了个摄像…

    2022年8月1日
  • 再也不用组网了!入手华为路由器AX6,信号穿墙再也不是难题

    日常总是有很多同事、朋友,抱怨家里网速慢,视频卡、无法流畅玩游戏。实际上,目前加用的网络,带宽普遍在2、300M,甚至有不少千兆带宽,原则上网络不应该有卡顿。那么,为什么会出现网络…

    2022年6月20日
  • 达芬奇18正式版来了,附Win和Mac系统保姆式安装教程

    达芬奇 18 测试版 4 月份就出来了,对于测试版本来说还是不稳定的,效果多了就容易直接闪退崩溃了。 最近,达芬奇 18 正式版发布,相比之前测试版本更加稳定了,可以安排上了。 对…

    2022年8月15日
  • 辽宁男篮终于收获好消息!冠军中锋回归,主动挽留郭艾伦显情商

    等待四年时间,辽宁男篮终于再一次捧起了CBA联赛的冠军奖杯,本以为这会是他们建立王朝的开始,没想到球队立马就出现了“问题”,送走了两冠功臣刘志轩,本来要迎回的高诗岩却始终不能够确定…

    2022年8月23日
  • 戴尔正在退出手机同步游戏

    还记得每个人都想拥有您的手机和笔记本电脑的时候吗?戴尔终于认输了(通过Windows Central)。 在支持页面上,戴尔宣布将停止 Mobile Connect,该程序可将手机…

    2022年7月27日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息