Spring松耦合示例

面向对象设计的理念是把整个系统分成一组可重用的组件,然而,当系统变得越大的时候,尤其是在java中,这最大的对象依赖将会紧紧耦合,以至于非常难以管理和修改,而现在,你可以使用Spring框架扮演一个中间模块的角色,方便高效地管理其他组件依赖 输出生成的例子 看个例子,假设你的项目有一个方法可以输出内容到csv或者json格式,你可能写出这样的代码 ,然后是实现接口的类 再写个Json生成的类 有好几种方法来调用IOutputGenerator接口,以及我们如何使用Spring来避免对象的过度耦合。 方法1-直接调用 问题: 这种方法,output这个对象和CsvOutputGenerator耦合在了一起,每次要改变输出格式的话都要修改代码,如果这类代码遍布项目,那么改起来就跪了 方法2-通过帮助类调用 也许你会想创建一个Helper类吧所有的output实现都移进去 然后可以这样调用 问题: 看起来似乎更加优雅了,你仅仅需要管理这个Helper类就可以实现不同格式的输出需求改变了,然而,Helper还是和CvsOutputGenerator耦合,每一次要改变输出格式的时候,都要对Helper类做一下微调。 方法3-Spring Spring依赖注入很合适,可以使不同的格式生成类分离开来 首先对OutputHelper做一点微调,添加了一个参数 然后创建一个Spring bean配置文件,并声明所有的Java对象依赖 然后通过Spring调用 以后要改Json格式,直接改一下xml配置文件就行了。能够减少错误 结论 通过Spring框架的依赖注入,可以优雅的管理对象依赖,更大的灵活性,尤其是对于Java项目非常好用。

Spring3实例入门-Hello World

每次看到hello world,都有一种说不出的赶脚,想起了一个程序员,退休后写毛笔字,取笔研磨铺纸,大笔一挥,写下了“hello world”。 1.使用Maven生成项目结构 2.转换成Eclipse项目 3.添加Spring3.0 依赖 在pom.xml文件里添加Spring 3.0 依赖,然后依赖会从Maven中央仓库自动下载 4.Spring bean 写个简单的bean 5.Spring bean配置文件 创建一个配置文件,在里面声明所有可用的Spring beans 6.最终的目录结构  7.运行 8.输出 9.Demo下载 Spring3-hello-world-example.zip

使用Maven创建Web项目

本文通过Maven完成一个简单的Web项目(注意,Spring配置不是重点,看看就行) 1.从Maven模板创建Web应用程序 命令格式如下: 这就告诉Maven从**maven-archetype-webapp **这个模板来创建 友情提示:是不是太难记了..好吧,直接输入 根据向导来创建把。。 比如我这样写: 就创建了一个包名为com.mkyong,类名为CounterWebApp的项目了 2.Maven的Web程序目录结构 标准的web.xml部署描述文件生成了 对结构有疑问的去这里 生成的pom.xml文件如下 没啥疑问的。web.xml文件则如下: index.jsp内容是: 3.转换以支持Eclipse 为了使Maven的web项目支持Eclipse,在命令行下,cd到CounterWebApp目录下,然后输入这个命令 -Dwtpversion=2.0参数是必需的,这个参数指明了是web项目,然后导入到eclipse里就行了。从导入的工程ico可以看出是个web项目 图一 不要迷惑,如果我们只输入 会转换成java项目,而不是web项目的。 好了,现在项目已经准备好部署了,eclipse里的tomcat server插件装好,然后启动项目 图二 可以通过_http://localhost:8080/CounterWebApp/_地址来访问 4.更新pom文件 为了使Maven项目支持Spring MVC框架,我们需要修改pom.xml文件 1.添加编译插件指定jdk6来编译 2.添加Spring框架依赖 3.升级JUnit到4.1.1 5.Spring MVC 松耦合 创建Spring MVC控制器类,有两个方法,打印信息 然后,创建Spring配置文件,定义视图解析器 然后更新一下web.xml文件,通过Spring的监听器ContextLoaderListener把Spring框架集成进去 然移动index.jsp到WEB-INF目录里,以防用户直接访问他,同时我们编辑,增加${message}变量,也就是controller控制器传过来的值到页面 最终的页面结构是: 图三 6.Eclipse+Tomcat 为了通过Eclipse的Tomcat插件开始/调试项目,需要再执行一次下面的命令,使得所有的依赖附加完成 在没执行以前,项目依赖是空的 图四 执行完以后,就都有了 图五 重要!许多人就是没有第二次执行这个命令导致无法开始/调试,如果有问题,右击你的项目属性,看看依赖是否为空 7.Maven打包 web项目打包成war。放在target目录 进入项目目录,执行一下就可以了 然后把target目录的CountWebApp.war文件拷贝,并部署到你的web容器里就行了 8.Demo演示 打开_http://localhost:8080/CounterWebApp/welcome_ 可以看到 图六 我们传个参数进去 http://localhost:8080/CounterWebApp/welcome/mkyong 就可以看到效果了 图七 9.Demo下载 CounterWebApp.zip

