SpringMVC3.1+Hibernate4.1.7完全基於註解配置(零配置檔案)
其實這篇文章應該是上篇《Servlet3.0下基於註解的SpringMVC3.1配置-完全零配置檔案》的續篇,因為上篇只介紹到web工程和Spring(包括MVC)的零配置,相對於傳統的SSH來說,相當於SS零配置了。那麼S和H的結合如果零配置檔案呢。
Hibernate的註解配置大家應該不會陌生。主要就是對實體類的配置,註明對應的表和欄位即可。
/**
* 使用者模型
*
* @author lihzh
* @alia OneCoder
* @blog http://www.coderli.com
*/
@Entity
@Table(name="snm_user")
public class User implements Serializable {
private static final long serialVersionUID = -6925982814013703984L;
@Id
private int id;
@Column(length = 20, nullable = false)
private String name;
@Column(length = 32, nullable = false)
private String password;
@Column(length = 64, nullable = false)
private String email ;
@Column(name = "ctime", length = 20, nullable = false)
private long createTime;
....
主要還是原有資料來源和SessionFactory的註解配置方式的改變。這裡利用Spring提供的註解方式,單獨抽出一個數據源配置類
/**
* 資料來源配置類
*
* @author lihzh
* @alia OneCoder
* @blog http://www.coderli.com
*/
@Configuration
@PropertySource("/conf/jdbc.properties")
public class DataSourceConfig {
@Value("${jdbc.driverClass}") String driverClass;
@Value("${jdbc.url}") String url;
@Value("${jdbc.user}") String user;
@Value("${jdbc.password}") String password;
@Bean
public DataSource dataSource() throws PropertyVetoException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass(driverClass);
dataSource.setJdbcUrl(url);
dataSource.setUser(user);
dataSource.setPassword(password);
return dataSource;
}
@Bean
public LocalSessionFactoryBean sessionFactory() throws PropertyVetoException {
LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource());
Properties hibernateProperties = new Properties();
hibernateProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
sessionFactoryBean.setHibernateProperties(hibernateProperties);
sessionFactoryBean.setPackagesToScan("com.coderli.shurnim.*.model");
return sessionFactoryBean;
}
@Bean
public HibernateTransactionManager txManager() throws PropertyVetoException {
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(sessionFactory().getObject());
return txManager;
}
}
配置了資料來源,SessionFactory和事物管理類。在SessionFactory中聲明瞭掃描實體註解的包路徑。這裡把資料來源的配置單獨提到了jdbc.properties這個配置檔案中,主要是考慮在實際實施過程中,資料庫連結是一個需要經常修改的項,所以提出在專案配置之外,以方便實施人員獨立配置。
然後在原有的DefaultAppConfig中引用該配置。用@Import註解:
@Configuration
@ComponentScan(basePackages = "com.coderli.shurnim.*.biz")
@Import(DataSourceConfig.class)
@EnableTransactionManagement
public class DefaultAppConfig {
同時啟用了事物註解。至此,Spring3.1+Hibernate4.1.7的配置基本完成了。啟動專案。稍微修改一下原UserAction,使其讀取資料庫
@RequestMapping("/user.do")
@Transactional
public void test(HttpServletResponse response) throws IOException {
_log.info("Hi, u guy");
List<User> users = userDAO.getAll();
response.getWriter().write("name: " + users.get(0).getName() + "; email: " + users.get(0).getEmail());
}
啟動服務,一切OK。
需要說明的是,OneCoder的學習習慣是不停的折騰,所以這裡雖然是配置好了,正常使用。但是在配置過程中,還是遇到一些沒有解決的問題。比如,根據@Configuration的註解說明,OneCoder曾響在DataSourceConfig中僅僅保留資料來源配置,將SessionFactory和事物的配置都放到AppConfig中,然後通過@Autowire或者@Inject的註解引用進來,用了兩種方式都還沒有成功。待OneCoder研究清楚後,再一一說明。這裡給出配置,僅僅給大家提供一個樣例參考。更多的細節,還需要大家自己研究:)。OneCoder感覺,這種配置方式,還有挺有意思的。