- 浏览: 319247 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (221)
- J2SE心得 (4)
- 经典帖子 (8)
- 亲身经历 (9)
- SSH框架 (12)
- 数据库 (10)
- java基础知识 (41)
- java解惑 (17)
- 软件测试 (0)
- JSP (6)
- JavaScript (8)
- jQuery学习 (12)
- 硬件知识 (1)
- 工具类 (14)
- 面试专题 (4)
- Struts2专题(学习) (14)
- Spring源码分析专题(学习) (15)
- JavaScript专题(学习) (8)
- ExtJs专题(学习) (6)
- Java Web快速入门——全十讲 (10)
- web前台 (1)
- J2ME手机方面 (1)
- 积累整理 (1)
- MyEclipse工具篇 (10)
- oracle (1)
- Android基础 (1)
最新评论
-
youjianbo_han_87:
上传成功后,无法跳转到success页面,会报2038和404 ...
Struts2使用FlashFileUpload.swf实现批量文件上传 -
showzh:
...
MyEclipse 怎么安装SVN插件 -
wpf523:
赞一个啊,楼主加油
一些比较复杂的运算符(二) -
独步天下:
request.getSession().getAttribute() 和request.getSession().setAttribute() -
HelloJava1234:
thank you
怎么改变MyEclipse默认的jsp打开方式
O/R工具出现之后,简化了许多复杂的信息持久化的开发。Spring应用开发者可以通过Spring提供的O/R方案更方便的使用各种持久化工具,比如Hibernate;下面我们就Spring+Hibernate中的Spring实现做一个简单的剖析。
Spring对Hinberanate的配置是通过LocalSessionFactoryBean来完成的,这是一个工厂Bean的实现,在基类AbstractSessionFactoryBean中:
- /**
- * 这是FactoryBean需要实现的接口方法,直接取得当前的sessionFactory的值
- */
- public Object getObject() {
- return this.sessionFactory;
- }
/** * 这是FactoryBean需要实现的接口方法,直接取得当前的sessionFactory的值 */ public Object getObject() { return this.sessionFactory; }
这个值在afterPropertySet中定义:
- public void afterPropertiesSet() throws Exception {
- //这个buildSessionFactory是通过配置信息得到SessionFactory的地方
- SessionFactory rawSf = buildSessionFactory();
- //这里使用了Proxy方法插入对getCurrentSession的拦截,得到和事务相关的session
- this.sessionFactory = wrapSessionFactoryIfNecessary(rawSf);
- }
public void afterPropertiesSet() throws Exception { //这个buildSessionFactory是通过配置信息得到SessionFactory的地方 SessionFactory rawSf = buildSessionFactory(); //这里使用了Proxy方法插入对getCurrentSession的拦截,得到和事务相关的session this.sessionFactory = wrapSessionFactoryIfNecessary(rawSf); }
我们先看看SessionFactory是怎样创建的,这个方法很长,包含了创建Hibernate的SessionFactory的详尽步骤:
- protected SessionFactory buildSessionFactory() throws Exception {
- SessionFactory sf = null;
- // Create Configuration instance.
- Configuration config = newConfiguration();
- //这里配置数据源,事务管理器,LobHander到Holder中,这个Holder是一个ThreadLocal变量,这样这些资源就和线程绑定了
- if (this.dataSource != null) {
- // Make given DataSource available for SessionFactory configuration.
- configTimeDataSourceHolder.set(this.dataSource);
- }
- if (this.jtaTransactionManager != null) {
- // Make Spring-provided JTA TransactionManager available.
- configTimeTransactionManagerHolder.set(this.jtaTransactionManager);
- }
- if (this.lobHandler != null) {
- // Make given LobHandler available for SessionFactory configuration.
- // Do early because because mapping resource might refer to custom types.
- configTimeLobHandlerHolder.set(this.lobHandler);
- }
- //这里是使用Hibernate的各个属性的配置,这里使用了Configuration类来抽象这些数据
- try {
- // Set connection release mode "on_close" as default.
- // This was the case for Hibernate 3.0; Hibernate 3.1 changed
- // it to "auto" (i.e. "after_statement" or "after_transaction").
- // However, for Spring's resource management (in particular for
- // HibernateTransactionManager), "on_close" is the better default.
- config.setProperty(Environment.RELEASE_CONNECTIONS, ConnectionReleaseMode.ON_CLOSE.toString());
- if (!isExposeTransactionAwareSessionFactory()) {
- // Not exposing a SessionFactory proxy with transaction-aware
- // getCurrentSession() method -> set Hibernate 3.1 CurrentSessionContext
- // implementation instead, providing the Spring-managed Session that way.
- // Can be overridden by a custom value for corresponding Hibernate property.
- config.setProperty(Environment.CURRENT_SESSION_CONTEXT_CLASS,
- "org.springframework.orm.hibernate3.SpringSessionContext");
- }
- if (this.entityInterceptor != null) {
- // Set given entity interceptor at SessionFactory level.
- config.setInterceptor(this.entityInterceptor);
- }
- if (this.namingStrategy != null) {
- // Pass given naming strategy to Hibernate Configuration.
- config.setNamingStrategy(this.namingStrategy);
- }
- if (this.typeDefinitions != null) {
- // Register specified Hibernate type definitions.
- Mappings mappings = config.createMappings();
- for (int i = 0; i < this.typeDefinitions.length; i++) {
- TypeDefinitionBean typeDef = this.typeDefinitions[i];
- mappings.addTypeDef(typeDef.getTypeName(), typeDef.getTypeClass(), typeDef.getParameters());
- }
- }
- if (this.filterDefinitions != null) {
- // Register specified Hibernate FilterDefinitions.
- for (int i = 0; i < this.filterDefinitions.length; i++) {
- config.addFilterDefinition(this.filterDefinitions[i]);
- }
- }
- if (this.configLocations != null) {
- for (int i = 0; i < this.configLocations.length; i++) {
- // Load Hibernate configuration from given location.
- config.configure(this.configLocations[i].getURL());
- }
- }
- if (this.hibernateProperties != null) {
- // Add given Hibernate properties to Configuration.
- config.addProperties(this.hibernateProperties);
- }
- if (this.dataSource != null) {
- boolean actuallyTransactionAware =
- (this.useTransactionAwareDataSource || this.dataSource instanceof TransactionAwareDataSourceProxy);
- // Set Spring-provided DataSource as Hibernate ConnectionProvider.
- config.setProperty(Environment.CONNECTION_PROVIDER,
- actuallyTransactionAware ?
- TransactionAwareDataSourceConnectionProvider.class.getName() :
- LocalDataSourceConnectionProvider.class.getName());
- }
- if (this.jtaTransactionManager != null) {
- // Set Spring-provided JTA TransactionManager as Hibernate property.
- config.setProperty(
- Environment.TRANSACTION_MANAGER_STRATEGY, LocalTransactionManagerLookup.class.getName());
- }
- if (this.mappingLocations != null) {
- // Register given Hibernate mapping definitions, contained in resource files.
- for (int i = 0; i < this.mappingLocations.length; i++) {
- config.addInputStream(this.mappingLocations[i].getInputStream());
- }
- }
- if (this.cacheableMappingLocations != null) {
- // Register given cacheable Hibernate mapping definitions, read from the file system.
- for (int i = 0; i < this.cacheableMappingLocations.length; i++) {
- config.addCacheableFile(this.cacheableMappingLocations[i].getFile());
- }
- }
- if (this.mappingJarLocations != null) {
- // Register given Hibernate mapping definitions, contained in jar files.
- for (int i = 0; i < this.mappingJarLocations.length; i++) {
- Resource resource = this.mappingJarLocations[i];
- config.addJar(resource.getFile());
- }
- }
- if (this.mappingDirectoryLocations != null) {
- // Register all Hibernate mapping definitions in the given directories.
- for (int i = 0; i < this.mappingDirectoryLocations.length; i++) {
- File file = this.mappingDirectoryLocations[i].getFile();
- if (!file.isDirectory()) {
- throw new IllegalArgumentException(
- "Mapping directory location [" + this.mappingDirectoryLocations[i] +
- "] does not denote a directory");
- }
- config.addDirectory(file);
- }
- }
- if (this.entityCacheStrategies != null) {
- // Register cache strategies for mapped entities.
- for (Enumeration classNames = this.entityCacheStrategies.propertyNames(); classNames.hasMoreElements();) {
- String className = (String) classNames.nextElement();
- String[] strategyAndRegion =
- StringUtils.commaDelimitedListToStringArray(this.entityCacheStrategies.getProperty(className));
- if (strategyAndRegion.length > 1) {
- config.setCacheConcurrencyStrategy(className, strategyAndRegion[0], strategyAndRegion[1]);
- }
- else if (strategyAndRegion.length > 0) {
- config.setCacheConcurrencyStrategy(className, strategyAndRegion[0]);
- }
- }
- }
- if (this.collectionCacheStrategies != null) {
- // Register cache strategies for mapped collections.
- for (Enumeration collRoles = this.collectionCacheStrategies.propertyNames(); collRoles.hasMoreElements();) {
- String collRole = (String) collRoles.nextElement();
- String[] strategyAndRegion =
- StringUtils.commaDelimitedListToStringArray(this.collectionCacheStrategies.getProperty(collRole));
- if (strategyAndRegion.length > 1) {
- config.setCollectionCacheConcurrencyStrategy(collRole, strategyAndRegion[0], strategyAndRegion[1]);
- }
- else if (strategyAndRegion.length > 0) {
- config.setCollectionCacheConcurrencyStrategy(collRole, strategyAndRegion[0]);
- }
- }
- }
- if (this.eventListeners != null) {
- // Register specified Hibernate event listeners.
- for (Iterator it = this.eventListeners.entrySet().iterator(); it.hasNext();) {
- Map.Entry entry = (Map.Entry) it.next();
- Assert.isTrue(entry.getKey() instanceof String, "Event listener key needs to be of type String");
- String listenerType = (String) entry.getKey();
- Object listenerObject = entry.getValue();
- if (listenerObject instanceof Collection) {
- Collection listeners = (Collection) listenerObject;
- EventListeners listenerRegistry = config.getEventListeners();
- Object[] listenerArray =
- (Object[]) Array.newInstance(listenerRegistry.getListenerClassFor(listenerType), listeners.size());
- listenerArray = listeners.toArray(listenerArray);
- config.setListeners(listenerType, listenerArray);
- }
- else {
- config.setListener(listenerType, listenerObject);
- }
- }
- }
- // Perform custom post-processing in subclasses.
- postProcessConfiguration(config);
- // 这里是根据Configuration配置创建SessionFactory的地方
- logger.info("Building new Hibernate SessionFactory");
- this.configuration = config;
- sf = newSessionFactory(config);
- }
- //最后把和线程绑定的资源清空
- finally {
- if (this.dataSource != null) {
- // Reset DataSource holder.
- configTimeDataSourceHolder.set(null);
- }
- if (this.jtaTransactionManager != null) {
- // Reset TransactionManager holder.
- configTimeTransactionManagerHolder.set(null);
- }
- if (this.lobHandler != null) {
- // Reset LobHandler holder.
- configTimeLobHandlerHolder.set(null);
- }
- }
- // Execute schema update if requested.
- if (this.schemaUpdate) {
- updateDatabaseSchema();
- }
- return sf;
- }
protected SessionFactory buildSessionFactory() throws Exception { SessionFactory sf = null; // Create Configuration instance. Configuration config = newConfiguration(); //这里配置数据源,事务管理器,LobHander到Holder中,这个Holder是一个ThreadLocal变量,这样这些资源就和线程绑定了 if (this.dataSource != null) { // Make given DataSource available for SessionFactory configuration. configTimeDataSourceHolder.set(this.dataSource); } if (this.jtaTransactionManager != null) { // Make Spring-provided JTA TransactionManager available. configTimeTransactionManagerHolder.set(this.jtaTransactionManager); } if (this.lobHandler != null) { // Make given LobHandler available for SessionFactory configuration. // Do early because because mapping resource might refer to custom types. configTimeLobHandlerHolder.set(this.lobHandler); } //这里是使用Hibernate的各个属性的配置,这里使用了Configuration类来抽象这些数据 try { // Set connection release mode "on_close" as default. // This was the case for Hibernate 3.0; Hibernate 3.1 changed // it to "auto" (i.e. "after_statement" or "after_transaction"). // However, for Spring's resource management (in particular for // HibernateTransactionManager), "on_close" is the better default. config.setProperty(Environment.RELEASE_CONNECTIONS, ConnectionReleaseMode.ON_CLOSE.toString()); if (!isExposeTransactionAwareSessionFactory()) { // Not exposing a SessionFactory proxy with transaction-aware // getCurrentSession() method -> set Hibernate 3.1 CurrentSessionContext // implementation instead, providing the Spring-managed Session that way. // Can be overridden by a custom value for corresponding Hibernate property. config.setProperty(Environment.CURRENT_SESSION_CONTEXT_CLASS, "org.springframework.orm.hibernate3.SpringSessionContext"); } if (this.entityInterceptor != null) { // Set given entity interceptor at SessionFactory level. config.setInterceptor(this.entityInterceptor); } if (this.namingStrategy != null) { // Pass given naming strategy to Hibernate Configuration. config.setNamingStrategy(this.namingStrategy); } if (this.typeDefinitions != null) { // Register specified Hibernate type definitions. Mappings mappings = config.createMappings(); for (int i = 0; i < this.typeDefinitions.length; i++) { TypeDefinitionBean typeDef = this.typeDefinitions[i]; mappings.addTypeDef(typeDef.getTypeName(), typeDef.getTypeClass(), typeDef.getParameters()); } } if (this.filterDefinitions != null) { // Register specified Hibernate FilterDefinitions. for (int i = 0; i < this.filterDefinitions.length; i++) { config.addFilterDefinition(this.filterDefinitions[i]); } } if (this.configLocations != null) { for (int i = 0; i < this.configLocations.length; i++) { // Load Hibernate configuration from given location. config.configure(this.configLocations[i].getURL()); } } if (this.hibernateProperties != null) { // Add given Hibernate properties to Configuration. config.addProperties(this.hibernateProperties); } if (this.dataSource != null) { boolean actuallyTransactionAware = (this.useTransactionAwareDataSource || this.dataSource instanceof TransactionAwareDataSourceProxy); // Set Spring-provided DataSource as Hibernate ConnectionProvider. config.setProperty(Environment.CONNECTION_PROVIDER, actuallyTransactionAware ? TransactionAwareDataSourceConnectionProvider.class.getName() : LocalDataSourceConnectionProvider.class.getName()); } if (this.jtaTransactionManager != null) { // Set Spring-provided JTA TransactionManager as Hibernate property. config.setProperty( Environment.TRANSACTION_MANAGER_STRATEGY, LocalTransactionManagerLookup.class.getName()); } if (this.mappingLocations != null) { // Register given Hibernate mapping definitions, contained in resource files. for (int i = 0; i < this.mappingLocations.length; i++) { config.addInputStream(this.mappingLocations[i].getInputStream()); } } if (this.cacheableMappingLocations != null) { // Register given cacheable Hibernate mapping definitions, read from the file system. for (int i = 0; i < this.cacheableMappingLocations.length; i++) { config.addCacheableFile(this.cacheableMappingLocations[i].getFile()); } } if (this.mappingJarLocations != null) { // Register given Hibernate mapping definitions, contained in jar files. for (int i = 0; i < this.mappingJarLocations.length; i++) { Resource resource = this.mappingJarLocations[i]; config.addJar(resource.getFile()); } } if (this.mappingDirectoryLocations != null) { // Register all Hibernate mapping definitions in the given directories. for (int i = 0; i < this.mappingDirectoryLocations.length; i++) { File file = this.mappingDirectoryLocations[i].getFile(); if (!file.isDirectory()) { throw new IllegalArgumentException( "Mapping directory location [" + this.mappingDirectoryLocations[i] + "] does not denote a directory"); } config.addDirectory(file); } } if (this.entityCacheStrategies != null) { // Register cache strategies for mapped entities. for (Enumeration classNames = this.entityCacheStrategies.propertyNames(); classNames.hasMoreElements();) { String className = (String) classNames.nextElement(); String[] strategyAndRegion = StringUtils.commaDelimitedListToStringArray(this.entityCacheStrategies.getProperty(className)); if (strategyAndRegion.length > 1) { config.setCacheConcurrencyStrategy(className, strategyAndRegion[0], strategyAndRegion[1]); } else if (strategyAndRegion.length > 0) { config.setCacheConcurrencyStrategy(className, strategyAndRegion[0]); } } } if (this.collectionCacheStrategies != null) { // Register cache strategies for mapped collections. for (Enumeration collRoles = this.collectionCacheStrategies.propertyNames(); collRoles.hasMoreElements();) { String collRole = (String) collRoles.nextElement(); String[] strategyAndRegion = StringUtils.commaDelimitedListToStringArray(this.collectionCacheStrategies.getProperty(collRole)); if (strategyAndRegion.length > 1) { config.setCollectionCacheConcurrencyStrategy(collRole, strategyAndRegion[0], strategyAndRegion[1]); } else if (strategyAndRegion.length > 0) { config.setCollectionCacheConcurrencyStrategy(collRole, strategyAndRegion[0]); } } } if (this.eventListeners != null) { // Register specified Hibernate event listeners. for (Iterator it = this.eventListeners.entrySet().iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry) it.next(); Assert.isTrue(entry.getKey() instanceof String, "Event listener key needs to be of type String"); String listenerType = (String) entry.getKey(); Object listenerObject = entry.getValue(); if (listenerObject instanceof Collection) { Collection listeners = (Collection) listenerObject; EventListeners listenerRegistry = config.getEventListeners(); Object[] listenerArray = (Object[]) Array.newInstance(listenerRegistry.getListenerClassFor(listenerType), listeners.size()); listenerArray = listeners.toArray(listenerArray); config.setListeners(listenerType, listenerArray); } else { config.setListener(listenerType, listenerObject); } } } // Perform custom post-processing in subclasses. postProcessConfiguration(config); // 这里是根据Configuration配置创建SessionFactory的地方 logger.info("Building new Hibernate SessionFactory"); this.configuration = config; sf = newSessionFactory(config); } //最后把和线程绑定的资源清空 finally { if (this.dataSource != null) { // Reset DataSource holder. configTimeDataSourceHolder.set(null); } if (this.jtaTransactionManager != null) { // Reset TransactionManager holder. configTimeTransactionManagerHolder.set(null); } if (this.lobHandler != null) { // Reset LobHandler holder. configTimeLobHandlerHolder.set(null); } } // Execute schema update if requested. if (this.schemaUpdate) { updateDatabaseSchema(); } return sf; }
而直接调用org.hibernate.cfg.Configuration来得到需要的SessionFactory:
- protected SessionFactory newSessionFactory(Configuration config) throws HibernateException {
- return config.buildSessionFactory();
- }
protected SessionFactory newSessionFactory(Configuration config) throws HibernateException { return config.buildSessionFactory(); }
所以我们这里看到LocalSessionFactory大致起到的一个读取资源配置然后生成SessionFactory的作用;当然这里在得到 SessionFactory之后,还需要对session的事务管理作一些处理 - 使用了一个Proxy模式对getCurrentSession方法进行了拦截;
- //这里先根据当前的SessionFactory的类型得到Proxy,然后插入Spring定义好的getCurrentSession拦截器
- protected SessionFactory getTransactionAwareSessionFactoryProxy(SessionFactory target) {
- Class sfInterface = SessionFactory.class;
- if (target instanceof SessionFactoryImplementor) {
- sfInterface = SessionFactoryImplementor.class;
- }
- return (SessionFactory) Proxy.newProxyInstance(sfInterface.getClassLoader(),
- new Class[] {sfInterface}, new TransactionAwareInvocationHandler(target));
- }
//这里先根据当前的SessionFactory的类型得到Proxy,然后插入Spring定义好的getCurrentSession拦截器 protected SessionFactory getTransactionAwareSessionFactoryProxy(SessionFactory target) { Class sfInterface = SessionFactory.class; if (target instanceof SessionFactoryImplementor) { sfInterface = SessionFactoryImplementor.class; } return (SessionFactory) Proxy.newProxyInstance(sfInterface.getClassLoader(), new Class[] {sfInterface}, new TransactionAwareInvocationHandler(target)); }
拦截器的实现如下:
- private static class TransactionAwareInvocationHandler implements InvocationHandler {
- private final SessionFactory target;
- public TransactionAwareInvocationHandler(SessionFactory target) {
- this.target = target;
- }
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- // Invocation on SessionFactory/SessionFactoryImplementor interface coming in...
- // 这里对getCurrentSession方法进行拦截,得到一个和当前事务绑定的session交给用户
- if (method.getName().equals("getCurrentSession")) {
- // Handle getCurrentSession method: return transactional Session, if any.
- try {
- return SessionFactoryUtils.doGetSession((SessionFactory) proxy, false);
- }
- catch (IllegalStateException ex) {
- throw new HibernateException(ex.getMessage());
- }
- }
- else if (method.getName().equals("equals")) {
- // Only consider equal when proxies are identical.
- return (proxy == args[0] ? Boolean.TRUE : Boolean.FALSE);
- }
- else if (method.getName().equals("hashCode")) {
- // Use hashCode of SessionFactory proxy.
- return new Integer(hashCode());
- }
- // 这里是需要运行的SessionFactory的目标方法
- try {
- return method.invoke(this.target, args);
- }
- catch (InvocationTargetException ex) {
- throw ex.getTargetException();
- }
- }
- }
private static class TransactionAwareInvocationHandler implements InvocationHandler { private final SessionFactory target; public TransactionAwareInvocationHandler(SessionFactory target) { this.target = target; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // Invocation on SessionFactory/SessionFactoryImplementor interface coming in... // 这里对getCurrentSession方法进行拦截,得到一个和当前事务绑定的session交给用户 if (method.getName().equals("getCurrentSession")) { // Handle getCurrentSession method: return transactional Session, if any. try { return SessionFactoryUtils.doGetSession((SessionFactory) proxy, false); } catch (IllegalStateException ex) { throw new HibernateException(ex.getMessage()); } } else if (method.getName().equals("equals")) { // Only consider equal when proxies are identical. return (proxy == args[0] ? Boolean.TRUE : Boolean.FALSE); } else if (method.getName().equals("hashCode")) { // Use hashCode of SessionFactory proxy. return new Integer(hashCode()); } // 这里是需要运行的SessionFactory的目标方法 try { return method.invoke(this.target, args); } catch (InvocationTargetException ex) { throw ex.getTargetException();发表评论
-
Spring源代码解析(十):Spring Acegi框架授权的实现
2009-12-01 11:05 1334我们从FilterSecurityIntercep ... -
Spring源代码解析(九):Spring Acegi框架鉴权的实现
2009-12-01 11:04 1176简单分析一下Spring Acegi的源代码实现: Servl ... -
Hessian源码分析和Hack --让Hessian携带远程调用端的信息
2009-12-01 11:02 2337项目选定Hessian作为web se ... -
Spring源代码解析(七):Spring AOP中对拦截器调用的实现
2009-12-01 11:01 929前面我们分析了Spring AOP实现中得到Proxy对象的过 ... -
关于spring ioc容器的问题
2009-12-01 11:01 880在spring的源代码中,有org.springframewo ... -
Spring声明式事务管理源码解读之事务提交
2009-12-01 11:00 1054简介:上次说到spring声明式事务管理的事务开始部分,按流程 ... -
Spring源代码解析(六):Spring声明式事务处理
2009-12-01 11:00 1082我们看看Spring中的事务处理的代码,使用Spring管理事 ... -
Spring源代码解析(五):Spring AOP获取Proxy
2009-12-01 10:59 815下面我们来看看Spring的AOP的一些相关代码是怎么得到Pr ... -
Spring源代码解析(四):Spring MVC
2009-12-01 10:58 820下面我们对Spring MVC框架代码进行分析,对于webAp ... -
Spring声明式事务管理源码解读之事务开始
2009-12-01 10:57 707Spring声明式事务管理源码解读 简介:事务是所有企业应用系 ... -
Spring源代码解析(三):Spring JDBC
2009-12-01 10:56 1259下面我们看看Spring JDBC相关的实现, 在Spring ... -
Spring源代码解析(二):IoC容器在Web容器中的启动
2009-12-01 10:56 1132上面我们分析了IOC容器本身的实现,下面我们看看在典型的web ... -
Spring源代码解析(一):IOC容器
2009-12-01 10:55 1068在认真学习Rod.Johnson的 ... -
spring源码分析-XmlBeanFactory导读
2009-12-01 10:54 1718源代码分析,是一件既痛苦又快乐的事情,看别人写的代码是通过的, ...
相关推荐
Spring源代码解析1:IOC容器.doc ...Spring源代码解析8:Spring驱动Hibernate的实现.doc Spring源代码解析9:Spring Acegi框架鉴权的实现.doc Spring源代码解析10:Spring Acegi框架授权的实现.doc
Spring源代码解析7:Spring AOP中对拦截器调用的实现 Spring源代码解析8:Spring驱动Hibernate的实现;Spring源代码解析9:Spring Acegi框架鉴权的实现 Spring源代码解析10:Spring Acegi框架授权的实现
Spring源代码解析(一):IOC容器 ...Spring源代码解析(八):Spring驱动Hibernate的实现 Spring源代码解析(九):Spring Acegi框架鉴权的实现 Spring源代码解析(十):Spring Acegi框架授权的实现
总的来说,Spring通过`LocalSessionFactoryBean`实现对Hibernate的驱动,它将数据源、事务管理和配置信息集成在一起,创建出适应Spring管理的`SessionFactory`。这种集成方式使得开发者无需过多关注底层细节,可以...
pring源代码解析1:IOC容器;Spring源代码解析2:IoC容器在Web容器中的启动;Spring源代码解析3:... Spring源代码解析7:Spring AOP中对拦截器调用的实现 Spring源代码解析8:Spring驱动Hibernate的实现;Spring源代
6. **Spring与Hibernate集成**:"spring源代码解析(八):spring驱动Hibernate的实现.doc"探讨了Spring如何与ORM框架Hibernate协同工作,包括SessionFactory的创建、Session管理以及事务策略的配置。 7. **Spring ...
Spring源代码解析(一)Spring中的事务...Spring源代码解析(八):Spring驱动Hibernate的实现.doc Spring源代码解析(九):Spring Acegi框架鉴权的实现.doc Spring源代码解析(十):Spring Acegi框架授权的实现.doc
精通Java EE:Eclipse Struts2 Hibernate Spring整合应用案例代码和数据库压缩包6
《Spring源代码解析》 Spring框架作为Java领域最流行的开源框架之一,它的设计思想和实现方式一直是广大开发者关注的焦点。深入理解Spring的源代码,能够帮助我们更好地掌握其工作原理,提高我们的开发效率和代码...
JavaEE源代码 spring-hibernate3JavaEE源代码 spring-hibernate3JavaEE源代码 spring-hibernate3JavaEE源代码 spring-hibernate3JavaEE源代码 spring-hibernate3JavaEE源代码 spring-hibernate3JavaEE源代码 spring-...
收集的Java Web整合开发实战:基于Struts 2+Hibernate+Spring-源代码,看到其他人下载币要的太多,给大家分享一下。 不是很全,但可以拿来参考了。 由于大小限制,还有另外一个包······
这个“Spring+hibernate整合源代码”应该包含了实现上述整合步骤的示例代码,可以作为学习和参考的资源。通过学习和实践这些代码,你可以更好地理解和掌握 Spring 和 Hibernate 整合的细节,提升你的 Java Web 开发...
这个“Spring源代码解析”压缩包文件很可能是对Spring框架内部实现原理的详细分析,帮助开发者深入理解其工作机制。 在Spring框架中,依赖注入是核心概念之一,它允许开发者在运行时通过容器来管理对象的创建和依赖...
【hibernate和spring源代码】的分析与详解 Hibernate是一个强大的对象关系映射(ORM)框架,它在Java开发中被广泛使用,为开发者提供了便捷的数据持久化服务。3.3.2.GA版本是Hibernate的一个稳定版本,它包含了对...
源代码分析有助于深入理解Spring的工作原理,提升编程技能,并且能够帮助开发者在遇到问题时进行调试和优化。 1. **Spring IoC容器**: Spring的核心是IoC容器,它负责管理对象的生命周期和依赖关系。通过XML配置...
《精通Spring源代码》是罗时飞先生关于Spring框架深入解析的一部著作,旨在帮助开发者更深入地理解Spring的工作原理,提升对Java企业级应用开发的掌控能力。本压缩包包含的文件名为“精通Spring源码”,这通常是一个...
《Spring实战》第五版的源代码压缩包"spring实战全部源代码.zip"包含了全面的示例项目,旨在帮助读者深入理解和应用Spring框架。这个压缩包中的"spring-in-action-5-samples-master"目录揭示了书中的各个实战案例,...