Maven库依赖机制及添加自定义库

一.Maven库依赖机制 Maven的库依赖机制可以帮助我们自动下载依赖的库文件,并且还能更新版本。。 考虑一个情境来理解机制的工作原理,假设我们要使用Log4J库作为项目的日志记录。以下是我们要做的 1.传统的方式 1)访问Log4J网站http://logging.apache.org/log4j/2.x/ 2)下载Log4J的jar包 3)复制进项目的classpath里 4)手工包含到项目的依赖里 看到没,你要从头做到尾,如果Log4J更新了,你得再来一遍。。 2.Maven的方式 1)需要知道Log4J的Maven坐标(coordinates,这个暂时没想到好名字),就是这样的东西 然后Maven就会自动下载1.2.14版本的Log4J了。如果version这个元素没有,那么如果有了新版本,Maven会自动下载新版本的。 2)在pom.xml里声明这个Maven坐标 3)当Maven编译或者build的时候,Log4J会自动下载,放入本地仓库里 4)Maven全部接管 3.解释 搜索顺序前面说过了。本地-》中央-》远程仓库 Maven坐标咋来的,当然去中央仓库搜索之了,搜索结果清晰的令人发指 二.添加自定义库到本地仓库 有两个情况,需要我们包含自定义的库到本地仓库里 1是你想使用的jar文件不再中央仓库 2是你创建了一个自定义的jar包,需要另一个项目使用这个jar 比如,kaptche,一个第三方的java库,生成验证码,现在中央仓库没有了。 我们想要加到本地仓库里 1.mvn安装 下载kaptche,解压并且拷贝kaptcha-version.jar到其他任何你喜欢的地方,比如c盘,然后输入如下格式的命令 这里我这样输入 这样完成了。kaptcha已经存在本地库了 2.pom.xml配置一下 这个前面说过了,Maven坐标嘛

Maven仓库详解

本文由我翻译合并了多篇文章,整理成一篇。 一.本地仓库(Local Repository) 本地仓库就是一个本机的目录,这个目录被用来存储我们项目的所有依赖(插件的jar包还有一些其他的文件),简单的说,当你build一个Maven项目的时候,所有的依赖文件都会放在本地仓库里,仓库供所有项目都可以使用 默认情况下,本地仓库在.m2目录,windows下的话就是你的用户名目录下的.m2目录 1.更新本地仓库目录 找到你的MAVEN_HOME目录下的conf/setting.xml文件,更新localRepository节点 2.保存一下 完成了。新的本地仓库被放在了D:/maven/repo 看一下这个目录 二.中央仓库(central repository) 当我们build一个Maven项目的时候,Maven会检查我们的pom.xml文件,来定义项目的依赖,然后Maven会在本地仓库里查找,如果没有找到,就去maven的中央库去下载,地址是 http://search.maven.org/#browse 看起来是这样的  注意啊,虽然这个是新的中央仓库,但有时候还是会从_“**http://repo1.maven.org/maven/**_这个旧仓库下载东西,不过不要紧,理解就行了 三.远程仓库(Remote Respository) 在Maven中,当你在pom.xml中生命的依赖既不在本地库,也不在中央库的时候,就会报错。 1.例子 org.jvnet.localizer这个包仅在java.net的仓库里有(以前是,现在中央仓库也有了。但理解就行) 当我们build的时候,会失败,并输出未找到错误信息 2.声明java.net仓库 为了告诉Maven从远程仓库里获取依赖,我们需要声明一个远程仓库,在pom.xml里这样写 这样,Maven搜索依赖的顺序就是: 1)搜索本地仓库,没有找到,就去第2步,否则退出 2)搜索中央仓库,没有找到,就去第3步,否则退出 3)去java.net远程仓库获取,没有找到,就报错,否则退出 补充:JBoss也有个远程仓库,可以如下配置:

