spring与springMVC可整合可不整合。不整合指他们用同一个容器,整合指有各自的容器。
ContextLoaderListener
作用:在web容器启动时创建spring的容器
java项目中 ,容器的创建是在点击运行时。
web项目中,springMVC的容器是在dispatcherServlet初始化时创建的,springMVC管理控制层组件controller 需要server和dao层的组件。springMvc容器依赖spring容器
所以,spring管理的server和dao层的容器组件的创建要先于 controller组件的容器
使用监听器原因:
实现了ServletContextListener(监听服务器的启动与销毁) 启动时间 早于 filter 早于servlet
且监听器初始化代码只执行一次,
ContextLoaderListener类实现了ServletContextListener接口,配置在web.xml中能够随着tomcat启动就创建spring容器。
ContextLoaderListern的使用
ContextLoaderListener类中,代码能够加载spring.xml配置创建对应容器,默认spring.xml的位置在
/WEB-INF/applicationContext.xml 可以用<context-param>
修改spring配置文件位置以及名称。
在web.xml中配置
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
SSM整合
springMVC只管控制层
spring负责除控制层外的其他
在服务启动时,spring容器创建的代码在监听器中完成,是父容器
springMVC容器创建是在dispatcherServlet初始化时,是子容器。
子容器.setParent(父容器),从而子容器能够访问父容器,但父容器不能访问子容器。
springMVC与spring整合
例:controller层需要service层
负责除控制层外所有
Spring配置:
spring的
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.yan">
<!-- @controller 标识的交给springMVC去管理 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
</beans>
springMVC 配置
除了控制层外其他的交给spring
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com.yan.controller"></context:component-scan>
<bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
<property name="order" value="1"/>
<property name="characterEncoding" value="UTF-8"/>
<property name="templateEngine">
<bean class="org.thymeleaf.spring5.SpringTemplateEngine">
<property name="templateResolver">
<bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
<!-- 视图前缀 -->
<property name="prefix" value="/WEB-INF/templates/"/>
<!-- 视图后缀 -->
<property name="suffix" value=".html"/>
<property name="templateMode" value="HTML5"/>
<property name="characterEncoding" value="UTF-8" />
</bean>
</property>
</bean>
</property>
</bean>
<!-- 配置默认的servlet处理静态资源-->
<mvc:default-servlet-handler />
<!--开启mvc的注解驱动-->
<mvc:annotation-driven />
<mvc:view-controller path="/" view-name="index"></mvc:view-controller>
</beans>
web.xml配置:
注册监听器 先启动spring的容器
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
在启动springMVC的容器
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--设置SpringMVC配置文件的位置和名称 -->
<!--以下若不配置,默认会在WEB-INF中寻找springmvc的配置文件 ,且名字要为 <servlet-name>-servlet.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!--将DispatcherServlet的初始化时间提前到服务器启动时-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
spring 与mybatis整合
将SqlSessionFactoryBean 配置在spring容器中 ,可以通过属性赋值,代替mybatis-config.xml
会在容器中注册一个读取了配置的sqlSessionFactory对象
<!--配置SqlSessionFactoryBean,可以直接在Spring的IOC中获取SqlSessionFactory-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!--设置MyBatis的核心配置文件的路径-->
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<!--设置数据源-->
<property name="dataSource" ref="dataSource"></property>
<!--设置类型别名所对应的包-->
<property name="typeAliasesPackage" value="com.yan.pojo"></property>
<!--设置映射文件的路径,在有MapperScannerConfigurer前提下 只有映射文件的包和mapper接口的包不一致时需要设置
如果没有及时相同也要设置-->
<!--<property name="mapperLocations" value="classpath:mappers/*.xml"></property>-->
</bean>
<!--
配置mapper接口的扫描,可以将指定包下所有的mapper接口 通过容器中的sqlSessionFactory对象
创建代理实现类对象,并将这些对象交给IOC容器管理
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.yan.mapper"></property>
</bean>
配置数据源
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<!--配置数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
添加事务管理
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--
开启事务的注解驱动
将使用注解@Transactional标识的方法或类中所有的方法进行事务管理
-->
<tx:annotation-driven transaction-manager="transactionManager" />