Annotation与工厂模式解耦dao与service

开发中往往service、dao并行完成,但是service层又需要调用dao层的CRUD方法,这意味着dao必须先于service完成。这在开发中会极大降低效率的。 通过注解(Annotatoin)我们可以轻松实现两个层次的解耦   首先写一个注解类 @Retention(RetentionPolicy.RUNTIME) public @interface getClassAnnotation{ public String className(); }   在dao层写一个工厂 public class UserDaoFactory { private String userDaoClassName; private static UserDaoFactory instance = new UserDaoFactory(); private UserDaoFactory(){  ClassNameAnnotaton annotation = UserDao.class.getAnnotation(ClassNameAnnotaton.class);  this.userDaoClassName = annotation.className(); } public static UserDaoFactory newInstance(){  return instance; } public UserDao getUserDao(){  try {   return (UserDao)Class.forName(userDaoClassName).newInstance();  } catch (Exception Read More →

J2EE中几种业务代理模式的实现和比较

什么是业务代理模式(buiness proxy)? 在J2EE系统中,一般划分为表现层和业务逻辑层,为实现表现层和业务逻辑层之间的最大限度解耦,引入业务代理模式,这样,当表现层或业务逻辑层具体实现技术发生时,对彼此的影响很小,当然,如果希望实现完全解耦,我们可以使用消息系统JMS来实现,本文章只讨论同步系统范畴。 以一个Struts+Hibernate为例,以下代码是Struts的Action实现方法代码: public ActionForward update(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpS

DAO如何与业务层解耦

在没有使用代理模式的时候,使用者和被使用者耦合。 使用代理模式之后,使用者和代理耦合,代理和被使用者耦合。 为什么要解耦呢?通常是应为变化,需求变化导致最终的程序实现变化,如果耦合度高,出现变化时所需要修改的程序就多,如果进行解耦,那修改的程序就少(被解耦的部分已经不需要修改,因为和变化的地方没有直接的关系了)。   下面举个不太恰当的例子。 假设客户要开发一个游戏,刚开始,有猫和儿童两个类,儿童和猫玩,这两个类有了耦合。 public class 猫 {   public void 叫() {     System.out.println(“喵!”);   } } public class 儿童 {   public static void main(String[] args) {     猫 c = new 猫();     c.叫();   } } 之后,又慢慢地多了少年、青年、中年类,都和猫玩,这些类都和猫类有了耦合。 突然,有一天,客户说和猫玩没意思,要和狗玩。于是增加了狗类,修改了儿童、少年、青年、中年类。 public class 狗 {   public void 叫() {     System.out.println(“汪!”);   } } public class 儿童 {   public static void main(String[] args) {     狗 c = new 狗 ();     c.叫();   } } //   少年、青年、中年 也修改为和狗玩 过了一阵子,客户又发神经了,说和狗玩厌了,还是改成以前的和猫玩吧。于是又要把儿童、少年、青年、中年类都修改一遍。 这种改动实在是太烦了,于是就考虑把猫、狗和儿童、少年、青年、中年解耦,发明出一个接口:会叫的东西。猫、狗实现会叫的东西,儿童、少年、青年、中年和会叫的东西玩。 同时增加一个配置(文件配置、数据库配置、注册表配置,看实际情况使用哪种),指定现在使用猫还是狗,还要增加一个工厂去读取这个配置创建猫或狗。 public interface 会叫的东西 {   public void 叫(); } public class 猫 implements 会叫的东西 {   public void 叫()  {     System.out.println(“喵!”);   } }  public class 狗 implements 会叫的东西 {   public void 叫() {     System.out.println(“汪!”);   } }   public class 会叫的东西工厂 {   public static 会叫的东西 造一个会叫的东西() throws Exception {     // 首先在某个地方(如某个指定文件)配置猫还是狗,在这里读取配置     String 配置 = 读取配置();     if (“猫”.equals(配置))       return new 猫();     else if (“狗”.equals(配置))       return new 狗(); Read More →

苹果的编程语言——Swift简介

Thanks Lucida for his work. http://zh.lucida.me/blog/an-introduction-to-swift/ 关于 这篇文章简要介绍了苹果于WWDC 2014发布的编程语言——Swift。 原文作者: Lucida Blog 新浪微博 豆瓣 转载前请保留出处链接,谢谢。 前言 在这里我认为有必要提一下Bret Victor的Inventing on Principle,Swift编程环境的大部分概念都源自于Brec这个演讲。 接下来进入正题。 Swift是什么? Swift是苹果于WWDC 2014发布的编程语言,这里引用The Swift Programming Language的原话: Swift is a new programming language for iOS and OS X apps that builds on the best of C and Objective-C, without the constraints of C compatibility. Swift Read More →

Different Ways to Set Attributes in ActiveRec

Rails 4 allows the developer to change ActiveRecord attributes in various ways. Each one does it slightly differently with sometimes unique side-effects. It’s important you understand which method to use, so here’s a cheat sheet with in-depth information below. This article has been updated for Rails 4. Check out the old Rails 3 version if you’re Read More →

Rails practice: use after_commit

A relational database, like mysql, provides transactions to wrap several operations in one unit, make them all pass or all fail. All isolation levels except READ UNCOMMITTED don’t allow read data changes until they are committed in other transaction. If you don’t realize it, you probably introduce some unexpected errors. Before It’s common to generate Read More →

Auditing and model lifecycle management for instances and their associations?

from: http://stackoverflow.com/questions/1615977/auditing-and-model-lifecycle-management-for-instances-and-their-associations   CRUD operations must be logged, including what the operation was, who the actor was, and when the operation occurred This can be addressed with an ActiveRecord::Callbacks and an attr_accessor field. In any of the models that need to be logged add the following. attr_accessor :modifier_id,:modifier valiadate :valid_user before_validate :populate_modifier before_save :write_save_attempted_to_audit_log after_save Read More →

Rails Transactions

Question: I have an example Action in a Controller. def some_action product =Product.new product.name =”namepro”if product.save client.update_attribute(:product_id,product.id)endend How to add transactions for this code? I try with this example code: def some_action **transaction do** product =Product.new product.name =”namepro”if product.save client.update_attribute(:product_create,Time.now)end**end**end But it produces this error: undefined method `transaction’ I read about using transactions in Controllers Read More →

How to freaking deploy on CloudBees, CloudFoundry, Heroku, Windows Azure, OpenShift, Elastic Beanstalk and Google AppEngine

from: http://osintegrators.com/node/145 Introduction The following are the installation notes/instructions that correspond with our article in Infoworld entitled “Which Freaking PaaS Should I Use?“. This is what you can do to reproduce the steps we used to deploy the Granny’s Addressbook war file. You can find the source code to the Granny’s Addressbook Spring application on Read More →

Ruby on Rails FAQ

from: http://momosuyu.iteye.com/blog/2033980 1 ruby是什么? Ruby,一种为简单快捷面向对象编程而创的脚本语言,它综合了Perl,Python,Java等语言的特 点写成,有强大的文字处理能力,简单的语法,并且完全的面向对象。同时,Ruby是解释型语言,不需编译即可快捷地编程。Ruby由日本的 Yukihiro Matsumoto(Matz.)在1995年首次发布。Ruby擅长于文本处理、系统管理等任务,大家可以用她来进行实用的编程。 2 rvm是什么? rvm是一个命令行工具,可以提供一个便捷的多版本ruby环境的管理和切换。还可以根据项目管理不同的gemset. 3 gem是什么? 它是打包的Ruby代码。在最低限度,Gem包括一个Ruby文件和一个gemspec。gemspec(Gem规范)描述Gem信息,RubyGems包管理器需要这些信息安装Gem。 4 gemset是什么? gemset可以理解为是一个独立的虚拟gem环境,每一个gemset都是相互独立的。比如你有两个项目,一个是rails 2.3 一个是 rails 3. gemset可以帮你便捷的建立两套gem开发环境,并且方便的切换。 gemset是附加在ruby语言版本下面的,例如你用了1.9.2, 建立了一个叫rails3的gemset,当切换到1.8.7的时候,rails3这个gemset并不存在。 建立gemset Java代码   rvm use 1.8.7 rvm use 1.8.7@rails23   Java代码   rvm use 1.8.7 rvm gemset create rails23 然后可以设定已建立的gemset做为当前环境 use 可以用来切换语言,或者gemset,前提是他们已经被安装(或者建立)。并可以在list命令中看到。 然后所有安装的gem都是安装在这个gemset之下。 列出当前ruby的gemset Java代码   rvm gemset list 清空gemset中的gem 如果你想清空一个gemset的所有gem,想重新安装所有gem,可以这样 Java代码   rvm gemset empty 1.8.7@rails23 删除一个gemset Java代码   rvm gemset delete rails2-3 项目自动加载gemset rvm还可以自动加载gemset. 例如我们有一个rails3.1.3项目,需要1.9.3版本ruby.整个流程可以这样。 Java代码 Read More →