随笔-67  评论-522  文章-0  trackbacks-0
    在上一章中详细分析了JAR包的选择,那么这次我将对例子中的一些必须的配置文件进行下说明。虽然这些配置在网上也很容易找到,但是很多都没有讲个因为所以出来,这样根本就得不到提高。在此,大象为各位详细分析一下这些内容。
    实例中涉及的配置文件有这么几个
    applicationContext.xml
    jdbc.properties
    log4j.properties
    struts.xml
    web.xml 
    我准备在本章中只讲applicationContext.xmljdbc.propertiesweb.xmllog4j的配置大同小异而且也不在本文范围。至于struts.xml我准备留到后面与Action代码一起来讲,因为用的是struts2-convention-plugin插件来实现struts2的注解,所以这两个结合起来讲要好一些。
    第二部分:分析配置文件
    1jdbc.properties
    本例采用MySQL数据库,所以我设置了一个属性文件,用来存放一些连接信息和Hibernate相关的设置。
    
    因为我们使用的是Hibernate来与数据库进行交互,把这些东西写在单独的文件里,是方便修改,如果你想换成SQL Server或是Oracle,只需要更改driverurl以及dialect,而且还可以自由控制sql语句的显示的开关,非常方便。至于写在这里怎么用呢?请接着看下面的applicationContext.xml说明。
    2applicationContext.xml
    这个文件就是spring的主配置文件了,当然,本例也只有这么一个spring的配置文件,内容不多,但做的工作还是很多的,下面我给大家详细分析一下。
    
    我把这两部分放在一起是因为这两者是相互联系的,而且也比较好说明。可以这样来理解,PropertyPlaceholderConfigurer这个类就是读取jdbc. properties文件,并将它们设置到这个类的属性中。然后再将下面数据源配置中定义的这些${jdbc.driver}${jdbc.url}字符串换成属性文件中相同名称的值。${}这种写法,是类里面方法解析用的,网上都说这是叫占位符,我看了源代码的,其实是把它们当成字符串截取前后的特殊字符,再根据里面定义的名称找属性文件中对应的值。所以这个类只能读取properties格式的文件,你如果还有其它需要加入的属性文件,可以在list之间加入,写在value标签里面。     
    
    根据base-package指定的路径,扫描其下所有包含注解的Bean,并自动注入。比如@Repository@Service这些都是注解,前者表示持久层,后者表示业务层。这可是非常非常好的一个功能,是从Spring2.5开始加入的一个非常棒的特性。有了它,我们将不用再去写那繁琐的<bean id="" class="" />。本文的主旨就是全注解,就是为了告诉大家不用写配置文件(当然不是绝对不写)来怎样进行开发工作。关于这部分的具体情况,在后面代码章节中会详细讲解。
    
    这就是在Spring中定义Hibernate相关的配置,Spring已经集成了这部分功能。通过class里面定义的类名称我们很容易就能理解,这是使用注解的方式映射实体以及创建Hiberante SessionFactory${hibernate.dialect}${hibernate.show_sql}和上面的数据源配置获取方式一样,当applicationContext.xml定义好之后,就不用再对它进行修改,而是将修改对象变成了jdbc.properties文件。
    另外在Spring2.5.6版中,加入了一个很有用的小功能,就是packagesToScan属性,它是根据value中定义的路径来扫描其下所有的注解实体类。大象对这个路径做了多种测试,另外又看了源代码,发现它只能匹配某一类型的路径,而不是所有路径。比如上面的value值表示,扫描entity包下面的所有包中的注解类,如果你将类直接放在entity包下,那么服务器启动和程序运行时都不会报错,但是当你的代码需要用到这个类的时候,就会出现异常,提示你找不到实体。
     
    
    这是事务定义,而且是使用注解方式定义事务@Transactional),proxy-target-class="true"表示采用动态代理类来管理事务,如果是false表示采用接口代理来管理事务(默认值为false)。什么意思呢?就是说对于需要加入事务处理的类,如果是实现接口,那么将采用Spring的默认事务管理(Spring默认方式为接口),如果不采用接口,而直接使用类,那么就需要cglib类库的支持,它通过动态的创建目标类(就是你需要加入事务的类)的子类,然后对这子类中的方法(当然是从目标类中继承来的)进行事务管理。这其实就是AOP切面,而且从中可以看出来,需要加入事务的方法不能为privatestaticfinal 的方法。这样说也不是很严格,说它不能加入事务,是说它不能主动的启动一个事务,如果某个private方法是被某个public方法调用的,而public方法是可以被动态代理加入事务的,所以这个private方法也一样被加入了事务,只是它处在public方法的事务之中。但是staticfinal这两类方法因为不能被子类覆盖,所以无法加入事务。如果这两类型的方法不被其它的事务方法所调用,那么它们就会以无事务的方式运行,因此很容易造成隐患,这一点请大家特别注意。
    
    上面这个就是使用配置式来定义事务,两种方式的区别主要是,注解式只用写那么一句话,然后在业务类或方法中加入@Transactional这个注解标记,就完成事务声明,不过对于每个业务类都需要在类或方法中加入这些标记。而配置式声明,就是不用加这些标记,只要你的方法名称命名比较统一,就可以像上面这样定义事务规范,然后在aop标签中定义切入点与执行通知就行了。我感觉如果业务逻辑不是太复杂的情况,配置式会比较简单,而且修改起来也方便,这两种方式我都写出来了,至于用哪一种,由你们自己决定。
    3web.xml
    现在使用的Servlet容器还是2.4版,因此web.xml里面还是需要写配置文件的,到了3.0版就可以采取注解的方式来实现了。
    
    Spring ApplicationContext配置文件的路径,可使用通配符applicationContext*.xml表示所有以applicationContext开头的xml文件。多个路径用,号分隔。比如可以这样写:
    
    不过推荐采用通配符的写法,能够简单点,为什么还要弄那么复杂呢?
    context-param是在容器启动后最先被执行的,并且被放入到容器上下文中。在这里引入spring的配置文件,是供SpringContextLoaderListener监听器使用。而这个监听器中会有一个ContextLoade类用来获取这个配置文件中的信息。从而进行Spring容器的初始化工作。因为是采用注解的方式来进行开发,所以spring的配置文件其实只有一个,上面那个星号可以去掉。
        
    这个监听器就是为了读取Spring的配置文件,这在上面已经讲到了。
    
    这是Spring提供的一个用来防止内存泄漏的监听器。在我们使用struts2框架,或其它的某些类库时,因为它们自身的设计,会用到Introspector(内省)机制来获取Bean对象的信息。但不幸的是,这些框架或类库在分析完一个类之后却没有将它从内存中清除掉,内存中还保留有大量的静态资源,而这些东西又无法进行垃圾回收,因此产生了很严重的内存泄漏问题。直接表现为服务器的内存使用会随着时间而不断上升,最后的结果当然就是服务器当掉。所以在这里加入此监听器,能够帮助我们更好的处理内存资源回收的问题。
    
    这是Spring的编码过滤器,我们可以直接拿来用,相信这段配置应该很好理解,不过请大家注意forceEncoding这个参数,把它设置为true表示不管请求中的编码是什么格式,都将强制采用encoding中设置的编码方式。另外对于响应也将按照encoding指定的编码进行设置。另外不建议将编码设置成gb2312或是gbk格式,请采用基于UnicodeUTF-8编码。
    
    这个过滤器是个好东西,有了它,我们在使用Hibernate延迟加载的时候,就不会再为因Session被关闭,导致延迟加载数据异常而头痛了。网上有很多人说这个不好,其实在使用中,效果还是不错的。
    
    首先我要说这个过滤器的名字很雷,不知道写这类的家伙是不是个变态,或者喜欢恶搞。主要原因就是,这个过滤器的功能是推迟清理值栈中的值,以便在web中进行访问,另外就是为了配合SiteMesh装饰器进行工作(官方中的说明)。如果不加这个,那么Struts2的默认过滤器就会清空值栈中的值,这样就会导致异常。所以说这类的名字和功能完全不搭边,很容易让人产生误解。
    
    2.1.6版本里面,已经用这个过滤器取代了以前的FilterDispatcher,而且在api文档中已经标注为@deprecated(不赞成),并说明是从Struts 2.1.3版开始就弃用这个过滤器了,改用StrutsPrepareAndExecuteFilter,除此之外,还可以选择StrutsPrepareFilterStrutsExecuteFilter。不过大象建议大家还是选择StrutsPrepareAndExecuteFilter吧,这也是官方推荐的。
    web.xml里面的几个重要的配置就这些,不过不要忘了,给这些filter加上filter-mapping映射。还有一点,请注意这些过滤器的顺序,这个顺序是很重要的,程序运行时,是根据这些filter-mapping的排列顺序依次执行过滤操作的。如果不想出现莫名其妙的错误,请控制好这些过滤器映射的顺序。
    我会在最后一章附上源码,大家就这样慢慢看吧。看到最后一章的时候,可能这些相关的知识就比较清楚了。到时再对照源码练习下,应该会有一些收获。恩,这部分就到此结束了,我们下次继续。
    
