[SSM]SSM 整合①(整合配置)
为了尽可能的到达复习的效果,即使有些知识点前文已经讲得很详细,但是这里还是会提几句!
步骤一:创建 Maven 的 web 项目
此处有一个注意点:IDEA 使用模板创建的 Maven 可能仓库以及 setting 文件的设置是错误的,记得覆盖成自己的路径!
步骤二:添加依赖
pom.xml 添加 SSM 所需要的依赖 jar 包
添加依赖的时候记得把使用模板创建的一些多余的插件和依赖可以去掉!
接下来我们对这些插件进行一个简单的介绍:
spring-webmvc 中包含了我们以前使用 Spring 基础框架时的依赖:spring-context
被选中的这三个依赖是 Spring 整合 Mybatis 的坐标
druid 是我们的数据源
junit 是我们的测试单元
javax-servlet 是做 SpringMVC 开发时 Web 容器要用的
jackson 用于 json 数据的转换
步骤三:创建项目包结构
config 目录存放的是相关的配置类
controller 编写的是 Controller 类
dao 存放的是 Dao 接口,因为使用的是 Mapper 接口代理方式,所以没有实现类包
service 存的是 Service 接口,impl 存放的是 Service 实现类
resources:存入的是配置文件,如 Jdbc.properties
webapp:目录可以存放静态资源
test/java:存放的是测试类
步骤四:创建各种配置类
首先我们创建 SpringConfig
注解翻译:
@Configuration 设置他为一个配置类
使用 @ComponentScan 用来加载它控制的那些 bean(我们这里使用精准扫描防止扫描到不属于他的 bean)
这里其实还有很多注解,我们按照思路来,毕竟我们创建项目的时候也不可能考虑到后面的情况,一次性的全部写完所有要用的注解
写到这里已经没有什么可以写了,我们接着写 Spring 整合 Mybatis 的那些东西了:
JdbcConfig
MyBatisConfig
jdbc.properties
在写之前我们现在 SpringConfig 里面把他们进行添加:
@PropertySource 用来加载一些属性(引入一些外部文件的属性,这里的外部文件就是 jdbc.properties)
@Import 用来加载 JdbcConfig、MyBatisConfig 这两个配置类
注意 @Import 的使用条件分很多种可以去自行了解,并不是所有的配置文件都可以使用 @Import 进行加载,我们这里可以使用是因为如上的两个配置类中有 bean
然后我们依次去完成这三个配置文件中的内容:
首先是 jdbc.properties:
在 resources 下提供 jdbc.properties,设置数据库连接四要素
记住最好加一个前缀,例如此处的 jdbc。否则会与系统变量冲突
注意我们此时使用的数据库名字叫 ssm_db
JdbcConfig 的配置类中我们主要配置我们的数据源,也就是那个 DataSource:
我们怎么理解 DataSource 数据源:由 SUN 制定的用于获取数据库连接的规范接口。它存在于 javax.sql 包中,用来代替 DriverManager 的方式来获取连接。它负责建立与数据库的连接,当在应用程序中访问数据库时,不必编写连接数据库的代码,直接引用 DataSource 获取数据库的连接对象即可。用于获取操作数据 Connection 对象。
使用 @Bean 将方法返回值作为 bean 放入容器中
@Value 用来使用属性
什么是 Druid?Druid 是 Java 语言中最好的数据库连接池。Druid 能够提供强大的监控和扩展功能。
数据源与数据库连接池的关系?数据源建立多个数据库连接,这些数据库连接会保存在数据库连接池中,当需要访问数据库时,只需要从数据库连接池中获取空闲的数据库连接,当程序访问数据库结束时,数据库连接会放回数据库连接池中。
MyBatisConfig 配置类中核心就是两个 bean:
一个用来造 sqlSessionFactory
一个用来扫描映射(然后在容器中自动创建 DAO 的实现类 bean)
SqlSessionFactory(sql会话工厂)
是 MyBatis 的核心对象,用于初始化 MyBatis,读取配置文件,创建 SqlSession 对象。SqlSession 使用 JDBC 方式与数据库交互,同时提供了数据表的 CRUD(增删改查)对应的 api 方法
setTypeAliasesPackage 该属性可以给包中的类注册别名,注册后可以直接使用类名,而不用使用全限定的类名(就是不用包含包名)。一般给数据库的模型类包使用
我们使用的是 SqlSessionFactoryBean 去造 sqlSessionFactory 对象。然后我们为其设置数据源以及类别名。这里的数据源我们从方法的参数直接注入。
这两个对象都是直接通过 new,再往上挂载一些属性,最后包装成 bean 放入容器
然后我们说说 Spring 整合 MVC 的东西,这里就涉及两个配置类:
web 容器的配置类(我们也可以说它是 Web 项目入口配置类)
SpringMvcConfig
web 容器的配置类 ServletConfig:
对于 getRootConfigClasses 我们需要加载的是 Spring 的核心配置。对于 getServletConfigClasses 我们需要加载的是 SpringMVC 的核心配置。getServletMappings 就是定义 SpringMVC(或者说 Servlet)要拦截的请求。
其实完全可以把这两个配置文件都整合到 getServletConfigClasses 中去,把 getRootConfigClasses 中报空。
后面的这个过滤器,如果你有表单提交的这种需求你就可以添加,否则你可以不写这个过滤器。对于这种 json 数据过来的,直接在 jackson 的工具中就已经做了中文的处理了,所以也不需要用到过滤器。
SpringMvcConfig 配置类:
首先我们需要注明他是一个配置类。然后我们用 @ComponentScan 来扫描那些 Controller。@EnableWebMvc 让功能更加强大。
如此我们的配置整合就已经完成了。当我们项目启动的时候,它会在 Web 项目入口配置类中(也就是 ServletConfig)把我们 SpringConfig 和 SpringMvcConfig 都加载上(注意也只有这两个配置类有 @Configuration 注解)。然后 SpringConfig 加载它对应的 bean,SpringMvcConfig 加载它对应的 bean。
这里我们要注意 SpringConfig 造出来的容器和 SpringMvcConfig 造出来的容器对象不是同一个,但是 SpringMvc 的容器能访问 Spring 的容器,而 Spring 容器不能访问 SpringMvc 的容器。(这是一个父子容器的概念)
总结
(1) 创建工程
创建一个 Maven 的 web 工程
pom.xml 添加 SSM 需要的依赖 jar 包
编写 Web 项目的入口配置类,实现
AbstractAnnotationConfigDispatcherServletInitializer
重写以下方法getRootConfigClasses() :返回 Spring 的配置类->需要==SpringConfig==配置类
getServletConfigClasses() :返回 SpringMVC 的配置类->需要==SpringMvcConfig==配置类
getServletMappings() : 设置 SpringMVC 请求拦截路径规则
getServletFilters() :设置过滤器,解决 POST 请求中文乱码问题
(2)SSM 整合[==重点是各个配置的编写==]
SpringConfig
标识该类为配置类 @Configuration
扫描 Service 所在的包 @ComponentScan
在 Service 层要管理事务 @EnableTransactionManagement
读取外部的 properties 配置文件 @PropertySource
整合 Mybatis 需要引入 Mybatis 相关配置类 @Import
第三方数据源配置类 JdbcConfig
构建 DataSource 数据源,DruidDataSouroce,需要注入数据库连接四要素, @Bean @Value
构建平台事务管理器,DataSourceTransactionManager,@Bean
Mybatis 配置类 MybatisConfig
构建 SqlSessionFactoryBean 并设置别名扫描与数据源,@Bean
构建 MapperScannerConfigurer 并设置 DAO 层的包扫描
SpringMvcConfig
标识该类为配置类 @Configuration
扫描 Controller 所在的包 @ComponentScan
开启 SpringMVC 注解支持 @EnableWebMvc
版权声明: 本文为 InfoQ 作者【fake smile by】的原创文章。
原文链接:【http://xie.infoq.cn/article/7d8d5c14cf7e52164e449e857】。未经作者许可,禁止转载。
评论