Maven安装教程

Maven不需要作为服务组件安装到windows上,仅仅需要下载,解压,然后配置一下环境变量就行了 1.JDK和JAVA_HOME 确保JDK已经安装,同时JAVA_HOME变量已经添加到了windows环境变量里,指向jdk目录  2.下载Maven 去Maven主页,选个版本,点击下载 3.解压 解压下载的zip文件,重命名,比如我放到D盘的Maven目录 4.添加MAVEN_HOME环境变量 添加一个新的环境变量MAVEN_HOME到环境变量,指向Maven目录  5.添加path变量 更新Path变量,把Maven的bin目录添加进去,这样就可以在任何地方执行mvn命令了  6.验证 打开命令行,输入 如果看到类似下面的 Maven已经成功的安装配置了。 老外写的太详细了。。。  

Maven实例入门-随机数生成

看了很多个例子,发现这个最好,译文中会带有我的一些了理解,有问题欢迎指出。 0.Maven是什么? Apache Maven,是一个软件(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。 可以看到,核心就是项目管理和自动构建了,从例子中将会体会更深。本例创建一个随机数生成程序。 1.从Maven模板创建项目 Maven的环境变量配置和java类似,直接添加系统变量MAVEN_HOME指向你下载的maven目录,然后将bin目录添加到path环境变量里。 在命令行下,进入到你想存储项目的位置,比如,我自己有个叫work的目录,那么我就cd到work目录,然后按下面的格式输入命令 这是告诉Maven从**maven-archetype-quickstart **创建一个java项目,如果你这个参数不填,那么会列出一个列表,让你选择你想创建什么类型,比如web项目啊,啥的。 友情提示:是不是太难记了..好吧,直接输入 根据向导来创建把。。 比如 这里的groupId就是包名,artifactId就是类名,以后具体的一些其他参数我希望有时间可以跟大家分享。 2.Maven目录结构 上面的命令第一次执行的时候会从apache网站下载maven的一些其他东西,所以务必保持联网。执行成功后,会生成一个这样的目录结构 这里main目录是我们的程序住代码目录。源代码会放在/src/main/java/包名 目录里,而单元测试代码会放在/src/test/java/包名 目录里。当然还有一个标准的pom.xml文件会生成。这个pom文件其实类似于Ant的build.xml文件,它包含了项目的信息,从目录结构到项目插件到项目依赖,都有了。。 3.用Eclipse写代码 maven已经生成了一个完整的工程了,为了能够导入到eclipse里来编辑代码,我们可以把这个项目转换成eclipse可用的。 首先命令行进入NumberGenerator目录,然后输入 然后就会生成Eclipse需要的所有项目文件里 图1.导入eclipse之后的效果 4.更新pom文件 默认的pom文件太简单了。通常我们需要添加编译插件来告诉Maven我们打算使用哪个版本的jdk来编译项目,有时候默认的版本太低了 我们把source和target改成了1.6. 然后更新JUnit到4.1.1 最终我们的pom文件如下 5.更新业务逻辑 TDD开发的理念告诉我们先写测试,我们打开AppTest.java文件。 然后修改App.java的代码 6.Maven打包 现在,我们要使用Maven来编译我们的项目,并且打包成一个jar文件,记得pom.xml文件吗?在这个文件里我们定义了打包的类型 在项目目录(也就是NumberGenerator目录)的命令行下,输入 然后就会看到: 程序开始编译,并且执行了单元测试,然后在target目录下生成了jar包,最后,程序目录结构如下: 7.执行Demo 运行生成的jar文件,还在在NumberGenerator目录下,输入如下命令 后面的com.mkyong.App就是包名+类名,也就是类的全名了 8.Demo下载 Maven-NumberGenerator.zip  基本上一个完整的的示例就做完了,希望你有所收获,后续会更新一些Maven的的东西。欢迎支持。中秋快乐。   

Maven提示缺少tools.jar

记录一下。 这两天在熟悉Maven,长见识了.后续可能的话会写上一两篇,今天配置的时候提示tools.jar文件。于是使用everything搜了一下,本机的jdk目录还真没有,最后搜了一下,发现是安装jdk时候的问题,具体就是因为安装jdk的时候,后面被让继续安装jre,这个时候,我为了方便,将jre安装在了jdk的目录里,结果导致jre会覆盖到jdk的这两个文件。同时还会覆盖dt.jar这个包,于是,就没了。。这个问题略隐晦了..  重新安装了jdk,将jdk和jre分开目录,然后设置一下jdk的lib目录到classpath就可以了,问题解决。

[译]Java中的CountDownLatch和CyclicBarrier

本文译自官方文档,有细微改动,Java多线程的时候,看了好多文档,还是官方说的最清楚。结合自己的理解,译之。 CountDownLatch 字面意思就是倒计数闩,后面会讲到,这里的同步允许一个或多个线程等待,,知道其他线程进行的一系列操作完成。而CountDownLatch通过一个参数count(数目)来构造,而await()则阻塞当前线程,直到countDown()将count减为了0,然后,所有的阻塞线程被释放,也就是那些调用了await方法的线程立即返回,注意,这是一次性的,也就是说count不能被自动重置,如果你想这么做,CyclicBarrier是可以的。 CountDownLatch用处很多,当用count=1来构造的时候,这就相当于一个开关,所有调用了await方法的线程都在等待,直到有一个线程调用了countDown(),CountDownLatch通过count=N构造的话,就可以使一个线程等待其他N个线程完成操作,或者一个操作被做N次。 简单的demo: 一组worker(工人)线程使用两个CountDownLatch 第一个是开始信号,用来阻止工人提前操作,直到(driver)传送带准备好了才允许开始 第二个是完成信号,他使传送带等待直到所有的worker都完成 另一个典型的例子就是把问题分成N部分,通过线程执行每一部分,具体的话是将线程入队到一个Executor对象里。然后调用execute方法。当执行完毕一部分,就并给latch 减去1,当减到0的时候调用await的方法就可以继续运行了,当需要重复计数的话,用CyclicBarrier代替  CyclicBarrier 字面意思回环栅栏。这里的同步是允许一系列的线程互相等待直到大家都来到一个barrier前面,当程序中有互相等待的情况的时候,非常有用,叫做回环是因为当所有等待线程都被释放以后,cyclicBarrier可以被重用 同时,CyclicBarrier支持一个可选的Runnable参数,当所有的线程都来到barrier前面的时候,程序开始执行runable线程动作,当需要更新所有线程共享的某个状态的时候,该动作非常有用。例子是一个并行分解的例子 这里每一个worker线程处理矩阵的一行,然后在barrier前面等待,直到所有的行都处理完成,当所有的都完成以后,这里 的Runnable参数执行来合并这些行,一旦有了正确的结果waitUntilDown()就返回true,然后所有的线程终止。 如果barrier执行的这个动作没有对那些等待的线程做出回应,以使的这些线程做一些别的操作,我们可以这么写,将 改为 如果一个线程由于中断,失败或者超时过早的离开了barrier,那么所有的线程都会通过BrokenBarrierException引发异常。

Unix sed实用教程系列目录

本系列文章已经译完了,译自[email protected],收获颇丰,作者没有将明白的我做了补充,并且尝试讲的更清楚,整理成系列索引,方便学习,开篇非译文,是我为了方便后面的理解写的一篇,感谢原作者的分享.有任何问题欢迎留言讨论. Unix sed实用教程开篇 [译]Unix sed实用教程第一篇–向文件中增加一行 [译]Unix sed实用教程第二篇–替换文件内容 [译]Unix sed实用教程第三篇–读写文件 [译]Unix sed实用教程第四篇–选择性打印 [译]Unix sed实用教程第五篇–替换文件内容续 [译]Unix sed实用教程第六篇–删除文件内容 [译]Unix sed实用教程第七篇–输出文件内容(10 Demo) [译]Unix sed实用教程第八篇–CSV文件操作