本文为菠萝大象原创,如要转载请注明出处。http://www.blogjava.net/bolo
posted on 2010-04-14 23:05 菠萝大象 阅读(15899) 评论(27)  编辑  收藏 所属分类: Struts2

评论:
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二)[未登录] 2010-04-15 20:45 | 菜鸟
非常好的文章,不过要是能有一个基本的crud操作最好了。
哈哈。。  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二) 2010-04-15 21:11 | 菠萝大象
@菜鸟
后面的代码部分会讲到,其实crud不是我写这篇系列的目的,我是想通过详细而全面的剖析,告诉大家这样做的道理。因为我在网上看到大部分说的整合,就是一大堆代码,连个注释都没有,更不用说自己的理解与总结了。再就是转帖别人的,看来看去其实是一样的。所以想写点有用的东西,给需要的人一点帮助。  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二) 2010-04-18 12:02 |
写的不错,希望出更好的博文  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二) 2010-04-18 12:30 | 菠萝大象
@唐
谢谢支持,第三篇正在写,请耐心等一下。  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二) 2010-04-19 20:04 | 三国阿海
好东西,我一直会关注你写的博客的  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二) 2010-04-19 22:55 | 三国阿海
你现在写的这个SSH2是我关注的重点。我天天来你空间跑个几趟。

