最近我们在一个小项目作了一点新的尝试,改变以往传统的做法,用Base类统一注入管理Bean的方式来简化编程。
这个项目使用的是Webwork + Spring + Hibernate的框架,每个功能模块都有对应的一套Webwork Action、Service和Hibernate Dao。我们使用这种框架的传统做法是,在每个Action中注入需要用到的Service Bean,这样需要在Action中声明要用到的Service成员变量,并提供set方法,也要在对应的Spring配置文件中(比如application.xml)为每个Action写上<property name="xxxService" value="xxxService"/>,以便Spring来进行Ioc注入管理。这样做的好处是结构很清晰,通过配置这一整套东西,能清晰地知道每个Action都要用到哪些Service。但这么做也带来额外的工作,新写一个功能的时候,比如新建一个Action,在这个Action中用到已经存在的一些Service的方法,则需要新写很多代码和配置文件项。
为了提高开发速度,我们做了一个改进,即抽取一个BaseAction类,所有其他具体功能的Action都从BaseAction继承。在BaseAction中统一声明所有的Service Bean为 protected 成员变量,并提供对应的get、set方法。在Spring配置文件中(application.xml),只在BaseAction这个Bean中声明所有用到的Service Bean,比如<property name="xxxService" value="xxxService"/>,而每个具体的Action Bean通过parent这个属性指定它们用到的父类(比如<bean id="xxxAction" parent="BaseAction" ...></bean>),而不用每个都写<property name="xxxService" value="xxxService"/>,这个可以省略了。在每个具体的Action中,也不需要声明Service成员变量,因为父类中已经有了,只需要在用的时候通过this.getXxxService() 的方式来取得所用的Service实例。这样,通过BaseAction就把所有的Service管理起来了,你每增加一个新的Action,只需要写业务相关的代码,在Spring中配置一个简单的Bean类,而不需要考虑如何配置、注入Service Bean。别小看这么一点点改进,它能缩短很多编码时间,每一个小的改进累积起来,就能大幅提高开发效率。
这里需要提醒一点的是,一定要记得在具体Action Bean的Spring配置时加上parent属性,如果你忘了添加这个属性,虽然你的Action在代码中确实是继承了BaseAction,编译和应用服务器启动时并不会报错,但当程序执行到具体Action中用this.getXxxService()来取得BaseAction中的Service实例时,只能取到空指针null。原因是你没写parent属性,Spring不会自动去给BaseAction注入需要的Service Bean。
这套新的方案,我们专门用Load runner作了一个性能测试,在模拟访问量达到10000时(不是完全的并发),新方案的内存损耗和传统方案没有太大差别。也就是说用新方案不会对内存产生大量的额外损耗,一方面因为我的Service都是singleton的,另一方面Spring的延迟注入也减少了一些开销。因为虽然我们每一个具体业务Action都从BaseAction继承了,而BaseAction拥有所有的Service Bean,但因为每个具体Action只根据需要使用到了某几个Service,而不是所有的Service,所以只有用到的这几个Service会被注入这个Action实例所引用的BaseAction实例,在加上单实例的作用,因此,这种方案从理论上来说应该和传统方案的内存损耗是近似的。
我们打算在接下来的大型项目中使用这个方案,看看真的具体到大型项目的实际运行中,是否会有别的问题。总之,我们会持续改进我们的设计思路和方案,朝着提高开发效率的方向前进。
分享到:
相关推荐
依赖注入是一种编程实践,它允许我们在运行时将依赖项传递给类,而不是在类内部创建这些依赖项。这使得类对具体实现的解耦,增强了组件间的灵活性和可测试性。在.NET Core中,内置的DI容器(IServiceProvider)可以...
反应式编程允许开发者通过声明式的方式处理事件流和数据流,从而简化异步编程。RxAndroid结合Android系统事件,如点击事件、网络请求等,提供了一种优雅的方式来管理这些事件,避免了回调地狱。 `Retrofit`是Square...
首先,使用`Convert.FromBase64String()`方法将Base64字符串转化为字节数组,然后用`System.IO.File.WriteAllBytes()`将这些字节写入文件,创建一个新的PDF文档。这个过程在接收Base64编码的PDF数据后,需要将其还原...
BaseLibrary 是一个基于 Java 开发的基础库项目,其主要目标是为开发者提供一系列常用且实用的工具类和组件,以简化开发过程,提高代码的可复用性和项目的稳定性。BaseLibrary-master 是该项目的主分支或者最新版本...
2. **IoC(Inversion of Control)与依赖注入**:base-framework可能会使用IoC容器,如Spring,通过依赖注入的方式管理组件的生命周期和依赖关系,使得代码更加松耦合。 3. **AOP(面向切面编程)**:为了处理如...
1. **数据库操作**:OneBase提供了一套强大的ORM(对象关系映射)系统,允许开发者用面向对象的方式来处理数据库操作,无需编写SQL语句,提高了开发效率和代码的可读性。 2. **路由管理**:框架内的路由系统使得URL...
- 类与对象:学习面向对象编程的基础,包括类的定义、对象的创建、属性和方法的使用。 - 继承、封装和多态:深入理解面向对象的三大特性,并能运用在实际项目中。 2. **C#高级特性** - 枚举与结构体:了解枚举...
JDBC(Java Data Base Connectivity)是Java编程语言中用于与关系型数据库进行交互的一种核心API。这个API由一系列预先定义的类和接口组成,允许Java开发者执行SQL语句,实现跨平台的数据访问。JDBC的存在使得开发...
【ASP.NET编程知识】.NET Core 3.0中WPF使用IOC的图文教程 本文将详细介绍如何在.NET Core 3.0中的Windows Presentation Foundation(WPF)应用程序中使用依赖注入(Dependency Injection,简称DI)容器,即Inverse...
Java作为一个广泛使用的编程语言,其丰富的工具类库是开发者日常工作中不可或缺的部分。"Java常用工具类.zip"这个压缩包显然包含了一系列与Java开发相关的实用工具类,这些类可以帮助开发者更高效地处理各种常见任务...
它是精易论坛发布的易语言模块,内置大量简化功能,让易语言编程更傻瓜化,内含上百种命令,有不少易语言新人会选择使用,为提高开发程序的效率为目的。命令命名格式统一,方便调用查找。另外,精易模块以后将会以...
- AOP编程:使用Spring的切面编程实现日志记录、事务管理等。 - 邮件服务:集成Spring Mail发送邮件。 - 消息队列:结合RabbitMQ或Kafka实现异步处理。 - 微服务架构:Spring Cloud为Spring Boot提供了全套微服务...
SSH(Struts、Spring、Hibernate)是Java Web开发中的经典组合,而Spring框架以其强大的依赖注入(DI)和面向切面编程(AOP)能力闻名。在本笔记中,我们将重点关注如何使用Spring注解`@Component`、`@Service`、`@...
在实际应用中,我们通常会使用try-with-resources语句来简化资源关闭的过程,并使用连接池来管理数据库连接,提高性能和资源利用效率。 总的来说,"java data base connection"这个项目可能涵盖了基础的JDBC概念和...
6. **最佳实践和约定**: BaseLibraryDemo可能还包含了编码规范和最佳实践,如使用Android Data Binding减少代码冗余、使用LiveData和ViewModel实现响应式编程、利用Kotlin的特性简化代码等,这些约定有助于团队成员...
该系统可能包含了用户登录、文档管理、任务分配、日程规划等核心功能,旨在提升办公效率,简化工作流程。其版本号为1.5,意味着它经过了一定程度的迭代和优化,以适应用户需求的变化。 ASP是微软开发的一种服务器端...
本文档详细介绍了Java编程规范的内容,旨在指导开发人员遵循统一的编码标准。 #### 二、规范范围 本规范主要涵盖以下四个方面: 1. **排版规范**:定义了代码的布局和格式化要求。 2. **注释规范**:明确了如何...
在Spring框架中,依赖注入通过容器在运行时动态地将被依赖的类的实例传入到使用它们的类中。 - 控制反转(Inversion of Control, IoC):这是一种思想,它将对象创建和管理的责任转移到外部容器。对象不再负责创建...
- 缺点:Java不允许一个类继承多个类,因此这种方式限制了类的继承。 - 实现`Runnable`接口 - 优点:灵活,可以实现多个接口。 - 缺点:相对复杂,需要手动创建`Thread`对象。 2. **synchronized关键字** - **...
`kt-web-base`是一个专为构建Web应用程序而设计的基础框架,使用了现代编程语言Kotlin。Kotlin是一种在Java虚拟机(JVM)上运行的静态类型语言,它提供了简洁、安全和富有表现力的语法,使得开发过程更加高效和愉快...