【飞天技术会】驻云承办云时代企业架构搭建技术沙龙|12月21日同步直播
直播地址:http://www.itdks.com/eventlist/detail/1876
本文首先要讲述我重构原先课程大作业做过的一个汽车4S店业务管理系统的过程。
记录将原有项目从Spring+Hibernate的框架改造成Spring+Hibernate+HibernateAnnotation+GenericDao的过程。
首先,是要尽量做到使系统的数据库访问层能够通用,以后做类似的基于SSH框架的项目可用重用我们现在的数据访问层的代码。比如用户信息数据访问层UserDao的实现我们可以参见我前一篇博客:数据库访问层中使用GenericDao和HibernateDaoSupport。其实,如果为了简洁方便,在需要访问数据库的时候,我们可以不写接口UserDao和接口实现UserDaoImpl,而是直接通过如下代码来实现UserDaoImpl的功能:
GenericDaoImplHibernate<User> userDaoImpl=new GenericDaoImplHibernate<User>();
List<User> list=userDaoImpl.findAll(User.class);
但是为了使得我们的数据库访问层扩展性更好,我们还是使用了UserDao和UserDaoImpl这两个类。在后面我们会见到扩展性的优势。
其次,是关于Hibernate-Annotation的使用问题,原先是通过pojo文件+.hbm文件进行数据库映射,现在发现使用.hbm文件过于繁杂,考虑使用带标注的pojo来实现数据库映射。具体方法可以参见我前面写过的一篇博客:使用Hibernate-tools中的hbm2java和hbm2ddl根据hbm文件自动生成pojo和数据库脚本。在这篇文章中介绍了在已知.hbm文件的情况下,如何生成带标注的pojo文件。
然后是对各个技术进行分析,原先系统使用了Spring-MVC中的一些内容,比如url拦截,session注入等功能。那么我现在考虑不使用Spring提供的sessionFactory注入,而是在具体的dao中使用自己定义的HibernateSessionFactory来实例化sessionFactory。这样也是可以实现的。(之所以不使用Spring提供的sessionFactory注入是为了调试方便,因为如果要使用Spring的依赖注入,则必须启动tomcat服务器进行调试,而不能直接通过写java demo类来调试方法。)
首先我们来看spring配置文件的变更,原来是通过在spring中注册.hbm文件来实现数据库的映射,配置方法如下:
现在我们使用了Hibernate-Annotation,因此不再需要管理.hbm文件,不过需要一个单独的hibernate.cfg.xml来进行数据库映射。spring配置内如容下:
注意到在上述配置中有一个 <property name="configurationClass">,这个属性指定的类就是org.hibernate.cfg.AnnotationConfiguration。这表示使用hibernate-annotation。还有 <property name="configLocation">指定的地址是:classpath:hibernate.cfg.xml。这表示要将hibernate.cfg.xml文件放在src的根目录下。eclipse项目中,classpath就是src目录,但当将项目发布到服务器以后,hibernate.cfg.xml会被发布到apache-tomcat\webapps\carmis\WEB-INF\classes这个目录下。接下来是hibernate.cfg.xml配置文件的内容,内容如下所示:
对于hibernate.cfg.xml的结构与内容我们都已经很熟悉了,这里就不再赘述。仔细查看这个配置文件,我们会发现<mapping class>对应的属性是Pojo类,而之前我们在spring中配置的是 <property name="mappingResources">,他所对应的是.hbm文件。
上述的变更都是为了适应hibernate-annotation,也就是不再使用.hbm文件进行数据库映射,而使用带注释的Pojo进行数据库映射作出的配置文件变更。下面的变更是为了不使用sessionFactoryd的IOC,而是通过在DaoImpl中手动知道sessionFactory。下面先来看一下配置文件的对比:
——————————————————————————————
在使用spring的时候我们经常会提到依赖注入的问题,这里所谓的依赖注入就是并不在类中显示创建对象,比如类似:UserDaoImpl userDaoImpl=new UserDaoImpl(); 这样的显示创建userDaoImpl实例,而是通过<bean id="userDaoImpl" class="edu.sjtu.ist.ssh.dao.impl.UserDaoImpl">这样的配置文件来创建一个userDaoImpl对象实例。这里用到了java的反正机制,通过一个字符串描述具体的类型就可以创建一个userDaoImpl对象。在具体使用userDaoImpl对象的时候,相当于调用了UserDaoImpl userDaoImpl=Class.forName(edu.sjtu.ist.ssh.dao.impl.UserDaoImpl).getInstance(); 这样的方法。
至于其中的property属性:<property name="sessionFactory"> <ref bean="sessionFactory" /> </property> 相当于是在构造函数中设置了一定的参数。如果我们不设置property属性那么就需要在UserDaoImpl类中显示声明那些必须进行初始化的参数。比如上述的sessionFactory这个属性。这个sessionFactory就是需要注入的参数
——————————————————————————————
spring的一大特点就是IOC,IOC的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务,容器负责将这些联系在一起。现在就是在配置文件中,我们指定组件userDaoImpl是由类edu.sjtu.ist.ssh.dao.impl.UserDaoImpl实例化而来,并且sessionFactory是需要注入的对象实例。而carDaoImpl中则没有需要注入的对象实例,这是因为我们在CarDaoImpl这个类中进行了手工注入,代码如下所示:
而HibernateSessionFactory的定义则如下述代码所示:
这里HibernateSessionFactory所起到的功能就是类似于spring配置文件中的<bean id="sessionFactory">。通过上述的方法,我们就不再需要在配置文件中注入sessionFactory这个实例。这样做的一个好处是我们能够在不启动tomcat服务器的情况下,就能使用CarDaoImpl这个类,能够更好的测试他们。如果要使用spring的依赖注入这一特性注入sessionFactory这个实例,那么必须启动tomcat,然后才能使用CarDaoImpl这个类。
还有就是不使用spring的action,而是使用stucts来作为项目MVC架构中的Controller。即真正实现我们的SSH架构,而不是我们当前的SH架构。
再接着实现日志管理功能。我们可以使用log4j,也可以让common-logging结合log4j来使用,还有可以使用sflog4j等等日志管理功能。更是可以自己对log4j进行封装,自定义日志管理功能。当前比较推荐的使用common-logging和log4j结合使用的模式。因为common-logging和log4j都是开源项目,可是使用GreenUML来查看这两个项目的整体架构,可以从中学习到一些知识,比如设计模式中的单例模式,工厂模式的使用等等。关于log这一部分的内容,可以参考我的一篇博客:log4j+commons-logging结合使用,里面详解介绍了log的使用方法,并且根据log的不同等级往不同地址存储log。
1)使用消息托送的方式实现看板,消息中间件用ActiveMQ。
2)实现数据库的备份还原,不得单单只是按钮,还需要一个操作界面,能够选择具体备份还原哪一个数据库。刚开始需要插入的信息是数据的基本信息,比如connecturl,databasename,username,password等等,后期就是对这个数据库进行操作。
3)实现文件的上传下载功能,还有一个上传下载的功能界面用户管理上传的文件。比如删除功能。
一个多月的寒假,玩到罪恶感回来,开始新的学期,fighting!
那么IOC的好处是什么呢?
在以前如果要使用一个类B的方法,那么就必须在当前类A下new一个B类的实例,这样间接会造成A与B的耦合,而如果使用IOC,那么就不需要使用new来创建对象了,而是通过配置文件来创建对象,负责这一任务的是spring 容器。这样相当于是解耦工作,当我们业务发生变成的时候,就不再需要修改原有代码,而只需要修改配置文件即可。
比如我们要访问数据库都会使用到DAO层,而DAO层也是根据特定数据库来写的,加入原先使用的是SQL Server,那么现在加入要使用Oracle了,如果没有使用IOC,那么就必须在原有代码下修改。而加入使用了IOC,那么我们只需要修改配置文件,将DAO指向新的数据库访问层即可。不过这些需要具体Oracle的DAO层。但是这样没有修改原有的代码。代码增加远远好于代码变更。
本文转自xwdreamer博客园博客,原文链接:http://www.cnblogs.com/xwdreamer/archive/2011/12/26/2302225.html,如需转载请自行联系原作者
微信关注我们
转载内容版权归作者及来源网站所有!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。
为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。
Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。
View Code