1. 程式人生 > >SpringMVC3.1+Hibernate4.1.7完全基於註解配置(零配置檔案)

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感覺,這種配置方式,還有挺有意思的。