5. this.preparedStatementFactory.setUpdatableResults(isUpdatableResults());
6. this.preparedStatementFactory.setReturnGeneratedKeys(isReturnGeneratedKeys());
7. if (getGeneratedKeysColumnNames() != null) {
8. this.preparedStatementFactory.setGeneratedKeysColumnNames(getGeneratedKeysColumnNames()); 9. }
10.his.preparedStatementFactory.setNativeJdbcExtractor(getJdbcTemplate().getNativeJdbcExtractor()); 11. onCompileInternal(); 12.}
在执行查询时,执行的实际上是SqlQuery的executeByNamedParam方法,这个方法需要完成的工作包括配置SQL语句, 配置数据记录到数据对象的转换的RowMapper,然后使用JdbcTemplate来完成数据的查询,并启动数据记录到Java数据对象的转换,如以 下代码所示: Java代码
1. public List
4. ParsedSql parsedSql = getParsedSql();
5. MapSqlParameterSource paramSource = new MapSqlParameterSource(paramMap);
6. String sqlToUse = NamedParameterUtils.substituteNamedParameters(parsedSql, paramSource);
7. //配置好SQL语句需要的Parameters及rowMapper,这个rowMapper完成数据记录到对象的转换
8. Object[] params = NamedParameterUtils.buildValueArray(parsedSql, paramSource, getDeclaredParameters());
9. RowMapper
在Spring对JDBC的操作中,基本上是对JDBC/Hibernate基础上API的封装。这些封装可以直接使用,也可以在IoC容器中配 置好了再使用,当结合IoC容器的基础上进行使用的时候,可以看到许多和事务管理相关的处理部分,都是非常值得学习的,在那里,可以看到对数据源的管理 - Hibernate中session的管理,与线程的结合等等。
深入解析Spring架构与设计原理(四)Web MVC的实现
以前的欠账,现在补上,欢迎指正和讨论。
Spring Web MVC的实现
关于MVC,这是和WEB开发相关的部分,显然大家都是很熟悉了。从最初的JSP到struts,再到像wicket等等,真是百花齐放,百家争 鸣.在WEB UI上,这部分是做web应用架构选择不可缺少的一部分。而作为MVC框架,也许SPRING MVC不能算得上是表现力最出色的UI框架,但无疑,它的实现也是非常的优秀,同时,我们可以从它的实现上,看到一个非常清晰的MVC实现的过程,从这点 上看,真是非常的过瘾啊!
在了解IOC容器的基本实现的基础上,下面我们来看看,在典型的Web环境中,Spring IOC容器是如何在Web环境中被载入并起作用的。我们可以看到,对于MVC这部分,主要建立在IOC的基础上,AOP的特性应用得并不多。Spring 并不是天生就能在Web容器中起作用的,同样也需要一个启动过程,把自己的IOC容器导入,并在Web容器中建立起来。
与对IoC容器的初始化的分析一样,我们同样看到了loadBeanDefinition对BeanDefinition的载入。在Web环境 中,对定位BeanDefinition的Resource有特别的要求,对这个要求的处理体现在getDefaultConfigLocations方 法的处理中。可以看到,在这里,使用了默认的BeanDefinition的配置路径,这个路径在XmlWebApplicationContext中, 已经作为一个常量定义好了,这个常量就是/WEB-INF/applicationContext.xml。这里的loadBeanDefinition 实现如下所示: Java代码
1. public class XmlWebApplicationContext extends AbstractRefreshableWebApplicationContext { 2.
3. /** Default config location for the root context */ 4. //这里是设置缺省BeanDefinition的地方,在
/WEB-INF/applicationContext.xml文件里,如果不特殊指定其他文件,IoC容器会从这里读取BeanDefinition来初始化IoC容器
5. public static final String DEFAULT_CONFIG_LOCATION = \INF/applicationContext.xml\6.
7. /** Default prefix for building a config location for a namespace */
8. public static final String DEFAULT_CONFIG_LOCATION_PREFIX = \9.
10. /** Default suffix for building a config location for a namespace */
11. public static final String DEFAULT_CONFIG_LOCATION_SUFFIX = \
12. //我们又看到了熟悉的loadBeanDefinition,就像我们前面对IOC容器的分析一样,这个加载过程在容器refresh()时启动。
13. protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws IOException {
14. // Create a new XmlBeanDefinitionReader for the given BeanFactory.
15. // 对于XmlWebApplicationContext,当然是使用XmlBeanDefinitionReader来对BeanDefinition信息进行解析 16. XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory); 17.
18. // Configure the bean definition reader with this context's
19. // resource loading environment.
20. // 这里设置ResourceLoader,因为XmlWebApplicationContext是DefaultResource的子类,所以这里同样会使用DefaultResourceLoader来定位BeanDefinition 21. beanDefinitionReader.setResourceLoader(this); 22. beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this)); 23.
24. // Allow a subclass to provide custom initialization of the reader,
25. // then proceed with actually loading the bean definitions.
26. initBeanDefinitionReader(beanDefinitionReader); 27. //这里使用定义好的XmlBeanDefinitionReader来载入BeanDefinition
28. loadBeanDefinitions(beanDefinitionReader); 29. } 30. 31.
32. protected void initBeanDefinitionReader(XmlBeanDefinitionReader beanDefinitionReader) { 33. } 34. 35.
36. //如果有多个BeanDefinition的文件定义,需要逐个载入,都是通过reader来完成的,这个初始化过程是由refreshBeanFactory方法来完成的,这里只是负责载入BeanDefinition
37. protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws BeansException, IOException {
38. String[] configLocations = getConfigLocations(); 39. if (configLocations != null) {
40. for (String configLocation : configLocations) { 41. reader.loadBeanDefinitions(configLocation); 42. }
进入DispatcherServlet和MVC实现