SSM应用(六)--SSM集成
整合分析
首先,我们先来回顾一下Spring,SpringMVC,MyBatis这三个框架各自做了什么;
Spring:用于实现bean的实例化和bean与bean之间的管理;
在SSM集成中,将各层进行整合,管理MyBatis、Service、SpringMVC;
SpringMVC:取代了servlet,用于分发请求给bean的实例;
在SSM集成中,用于管理请求分发的bean;
MyBatis:取代了JDBC,用于实现dao层,对数据进行操作;
在SSM集成中,推荐使用代理模式,Spring会生成MyBatis接口中的代理实现类;
整合步骤
1、将每一层的类变成Spring中的实例;
2、建立每一层中类的关系;
工程目录结构:
3、整合dao层:扫描mapper接口生成代理实现类的bean;
(1)、将MyBatis的代理实现类变成Spring中的bean;
会用到MapperScannerConfigurer类扫描包,将包中的接口和mapper映射文件关联起来生成代理对象;
(2)、需要Spring管理SqlSessionFactory对象和DataSource对象
<!-- 引入属性配置文件 --> <context:property-placeholder location="classpath:db.properties"/> <!-- 配置数据源:bean,Spring会通过配置文件将该对象实例化,Apache提供了dataSource支持类 Spring可以实例化出DataSource数据源对象 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${driver}"></property> <property name="username" value="${username}"></property> <property name="password" value="${password}"></property> <property name="url" value="${url}"></property> <property name="maxActive" value="10"></property><!-- 最大连接数 --> <property name="maxIdle" value="5"></property><!-- 最大同时活跃数 --> </bean> <!-- 配置SqlSessionFactory:Spring提供的管理,提供了一个类 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 数据源的配置 --> <property name="dataSource" ref="dataSource"></property> <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml"></property> </bean> <!-- 使用包扫描的方式,将指定包下的接口都生成代理类,Spring和MyBatis整合包下所提供的一个类具备的功能 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="dao"></property> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> </bean>
4、整合service层:扫描service包,将有注解的service实现类变成bean,实现事务控制;
(1)、将service的实现类变成Spring中的bean;我们可以通过配置文件和注解的方式实现;
基于配置文件配置bean
<!-- 基于配置文件 --> <bean id="authorService" class="service.Impl.AuthorServiceImpl"> <property name="authorDao" ref="authorDao"></property> </bean>
在service层中,注意要实现dao层的get,set方法
public class AuthorServiceImpl implements AuthorService { AuthorDao dao; public AuthorDao getDao() { return dao; } public void setDao(AuthorDao dao) { this.dao = dao; } }
基于注解方式实现:
<!-- 基于注解形式:配置要扫描哪个包 --> <context:annotation-config></context:annotation-config> <context:component-scan base-package="service"></context:component-scan>
同样,要实现dao层的get,set方法;
@Service("authorService") public class AuthorServiceImpl implements AuthorService { @Resource AuthorDao dao; public AuthorDao getDao() { return dao; } public void setDao(AuthorDao dao) { this.dao = dao; } }
5、整合SpringMVC:本质就是一个Spring,自己是一个servlet的存在,将controller类变成它管理的实例;
(1)、在web.xml文件中配置SpringMVC为一个servlet
<servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/springMVC.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springMVC</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping>
(2)、配置SpringMVC的核心配置文件:controller的实例bean、视图解析的bean;
<!-- 启用注解 --> <mvc:annotation-driven></mvc:annotation-driven> <!-- 要扫描的包: --> <context:component-scan base-package="controller"></context:component-scan> <!-- 视图解析 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> </bean>
6、在这里,我们把核心配置文件按照层的关系分成了不同的配置文件,那么要怎么才能把他们关联起来。在程序运行时同时解读呢?
所以我们就需要用到Spring提供的监听器了,将配置的所有bean和bean之间的关系管理起来
我们需要在web.xml中配置监听器;
<!-- Spring提供了监听器:Tomcat启动的时候,就去读取Spring的配置文件,创建Spring上下文 创建实例,建立实例之间的关系 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/applicationContext-*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
SSM集成到此也就结束了,希望能对大家有所帮助;
PS:因作者能力有限,如有误还请谅解;