第二天:集成spring

来源:互联网 发布:隔壁老王淘宝 编辑:程序博客网 时间:2024/06/06 08:18

在spring中集成hibernate就不再需要使用hibernate的配置文件了,我理解,其实集成是spring 通过设置<bean/>来创建一个sessionFactory和事务管理器

 

jar包在昨天的基础上导了下面这些:

spring.jar
commons-pool.jar
commons-dbcp.jar
aspectjweaver.jar
aspectjrt.jar
cglib-nodep-2.1_3.jar
common-annotations.jar

 

创建一个beans.xml文件用于配置spring:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
 xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

 <context:component-scan base-package="bbs.domain.service.impl" />

 <context:property-placeholder location="classpath:jdbc.properties" />
 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
  destroy-method="close">
  <property name="driverClassName" value="${driverClassName}" />
  <property name="url" value="${url}" />
  <property name="username" value="${username}" />
  <property name="password" value="${password}" />
  <property name="initialSize" value="${initialSize}" />
  <property name="maxActive" value="${maxActive}" />
  <property name="maxIdle" value="${maxIdle}" />
  <property name="minIdle" value="${minIdle}" />
 </bean>
 <!--
  注意,使用注解配置hibernate的映射,要用下annotation那个类 <bean id="sessionFactory"
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
 -->
 <bean id="sessionFactory"
  class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="hibernateProperties">
   <value>
    hibernate.diacelt=org.hibernate.dialect.SQLServerDialect
    hibernate.hbm2ddl.auto=update
    hibernate.show_sql=true
    hibernate.format_sql=false
    hibernate.cache.use_second_level_cache
    =true
    hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
   </value>
  </property>
  <property name="packagesToScan">
   <list>
    <value>bbs.domain.bean</value>
   </list>


  </property>

 </bean>
 <bean id="txManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory"></property>
 </bean>

 <!-- Activates @Transactional for DefaultImageDatabase -->
 <tx:annotation-driven transaction-manager="txManager" />

 <context:annotation-config />

</beans>

配置文件里面数据源可以直接把相关配置写到xml,也可以使用jdbc.properties单独写,在XML里用${}引用.

 

其他的都没有什么说的,今天主要的精力在于,如何在配置文件中设置,让hibernate能够使用注解方式设置映射.手中的资料没有说到这个内容,都是通过配置映射文件进行的

 

开始,自己按猜测写,没用成功

然后上网找,可能是关键字不对,没找到有用的

接着,打开spring的源程序看,发现了三个成员变量: private Class[] annotatedClasses;

 private String[] annotatedPackages;

 private String[] packagesToScan;

不知道如何用,也不知道有没有用

再到网上找,关键字"spring hibernate 注解 映射",找到了,发现有设annotatedClasses的,照做,测试成功.由此知道其他两个成员变量的用法.并将其测试,annotatedPackages失败,packagesToScan成功.到网上找一下,发现annotatedPackages这个很多都说不能用,想过去很可能是BUG.

再回过头来看spring源码,大致了解了处理流程,spring用到hibernate里的类,本想看一下源码,但没下hibernate的源码就没看了.

 

另外:那个sessionFactory的class也是网上找到的,有了昨天的教训,很快就注意到使用不同的class了.

 

其他代码如下:

package bbs.domain.service.impl;

import java.util.List;

import javax.annotation.Resource;

import org.hibernate.SessionFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import bbs.domain.bean.User;
import bbs.domain.service.UserService;

@Service
@Transactional
public class UserServiceBean implements UserService {
 
 @Resource private SessionFactory sessionFactory;
 /* (non-Javadoc)
  * @see bbs.domain.service.impl.UserService#save(bbs.domain.bean.User)
  */
 public void save(User user){
  sessionFactory.getCurrentSession().persist(user);
 }
 /* (non-Javadoc)
  * @see bbs.domain.service.impl.UserService#update(bbs.domain.bean.User)
  */
 public void update(User user){
  sessionFactory.getCurrentSession().merge(user);
 }
 /* (non-Javadoc)
  * @see bbs.domain.service.impl.UserService#getUser(java.lang.Integer)
  */
 public User getUser(Integer id){
  return (User)sessionFactory.getCurrentSession().get(User.class,id);
 }
 /* (non-Javadoc)
  * @see bbs.domain.service.impl.UserService#delete(java.lang.Integer)
  */
 public void delete(Integer id){
  //也可以用get方法获得User对象,但load效率更高
  sessionFactory.getCurrentSession().delete(
    sessionFactory.getCurrentSession().load(User.class, id));
 }
 /* (non-Javadoc)
  * @see bbs.domain.service.impl.UserService#getUsers()
  */
 @SuppressWarnings("unchecked")
 public List<User> getUsers(){
  return sessionFactory.getCurrentSession().createQuery("from User").list();
  
 }
 /* (non-Javadoc)
  * @see bbs.domain.service.impl.UserService#setSessionFactory(org.hibernate.SessionFactory)
  */
 public void setSessionFactory(SessionFactory sessionFactory) {
  this.sessionFactory = sessionFactory;
 }
 /* (non-Javadoc)
  * @see bbs.domain.service.impl.UserService#getSessionFactory()
  */
 public SessionFactory getSessionFactory() {
  return sessionFactory;
 }

}
其中@Service是让spring扫描到这个bean,就不要在.xml里写了@Transcation是用注解的方式使用事务,就不用去关心事务处理了.

 

测试代码:

@Test
 public void SHtest(){
  ApplicationContext applicationContext= new ClassPathXmlApplicationContext("beans.xml");
  UserService userServiceBean = (UserService) applicationContext.getBean("userServiceBean");
  User user = new User();
  user.setUserId("id_three");
  user.setPassword("123456");
  user.setNickName("天使3");
  userServiceBean.save(user);
  System.out.println("新加用户id:"+user.getId());
  System.out.println("****************");
  for (User u:userServiceBean.getUsers()){
   System.out.println("用户id:"+u.getUserId()+","+"用户昵称:"+u.getNickName());
  }
 }

 

原创粉丝点击