WEB2.0开发

心态决定行为,行为决定习惯,习惯决定命运

Spring 编程入门十大问题解答

1 、如何学习 Spring
  你可以通过下列途径学习 spring
   (1) spring 下载包中 doc 目录下的 MVC-step-by-step sample 目录下的例子都是比较好的 spring 开发的例子。
   (2) AppFuse 集成了目前最流行的几个开源轻量级框架或者工具 Ant,XDoclet,Spring,Hibernate(iBATIS),JUnit,Cactus,StrutsTestCase,Canoo's WebTest,Struts Menu,Display Tag Library,OSCache,JSTL,Struts
  你可以通过 AppFuse 源代码来学习 spring
AppFuse 网站: http://raibledesigns.com/wiki/Wiki.jsp?page=AppFuse
   (3)Spring 开发指南 ( 夏昕 ) http://www.xiaxin.net/Spring_Dev_Guide.rar
  一本 spring 的入门书籍 , 里面介绍了反转控制和依赖注射的概念,以及 spring bean 管理, spring MVC spring hibernte iBatis 的结合。
   (4) spring 学习的中文论坛
   SpringFramework 中文论坛 (http://spring.jactiongroup.net)
   Java 视线论坛 (http://forum.javaeye.com) spring 栏目
   2 、利用 Spring 框架编程, console 打印出 log4j:WARN Please initialize the log4j system properly
  说明你的 log4j.properties 没有配置。请把 log4j.properties 放到工程的 classpath 中, eclipse classpath bin 目录,由于编译后 src 目录下的文件会拷贝到 bin 目录下,所以你可以把 log4j.properties 放到 src 目录下。
  这里给出一个 log4j.properties 的例子:

log4j.rootLogger=DEBUG,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %5p (%F:%L) - %m%n

   3 、出现 java.lang.NoClassDefFoundError?
  一般情况下是由于你没有把必要的 jar 包放到 lib 中。
  比如你要采用 spring hibernate (带事务支持的话),你除了 spring.jar 外还需要 hibernat.jar aopalliance.jar cglig.jar jakarta-commons 下的几个 jar 包。
http://www.springframework.org/download.html 下载 spring 开发包,提供两种 zip
spring-framework-1.1.3-with-dependencies.zip spring-framework-1.1.3.zip ,我建议你下载 spring-framework-1.1.3-with-dependencies.zip 。这个 zip 解压缩后比后者多一个 lib 目录,其中有 hibernate j2ee dom4j aopalliance jakarta-commons 等常用包。
   4 java.io.FileNotFoundException: Could not open class path resource [....hbm.xml], 提示找不到 xml 文件?
  原因一般有两个:
   (1) xml 文件没有在 classpath 中。
   (2)applicationContext-hibernate.xml 中的 xml 名字没有带包名。比如:

bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean"
property name="dataSource" >< ref bean="dataSource"/ >< /property
property name="mappingResources"
 < list
  < value User.hbm.xml /value
  错,改为:
  < value com/yz/spring/domain/User.hbm.xml /value
 < /list
/property
property name="hibernateProperties"
props
 < prop key="hibernate.dialect" net.sf.hibernate.dialect.MySQLDialect /prop
 < prop key="hibernate.show_sql" true /prop
/props
/property
/bean

   5 org.springframework.beans.NotWritablePropertyException: Invalid property 'postDao' of bean class
  出现异常的原因是在 application-xxx.xml property name 的错误。
  < property name="...." name 的名字是与 bean set 方法相关的,而且要注意大小写。
  比如

public class PostManageImpl extends BaseManage implements PostManage {
  private PostDAO dao = null;
  public void setPostDAO(PostDAO postDAO){
   this.dao = postDAO;
  }
}

  那么 xml 的定义应该是:

bean id="postManage" parent="txProxyTemplate"
property name="target"
 < bean class="com.yz.spring.service.implement.PostManageImpl"
  < property name="postDAO" >< ref bean="postDAO"/ >< /property
  < property name="dao" >< ref bean="postDAO"/ >< /property
 < /bean
/property
/bean

   6 Spring 中如何实现事务管理?
  首先,如果使用 mysql ,确定 mysql InnoDB 类型。
  事务管理的控制应该放到商业逻辑层。你可以写个处理商业逻辑的 JavaBean ,在该 JavaBean 中调用 DAO ,然后把该 Bean 的方法纳入 spring 的事务管理。
  比如: xml 文件定义如下:

bean id="txProxyTemplate" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"

property name="transactionManager" >< ref bean="transactionManager"/ >< /property
property name="transactionAttributes"
props
prop key="save*" PROPAGATION_REQUIRED /prop
prop key="remove*" PROPAGATION_REQUIRED /prop
prop key="*" PROPAGATION_REQUIRED /prop
/props
/property
/bean

bean id="userManage" parent="txProxyTemplate"
 < property name="target"
  < bean class="com.yz.spring.service.implement.UserManageImpl"
   < property name="userDAO" >< ref bean="userDAO"/ >< /property
  < /bean
 < /property
/bean

   com.yz.spring.service.implement.UserManageImpl 就是我们的实现商业逻辑的 JavaBean 。我们通过 parent 元素声明其事务支持。
   7 、如何管理 Spring 框架下更多的 JavaBean
   JavaBean 越多, spring 配置文件就越大,这样不易维护。为了使配置清晰,我们可以将 JavaBean 分类管理,放在不同的配置文件中。 应用启动时将所有的 xml 同时加载。
  比如:
   DAO 层的 JavaBean 放到 applicationContext-hibernate.xml 中,商业逻辑层的 JavaBean 放到 applicationContext-service.xml 中。然后启动类中调用以下代码载入所有的 ApplicationContext

String[] paths = {"com/yz/spring/dao/hibernate/applicationContext-hibernate.xml",
"com/yz/spring/service/applicationContext-service.xml"};
ctx = new ClassPathXmlApplicationContext(paths);

   8 web 应用中如何加载 ApplicationContext
  可以通过定义 web.xml ,由 web 容器自动加载。

servlet
servlet-name context /servlet-name
servlet-class org.springframework.web.context.ContextLoaderServlet /servlet-class
load-on-startup 1 /load-on-startup
/servlet

context-param
param-name contextConfigLocation /param-name
param-value /WEB-INF/applicationContext-hibernate.xml /param-value
param-value /WEB-INF/applicationContext-service.xml /param-value
/context-param

   9 、在 spring 中如何配置的 log4j?
  在 web.xml 中加入以下代码即可。

context-param
param-name log4jConfigLocation /param-name
param-value /WEB-INF/log4j.properties /param-value
/context-param

   10 Spring 框架入门的编程问题解决了,我该如何更深地领会 Spring 框架呢?
  这两本书你该去看看。这两本书是由 Spring 的作者 Rod Johnson 编写的。

Expert One on one J2EE Design and Development
Expert One on one J2EE Development Without EJB

  你也该看看 martinfowler Inversion of Control Containers and the Dependency Injection pattern

http://www.martinfowler.com/articles/injection.html

  再好好研读一下 spring 的文档。

http://www.jactiongroup.net/reference/html/index.html (中文版,未全部翻译)

posted on 2006-04-05 12:29 ymx 阅读(266) 评论(0)  编辑  收藏 所属分类: Spring


只有注册用户登录后才能发表评论。


网站导航: