这个文档的作者是夏昕。先看看这个文档的内容,在作出评论!!
看了spring初探这一章,给我的感觉就是利用java的反射机制,和hibernate差不多!!
控制反转 IOC(Inversion of control):由容器控制程序之间的关系,而非传统实现中,有程序直接操控。
依赖注入DI(Dependency injection):组件之间的依赖关系由
容器在运行期决定,即由容器动态的将某种依赖关系注入到组件中。
依赖注入的特性:依赖注入机制减轻了组件之间的依赖关系,同时也大大地提高了组件的可移植性,这意味组件得到重用的机会将会更多!
注入主要有:接口方式、参数方式、构造方式,其实我觉得参数和构造应该都属于参数传值的方式。
什么叫热部署?
热部署指的是配置文件修改后自动被容器读取,无需重新启动应用服务器。
<beans>
<description>Spring Quick Start</description>
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>messages</value>
</list>
</property>
</bean>
</beans>
这里声明了一个名为messageSource的Bean(注意对于Message定义,Bean ID必须为messageSource,这是目前Spring的编码规约),对应类为ResourceBundleMessageSource,目前Spring中提供了两个MessageSource接口的实现,即
ResourceBundleMessageSource和
ReloadableResourceBundleMessageSource,
后者提供了无需重启即可重新加载配置信息的特性。
注意:实际上Spring实用了jdk中的ResourceBundle来读取配置文件
对于属性文件中的国际化中文问题:可以利用JDK中的转码工具native2ascii.exe来进行转换
从hibernate的概要图上可以看出hibernate的主要是将对象模型转换成关系模型的过程。
第二章看完了,感觉框架中涉及的关键性概念及作用要记住:
SessionFactory(org.hibernate.SessionFactory)
针对单个数据库映射关系经过编译后的内存镜像,是线程安全的(不可变)。它是生成Session的工厂,本身要用到ConnectionProvider。该对象可以在进程或集群的级别上,为那些事务之间可以重用的数据提供可选得二级缓存。
Session(org.hibernate.Session)
表示应用程序与持久存储层之间交互操作的一个单线程对象,此对象生存期很短。其隐藏了JDBC连接,也是Transaction的工厂。其会持有一个针对持久化对象的必选(第一级)缓存,在遍历对象图或者根据持久化标识查找对象时会用到。
-----------------------------------------------------------------------------------------------------------------
目前好像没有什么感觉!!
什么瞬态(transient)\什么持久化(persistent)\什么脱管(detached)
把一个对象说的这么理论化,不知为何???
我找来一本《hibernate的参考手册-翻译版本》
我访问http://www.hibernate.org.cn ,既然目前处于域名转让???不知何解!可能已经不用了,网上有些人说已经转向
www.javaeye.com上了。
还有个网站:
http://www.java99.com/
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
例子:
使用JAVA 数据库(HSQL DB)
运行Hibernate所使用的最小的jar为:
antlr.jar;cglib.jar;asm.jar;asm-attrs.jar;commons-collections.jar;commons-logging.jar;ehcache.jar;hibernate3.jar;jta.jar;dom4j.jar;log4j.jar
其中第三方库jar需要看自身使用的情况而定。
hibernate是通过反射机制来实例化javaBean,
javaBean中默认构造函数是不带参数的。
hibernate主要依赖于映射文件将对象模型转换成关系模型。hibernate的配置文件中的DTD文件放在hibernate3.jar包中。
标识符生成策略:
<hibernate-mapping>
<class name="events.Event" table="EVENTS">
<id name="id" column="EVENT_ID">
<generator class="native"/>
</id>
</class>
</hibernate-mapping>
native:根据已配置的数据库(方言)自动选择最佳的标识符生成策略。
看完了第一章内容,感觉所讲的东西只是传达一个比较初略的了解。其实第一章内容根本没有很多必要写出来。
project
<project name="" default="" basedir="">
</project>
name:工程名称
default:构建文件中的一个目标名,如果在命令行没有指定目标,则使用默认的目标
basedir:定义工程的根目录,一般情况下为"."
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
target
以下目标将编译一组文件,并将它们打包到一个名为finallib.jar的文件中
<target name="build-lib">
<javac srcdir="${src.ejb.dir}:${src.java.dir}"
destdir="${build.dir}"
debug="on"
deprecation="on"
includes="**/*.java"
excludes="${global.exclude}">
<classpath>
<pathelement location="."/>
<pathelemetn location="${lib.dir}/somelib.jar"/>
</classpath>
</javac>
<jar jarfile="${dist}/lib/finallib.jar" basedir="${build.dir}"/>
</target>
-------------------------------------------------------------------
<copy todir="${weblogic.dir}/${weblogic.server.home}/public_html/jsp">
<fileset dir="${src.www.dir}/jsp"/>
</copy>
-------------------------------------------------
相关概念:
特性(property):在构建文件中由<property>标签表示的名-值对
DataType:一类表示复杂数据集合的元素,例如fileset和path
数据元素(data element):这个词涵盖了特性和DataType
property
<property name="my.first.property" value="ignore me"/>
<property file="user.properties"/>
<property name="property.one" value="one"/>
<property name="property.two" value="${property.one}:two"/>
--------------------------------------------------------------------
<path id="classpath">
<fileset dir="${lib.dir}">
<include name="**/*.jar"/>
</fileset>
</path>
-------------------------------------------------
<target name="" depends="bot">
<mkdir dir="${doc.dir}/api"/>
<javadoc packagenames="irssibot.*"
sourcepath="${src.dir}"
destdir="${doc.dir}/api"
author="true"
version="true"
use="true">
<classpath refid="classpath"/>
</javadoc>
</target>
------------------------------------------------------------
<target name="clean">
<delete>
<fileset dir="${build.classes}" includes="**/*.class"/>
</delete>
</target>
<target name="cleanall" depends="clean">
<delete dir="${build.dir}"/>
<delete dir="${dist.dir}"/>
<delete dir="${doc.dir}/api"/>
</target>
这一章没有什么新意。但是有一个点就是
网络任务需要关注一下
真搞不懂,一本书怎么写这么多的文字,简直多余!!
一个ANT写这么厚?????
我看的书籍是<Ant权威指南>,Ant的开发者:James Duncan Davidson。对于一些比较重要的内容我记录了下来:
ANT命令行参考
ant [option [option...]] [target [target...]]
option :={-help:显示描述Ant命令及其选项的帮助信息
-projecthelp:显示包含在构建文件中的、所有用户编写的帮助文档。即为各个<target>中description属 性的文本,以及包含在<description>元素中的任何文本。将有description属性的目标列为主目标("Main target"),没有此属性的目标则列为子目标("subtarget")
-version:要求Ant显示其版本信息,然后退出
-quiet:抑制并非由构建文件中的echo任务所产生的大多数信息
-verbose:显示构建过程中每个操作的详细消息。此选项与-debug选项只能选其一
-debug:显示Ant和任务开发人员已经标志为调试消息的消息。此选项与-verbose只能选其一
-emacs:对日志消息进行格式化,使它们能够很容易地由Emacs的shell模式(shell-mode)所解析;也就是说,打印任务事件,但并不缩排,在其之前也没有[taskname]
-logfile filename:将日志输出重定向到指定文件
-logger classname:指定一个类来处理Ant的日志记录。所指定的类必须实现了org.apache.tools.ant.BuildLogger接口
-listener classname:为Ant声明一个监听类,并增加到其监听者列表中。在Ant与IDE或其他Java程序集成时,此选项非常有用
-buildfile filename:指定Ant需要处理的构建文件。默认的构建文件为build.xml
-Dproperty=value:在命令行上定义一个特性名--值对
-find filename:指定Ant应当处理的构建文件。与-buildfile选项不同,如果所指定文件在当前目录中未找到,-find就要求Ant在其父目录中再进行搜索。这种搜索会继续在其祖父目录中进行,直至达到文件系统的根为止,在此如果文件还未找到,则构建失败
}
突然想学习学习Java-PetStore2.0,感觉比较有趣,学习一个Java-PetStore就涉及到GlassFish2.1、db-Derby-10.1.2.1、IDE-NetBeans6.5.1、Ant1.7.1,一堆的工具,java-PetStore2.0是一个netBeans工程,直接使用NetBeans就可以打开,也可以使用Ant操作;工程中所涉及的服务器GlassFish和数据库Derby,NetBeans都已经为你准备好了。
ANT一直都没有好好的去学习过,现在打算先把ANT看看!!
-------------------------------------------------------------------------------------------
在开发的过程中,我们可能需要将生产环境和调试环境分开来,这样才能保证安全性,但是安装两个glassfish又不太可能,因为它太庞大了。另外做为一个工程发布也不太方便,每次都要将工程名改来改去,并且绑定的EJB在同一个域内里是不能同名的。这样的话,要改变的东西实在是太多了。
我们可有以第三种方法,那就是为glassfish添加另外的domain,一个domain跑我们的真实环境,一个domain跑我们的测试环境,因为是同一个glassfish,所以也不会存在从测试到真实环境的移植问题。以后只要改一个domain就可以了。我们在安装glassfish的时候,它已经默认为我们安装了一个domain,那就是domain1.
我们查看setup.xml里面可以看出,是如何新建domain的,于是我们把我们需要的一些target提取了出来,见如下。下面的配置里面唯一可能需要改变的就是glassfish安装目录这个属性了,其它可以按照我配的来,也可以自己修改。
<?xml version="1.0" encoding="UTF-8"?>
<project name="createDomain" default="create.domain" basedir=".">
<target name="setEnv">
<property name="domain.name" value="domain3"/>
<property name="admin.user" value="admin"/>
<property name="admin.password" value="adminadmin"/>
<property name="admin.port" value="6848"/>
<property name="instance.port" value="10080"/>
<property name="orb.port" value="5700"/>
<property name="imq.port" value="9676"/>
<property name="https.port" value="10181"/>
<property name="iiop.ssl" value="5821"/>
<property name="iiop.mutualauth" value="5921"/>
<property name="jmx.admin" value="10687"/>
<property name="install.home" value="C:/Program Files/glassfish-v2ur2"/>
<property name="adminpassfile" value="${install.home}/passfile"/>
<property name="ASADMIN" value="${install.home}/bin/asadmin.bat"/>
<echo file="${adminpassfile}" append="false">AS_ADMIN_ADMINPASSWORD=${admin.password}</echo>
</target>
<target name="create.domain" depends="setEnv">
<exec executable="${ASADMIN}" failonerror="true">
<arg line="create-domain" />
<arg line="--adminport ${admin.port}" />
<arg line="--instanceport ${instance.port}" />
<arg line="--user ${admin.user}" />
<arg line="--passwordfile "${adminpassfile}"" />
<arg line="--domainproperties orb.listener.port=${orb.port}:jms.port=${imq.port}:http.ssl.port=${https.port}:domain.jmxPort=${jmx.admin}:orb.ssl.port=${iiop.ssl}:orb.mutualauth.port=${iiop.mutualauth}" />
<arg line="--savelogin" />
<arg line="${domain.name}" />
</exec>
<delete file="${adminpassfile}" />
</target>
</project>
然后用ant执行它就可以了,我这里的执行输出如下:
C:\Program Files\glassfish-v2ur2>ant
Buildfile: build.xml
setEnv:
create.domain:
[exec] Using port 6848 for Admin.
[exec] Using port 10080 for HTTP Instance.
[exec] Using port 9676 for JMS.
[exec] Using port 5700 for IIOP.
[exec] Using port 10181 for HTTP_SSL.
[exec] Using port 5821 for IIOP_SSL.
[exec] Using port 5921 for IIOP_MUTUALAUTH.
[exec] Using port 10687 for JMX_ADMIN.
[exec] Domain being created with profile:developer, as specified by variabl
e AS_ADMIN_PROFILE in configuration file.
[exec] The file in given locale [zh_CN] at: [C:\Program Files\glassfish-v2u
r2\lib\install\templates\locales\zh_CN\index.html] could not be found. Using def
ault (en_US) index.html instead.
[exec] Security Store uses: JKS
[exec] Domain domain3 created.
[exec] Login information relevant to admin user name [admin] for this domai
n [domain3] stored at [C:\Documents and Settings\hadeslee\.asadminpass] successf
ully.
[exec] Make sure that this file remains protected. Information stored in th
is file will be used by asadmin commands to manage this domain.
[delete] Deleting: C:\Program Files\glassfish-v2ur2\passfile
BUILD SUCCESSFUL
Total time: 21 seconds
C:\Program Files\glassfish-v2ur2>
这样我们就可以看到glassfish的domains目录下面,多出了一个domain3这个文件夹。然后有关数据库连接池啊什么的,就可以到该目录下面的config/domain.xml去改了,domain.xml里面的属性我们以后有时候再好好研究一下。当然,我们也可以去glassfish的控制台进行可视化修改,glassfish的控制台是所有的应用服务器里面做得最好的一个了。访问的端口就是我们新建domain的时候用到的
admin.port的这个属性。
三种依赖范围:
compile
,
test
,
provided,runtime,test,system
compile(编译范围)
compile
是默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范围。编译范围依赖在所有的classpath中可用,同时它们也会被打包。
provided(已提供范围)
provided
依赖只有在当JDK或者一个容器已提供该依赖之后才使用。例如,如果你开发了一个web应用,你可能在编译classpath中需要可用的Servlet API来编译一个servlet,但是你不会想要在打包好的WAR中包含这个Servlet API;这个Servlet API JAR由你的应用服务器或者servlet容器提供。已提供范围的依赖在编译classpath(不是运行时)可用。它们不是传递性的,也不会被打包。
runtime(运行时范围)
runtime
依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如,你可能在编译的时候只需要JDBC API JAR,而只有在运行的时候才需要JDBC驱动实现。
test(测试范围)
test
范围依赖在一般的 编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。
system(系统范围)
system
范围依赖与provided
类似,但是你必须显式的提供一个对于本地系统中JAR文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。这样的构件应该是一直可用的,Maven也不会在仓库中去寻找它。如果你将一个依赖范围设置成系统范围,你必须同时提供一个systemPath
元素。注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的Maven仓库中引用依赖)。
依赖版本界限:
- (?, ?) 不包含量词。意思为:?<xx<?
- [?, ?] 包含量词。意思为:?<=xx<=?
- 例如:指定一个依赖界限:JUnit 3.8 - JUnit 4.0
-
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>[3.8,4.0)</version>
<scope>test</scope>
</dependency>
-
查看有效的pom—〉mvn help:effective-pom
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Maven中的版本包含了以下部分:主版本,次版本,增量版本,和限定版本号;一个版本中,这些部分对应如下的格式:
<major version>.<minor version>.<incremental version>-<qualifier>
Maven提供了三个隐式的变量,可以用来访问环境变量,POM信息,和Maven Settings.
env
变量:暴露了你操作系统或者shell的环境变量
project
变量暴露了POM。
settings
变量暴露了Maven settings信息。
除了这三个隐式的变量,你还可以引用系统属性,以及任何在Maven POM中和构建profile中自定义的属性组
自定义属性:
<properties>
<foo>bar</foo>
</properties>
超级POM
所有的Maven项目的POM都扩展自超级POM。你可以在${M2_HOME}/lib
中的maven-2.0.9-uber.jar
文件中找到pom-4.0.0.xml
。
超级pom:
<project>
<modelVersion>4.0.0</modelVersion>
<name>Maven Default Project</name>
<repositories>
<repository>
<id>central</id>
<name>Maven Repository Switchboard</name>
<layout>default</layout>
<url>http://repo1.maven.org/maven2</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Maven Plugin Repository</name>
<url>http://repo1.maven.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>
<build>
<directory>target</directory>
<outputDirectory>target/classes</outputDirectory>
<finalName>content-zh-0.5</finalName>
<testOutputDirectory>target/test-classes</testOutputDirectory>
<sourceDirectory>src/main/java</sourceDirectory>
<scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>src/test/java</testSourceDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/resources</directory>
</testResource>
</testResources>
</build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.1</version>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-1</version>
</plugin>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>2.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.0</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.3</version>
</plugin>
<plugin>
<artifactId>maven-ear-plugin</artifactId>
<version>2.3.1</version>
</plugin>
<plugin>
<artifactId>maven-ejb-plugin</artifactId>
<version>2.1</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.2</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
</plugin>
<plugin>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.4</version>
</plugin>
<plugin>
<artifactId>maven-plugin-plugin</artifactId>
<version>2.3</version>
</plugin>
<plugin>
<artifactId>maven-rar-plugin</artifactId>
<version>2.2</version>
</plugin>
<plugin>
<artifactId>maven-release-plugin</artifactId>
<version>2.0-beta-7</version>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.2</version>
</plugin>
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>2.0-beta-6</version>
</plugin>
<plugin>
<artifactId>maven-source-plugin</artifactId>
<version>2.0.4</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.4.2</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.1-alpha-1</version>
</plugin>
</plugins>
</pluginManagement>
<reporting>
<outputDirectory>target/site</outputDirectory>
</reporting>
</project>
1).默认的超级POM定义了一个单独的远程Maven仓库,ID为central,这是所有Maven客户端默认配置访问的中央Maven仓库;该配置可以通过一个自定义的settings.xml
文件来覆盖,注意这个默认的超级POM关闭了从中央Maven仓库下载snapshot构件的功能。如果你需要使用一个snapshot仓库,你就要在你的pom.xml
或者settings.xml
中自定义仓库设置.
2)build
元素设置Maven标准目录布局中那些目录的默认值.
3)POM中定义的groupId
,artifactId
和version
:这三项是所有项目都需要的坐标
groupId
一个groupId
归类了一组相关的构件。组定义符基本上类似于一个Java包名。例如:groupId
org.apache.maven
是所有由Apache Maven项目生成的构件的基本groupId。组定义符在Maven仓库中被翻译成路径,例如,groupId
org.apache.maven
可以在repo1.maven.org的/maven2/org/apache/maven
目录下找到。
artifactId
artifactId
是项目的主要定义符。当你生成一个构件,这个构件将由artifactId
命名。当你引用一个项目,你就需要使用artifactId
来引用它。artifactId
和groupId
的组合必须是唯一的。换句话说,你不能有两个不同的项目拥有同样的artifactId
和groupId
;在某个特定的groupId
下,artifactId
也必须是唯一的。
version
当一个构件发布的时候,它是使用一个版本号发布的。该版本号是一个数字定义符如“1.0”,“1.1.1”,或“1.1.2-alpha-01”。你也可以使用所谓的快照(snapshot)版本。一个快照版是一个处于开发过程中的组件的版本,快照版本号通常以SNAPSHOT结尾;如,“1.0-SNAPSHOT”,“1.1.1-SNAPSHOT”,和“1-SNAPSHOT”。Section 9.3.1, “项目版本”介绍了版本和版本界限。