最近看了一下springside,学习很多,从思想到编码风格,这里再废话一下,思想这个东西蛮虚,但是并不是只可意会不可言传,一些东西你想明白了,能够给别人讲解,并且让他人听懂了,这才代表你的思想到了某个境界,当然这个是我这个阶段的认识,所谓万物不变的是变化,思想也一样,扯远了。
这个demo延续上次,算是我对上一个项目的一点个人改进。这里只是简单的改进,使用第一个demo的注解,体会一下注解在减少配置方面的作用。
1.数据库和表仍然使用demo2
2.实体类和demo2一样,更改一下包名。
3.接口类不变。
4.实现类使用注解
package com.isa.demo3.service;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.isa.demo3.domain.User;
@Service
//默认将类中的所有函数纳入事务管理.
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private SessionFactory sessionFactory;
@Override
@Transactional(readOnly = true)
public List<User> getAllUsers() {
Session session = sessionFactory.getCurrentSession();
String hql = "from User";
List<User> list = session.createQuery(hql).list();
return list;
}
@Override
@Transactional(readOnly = true)
public User getUserById(long id) {
Session session = sessionFactory.getCurrentSession();
User user = (User) session.get(User.class, id);
return user;
}
}
5.配置文件的变化比较大,第一个用application.properties保存数据库相关配置,这里参考springside
#h2 version database settings #jdbc.driver=org.h2.Driver #jdbc.url=jdbc:h2:tcp://localhost/~/mini-web #jdbc.username=sa #jdbc.password= #hibernate.dialect=org.hibernate.dialect.H2Dialect #oracle version database settings #jdbc.driver=oracle.jdbc.driver.OracleDriver #jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:XE #jdbc.username=miniweb #jdbc.password=miniweb #hibernate.dialect=org.hibernate.dialect.Oracle10gDialect #mysql version database setting jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=utf-8 jdbc.username=root jdbc.password=123456 hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect #hibernate settings hibernate.show_sql=true hibernate.format_sql=false hibernate.ehcache_config_file=/ehcache/ehcache-hibernate-local.xml
第二个applicationContext.xml如下
<?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:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd" default-lazy-init="true"> <description>Spring公共配置 </description> <!-- 定义受环境影响易变的变量 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> <property name="ignoreResourceNotFound" value="true" /> <property name="locations"> <list> <!-- 标准配置 --> <value>classpath*:demo3/application.properties</value> <!-- 集群中节点配置 --> <value>classpath*:demo3/application.cluster.properties</value> <!-- 本地开发环境配置 --> <value>classpath*:demo3/application.local.properties</value> <!-- 服务器生产环境配置 --> <!-- <value>file:/var/myapp/application.server.properties</value> --> </list> </property> </bean> <!-- 使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入 --> <context:component-scan base-package="com.isa.demo3" /> <!-- 数据源配置,使用应用内的DBCP数据库连接池 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <!-- Connection Info --> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <!-- Connection Pooling Info --> <property name="initialSize" value="5" /> <property name="maxActive" value="100" /> <property name="maxIdle" value="30" /> <property name="maxWait" value="1000" /> <property name="poolPreparedStatements" value="false" /> <property name="defaultAutoCommit" value="false" /> </bean> <!-- 数据源配置,使用应用服务器的数据库连接池 --> <!--<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/ExampleDB" />--> <!-- Hibernate配置 --> <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">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.format_sql">${hibernate.format_sql}</prop> <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider </prop> <prop key="hibernate.cache.provider_configuration_file_resource_path">${hibernate.ehcache_config_file}</prop> </props> </property> <property name="packagesToScan" value="com.isa.demo3.domain" /> </bean> <!-- 事务管理器配置,单数据源事务 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 使用annotation定义事务 --> <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" /> </beans>
6.简单测试
package com.isa.demo3.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.isa.demo3.service.UserService;
import com.isa.demo3.service.UserServiceImpl;
public class Demo3Test {
/**
* @param args
*/
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "demo3/*.xml" });
UserService service = (UserServiceImpl)context.getBean("userServiceImpl");
System.out.println(service.getUserById(1L).toString());
}
}
7.对应配置文件需要注意,sessionFactory节点的packagesToScan的写法,到domain的包即可,后面不需要加*号。