我要第一时间看到你写的东西。  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二) 2010-04-20 08:38 | 菠萝大象
@三国阿海
呵呵,谢谢你支持,不过我不可能每天都更新,那会写死人滴,你一星期来看一下就可以了  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二) 2010-04-20 15:28 | keer
@菠萝大象
谢谢你提供的这一系列的文章,期待在后续的文章  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二)[未登录] 2010-04-20 21:57 | 三国阿海
今天我留校了啊,来了晚一点.

恩.我以后会一个礼拜来一次的.

这两个月比较忙,忙着背面试题.  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二) 2010-04-21 09:10 | 菜鸟徐
大象你好我是第一次来你这里我看你写的很好,但是Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(三)在那里呢?我怎么没看到呢谢谢你发布下可以吗?  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二) 2010-04-21 09:52 | 菠萝大象
@菜鸟徐
呵呵,还没发出来你肯定看不到了,恩,今天应该可以发布了。  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二) 2010-04-22 17:53 | Gavin.lee
大象的文章经典,学习对象~~~ 赞一个  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二) 2010-04-22 20:23 | 菠萝大象
@Gavin.lee
谢谢支持,希望能对你有所帮助。  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二)[未登录] 2010-05-07 20:53 | fw
请教下如果用jdbcdaosupport, 在注解里面用@Repository注解某一个dao,xml里面定义的dataSource bean要如何注入到这个dao里面呢? 排除在xml里面用default-autowire="byName"的方案  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二)[未登录] 2011-02-28 17:37 | bs
这样的博文,看完不赞,等待何时?  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二)[未登录] 2011-08-19 09:19 | 小宇
您好,我想看看您的这些配置文件,能否上传一下呢?  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二) 2011-08-19 09:21 | 菠萝大象
@小宇
第五篇有全部源代码,请顺序看完,再看代码,这对你有好处  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二)[未登录] 2011-08-19 15:21 | 小宇
@菠萝大象
多谢大侠,刚关注你的博客不久,还有很多需要我去学习,这个工程里面关于hibernate那里有好多不太理解,看你博客里说之前讲过一个关于这个的,正打算学习呢。太感谢你啦,希望能在这个SSH2的基础上做一个简单的注册登陆之类的功能就更好了。  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二) 2011-09-16 10:15 | dup
真的说的好详细,大象用心了,非常感谢!  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二)[未登录] 2012-01-31 11:41 | 小小鸟
您写的非常好,特别是对于我们这些菜鸟而言,更加增添了继续学习的信心!谢谢!但是按照你所写的,在程序调试的过程中总是报错,所以并麻烦您能把这个SSH2的源代码(加.jar)包的一并发我一下,我的邮箱:chenmin200396@163.com.  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二) 2012-02-01 16:55 | 菠萝大象
@小小鸟
第5篇有源码下载,jar包我也没有了,你去官方网站下这三个zip压缩包就可以都找到了  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二)[未登录] 2012-03-11 14:31 | QQ
我自己搭了一个框架:用Sping3.1.0 和hibernate 1.5.6 Model注解我写好了
package com.test.service;


import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.warrior.model.SySUser;

@Service("userService")
public class UserServiceImpl implements UserService {

@Autowired
private SessionFactory sessionFactory;
public boolean checkLogin(String userName, String password) {
if("warrior".equals(userName) && "123456".equals(password))
return true;
else
return false;
}

public void save(SySUser user) {
Session s = sessionFactory.openSession();
try{
Transaction t = s.beginTransaction();
t.begin();
s.save(user);
t.commit();
} catch(Exception e){
e.printStackTrace();
}finally{

s.close();
}

}
}

SessionFactory 的配置:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="namingStrategy">
<bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<property name="packagesToScan">
<list>
<value>com.test.model.SySUser</value>
</list>
</property>
</bean>

服务器启动没有错,但保存对象的时候就报错
org.hibernate.MappingException: Unknown entity

Email : sky402100@126.com

求指导  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二)[未登录] 2012-03-11 14:31 | QQ
刚写了,不好意思,是Hibernate 3.5.6  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二)[未登录] 2012-03-11 14:32 | QQ
import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;


@Entity
@Table(name="sys_user")
public class SySUser implements Serializable {

private static final long serialVersionUID = 2829671245902772318L;


private Long id;

private String loginName;

private String password;



@Id
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name="LOGIN_NAME")
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
@Column(name="PASSWORD")
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}

}  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二) 2012-04-27 14:56 |
对初学者很有帮助,是我看过最好的一系列的文章了,谢谢  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二) 2012-04-27 14:59 | 菠萝大象
@彬
谢谢支持  回复  更多评论
  
# re: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二)[未登录] 2012-04-28 13:42 | jason
大象QQ多少,望在线指教,加我QQ:532807107也可以,谢谢了。  回复  更多评论
  

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


网站导航: