Spring技术内幕(8)

2019-06-17 16:23

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 executeByNamedParam(Map paramMap, Map context) throws DataAccessException { 2. validateNamedParameters(paramMap); 3. //得到需要执行的SQL语句

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 rowMapper = newRowMapper(params, context); 10. //我们又看到了JdbcTemplate,这里使用JdbcTemplate来完成对数据库的查询操作,所以我们说JdbcTemplate是非常基本的操作类 11. return getJdbcTemplate().query(newPreparedStatementCreator(sqlToUse, params), rowMapper); 12.}

在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实现


Spring技术内幕(8).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:现代汉语讲义——(邢福义版教材)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: