Spring整合SpringMVC
Spring整合SpringMVC时,两者的配置文件不需要做太多改变,当SpringMVC作为表现层响应的时候,可直接利用Spring作为业务层进行相关的操作,但是需要在SpringMVC的配置文件中加上监听器(需要的话可加上Spring配置文件的具体路径),否则SpringMVC响应的时候,无法找到Spring的配置文件。
<!-- 配置 spring mvc 的核心控制器 -->
<servlet>
<servlet-name>springmvcDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置初始化参数,用于读取 springmvc 的配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 配置 servlet 的对象的创建时间点:应用加载时创建。取值只能是非 0 正整数,表示启动顺 序 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvcDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
这是web.xml文件,<servlet-mapping>标签中说明了拦截所有请求,再通过<servlet-name>指向org.springframework.web.servlet.DispatcherServlet
<load-on-startup>标签说明了在加载web.xml文件时即进行servlet的加载,而<init-param>为正数则说明了在加载servlet时需要进行初始化相关的文件,因为加载web.xml文件时需要自动加载SpringMVC.xml文件,故<load-on-startup>标签通常为正数。
<!-- 扫描controller的注解,别的不扫描 -->
<context:component-scan base-package="com.derder.ssm.controller">
</context:component-scan>
<!-- 配置视图解析器 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- JSP文件所在的目录 -->
<property name="prefix" value="/pages/" />
<!-- 文件的后缀名 -->
<property name="suffix" value=".jsp" />
</bean>
<!-- 开启对SpringMVC注解的支持 -->
<mvc:annotation-driven />
<!-- 扫描controller的注解,别的不扫描 -->
只写一个SpringMVC的demo时,如果通过注解的方式,则也是需要在Controller类上写@controller注解并在SpringMVC.xml文件上指明要扫描该注解。
Spring整合Mybatis
Spring整合Mybatis时,需要将Mybatis的配置文件加到Spring配置文件中,Mybatis原有的配置文件可删除掉,Spring中需配置连接池和DAO接口所在包(配置DAO接口所在包用于扫描,而mybatis原来的配置文件,如果是用xml形式,则在原mybatis配置文件中写入xml文件的路径,如果是注解的形式,则写出注解的类所在的位置或者用扫描的形式写出要扫描的包,故在mybatis与spring结合的配置文件中可看到DAO包被扫描了两次),还要配置SqlSessionFactory工厂,便可将SqlSessionFactory交给Spring框架处理,如此一来,就可以利用Spring读取配置文件的方式获得DAO的代理对象,而不用原来Mybatis中利用工厂手动获取代理对象。
原来的通过工厂获取代理对象
// 加载配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
// 创建SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
// 创建SqlSession对象
SqlSession session = factory.openSession();
// 获取到代理对象
AccountDao dao = session.getMapper(AccountDao.class);
现在的通过Spring框架获取代理对象
// 加载配置文件
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
// 获取对象
AccountService as = (AccountService) ac.getBean("accountService");
// 调用方法
as.findAll();
Spring和Mybatis结合后,Spring的配置文件为
<!--Spring整合MyBatis框架-->
<!--配置连接池-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql:///ssm"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
</bean>
<!--配置SqlSessionFactory工厂-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
<!--配置AccountDao接口所在包-->
<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.itcast.dao"/>
</bean>
注:
<!-- 开启注解扫描,管理service和dao -->
<context:component-scan base-package="com.itheima.ssm.service">
</context:component-scan>
<context:component-scan base-package="com.itheima.ssm.dao">
</context:component-scan>
这里让我很疑惑,为什么要去扫描DAO包,当利用Spring注解来完成依赖注入的时候,是需要在Autowire所注入的那个类的上方通过注解声明该类是一个组件类的,而Spring和mybatis整合时,DAO层却没有任何组件类相关的声明。
事实上DAO层上是可以写@Repository注解的,也可以不写,不写的时候去扫描DAO包,
详情如下:https://blog.csdn.net/java280580332/article/details/72123890
思维导图如下:
日期:
SSM框架基础部分的相关博客都是我很久以前的笔记,搬上来而已
放只允允镇楼: