1. SSH框架:
1.struts2 与 Spring整合要解决的核心问题是,如何在action中获得被spring管理的service
解决思路:
1: 想办法让action具有 自动注入的功能;
2: 让action纳入spring管理;
解决方案: 导入整合包: struts2-spring-plugin-2.1.8.1.jar ;
struts-plugin.xml 比 struts-default.xml 后加载, 所以可以在插件中配置的action创建工厂
StrutsSpringObjectFactory 可以覆盖 默认配置中action创建工厂 ObjectFactory;
由于StrutsSpringObjectFactory 在管理action中首先会根据请求的action的标签:
<action class="根据这个类名去Spring中找Action个">中,根据 class 属性的内容去Spring容器中
去寻找同名action,如果找到那么这个action也是在Spring管理之中所以,可以注入Service; 如果没有
找到,那么这个工厂会自己创建一个Action并且这个action具有自动注入Service的功能;
所以根据: <action class="根据这个类名去Spring中找Action个"> 标签中的class属性是否是全类名:
分为:全类名整合方式,和伪类名整合方式
PS: 说明一点,在实际生产中我们会在Action中使用注解,所以在action类头上有两套注解:
1. 一套Struts2的注解: 相当于在 struts.xml中配置了 <action class="全类名">
2. 一套spring的注解: 相当于在spring容器中配置了<bean id="类名首字符小写">
我们仔细看上边两个注解代表的配置就会看出一个bug: SpringObjectFactory 在管理获得action
时会拿着 <action class="全类名"> 中class属性值,去Spring容器中找 <bean id="类名首字符小写">中
找<bean>的id 与 <action>的class属性值相同的 action, 由于注解配置时, 一个是全类名,一个是类名首
字母小写,所以永远可能相同,那么此时,SpringObjectFactory 会自己创建一个 action对象,这意味着这个
action并没有在spring管理之中,而在spring管理中的action永远不会被使用(除非在类上的注解中用
全类名指明action,或者在方法中指明全类名,当然这样的操作我们一般都不会去做的);所以说在注解配置
整合spring和struts2时,在action类头上的spring注解是不起作用的,是可以删掉的;
2. spring与hibernate整合两种方式: 1. 零障碍整合; 2. spring管理hibernate配置;
1.零障碍整合:
在spring的配置文件 applicationContext.xml中配置bean: 并引入hibernate的核心配置文件;
<bean id= "sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
</bean>
2.spring管理hibernate配置:将hibernate的核心配置文件 hibernate.cfg.xml中的内容迁移到 applicationContext.xml中;
<bean id= "sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<-- 连接池 -->
<property name="dataSource" ref=""/>
<-- 映射文件 -->
< 这个地方可以配置映射文件路径, 也可以注解配置时配置包扫描>
<-- hibernate一些属性配置 -->
<property name="hibernateProperties" >
<props>
<prop key="hibernate.show_sql">true<prop>
<prop key=""><prop>
</props>
</property>
</bean>
2. SSM框架整合
1. mybatis的核心要解决的问题是: 如何使用外置sql(mapper中的sql映射) 来实现CRUD操作,所以Spring与Mybatis
整合的核心问题之一是,如何将Mybatis的外置sql 对象化; spring是通过将外置sql 转化为 dao层接口的代理实现类对象
来将外置sql利用起来,并以代理对象的形式提供给service层使用;
mybatis与spring整合的核心问题:
1. 是让mybatis的SessionFactory 被Spring管理; 由整合类完成:org.mybatis.spring.SqlSessionFactoryBean ;
2. 是 spring要利用外置sql 创建 mapper 代理对象; 通过包扫描:
<!-- 配置Mapper扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.itheima.springmvc.mapper"/>
</bean>
mybatis与spring整合 和 hibernate与spring整合 配置内容对比:
1. mybatis 还要保留核心配置文件: sqlMapConfig.xml , hibernate 不需要保留核心配置文件: hibernate.cfg.xml
2. 在spring的配置文件 applicationContext-dao.xml 中,要配置连个东西:
1. 连接配置: SessionFactory 配置;
hibernate与spring整合时: 注入 1. dataSource, 2. domain(映射), 3. hibernate一些属性配置(比如方言之类)
mybatis与spring整合: 注入 1. dataSource, 2. 核心配置文件
2. 操作配置: Dao配置;
hibernate与spring整合时: 将dao实现类配置 到<bean>中,然后注入sessionFactory;
mybatis与spring整合: 配置mapper接口包扫描,至于sessionFactory 不需要手动注入,它会自己到Spring容器中寻找;
容易看出来,在mybatis的 sessionFactory 配置中没有配置映射文件,那么它是在哪里配置的呢? 它的配置被放到了
操作配置中: 在扫描Dao层中的Mapper接口包时,会同时在相同目录下寻找对应的mapper.xml文件,完成映射文件扫描;
2. Springmvc要解决的问题是: 将请求的处理从基于对象到基于方法,实现单例方法响应高并发;根本原因在于参数接收
时与Struts2的方式不同,Struts是利用值栈让成员变量接收请求参数,Springmvc是利用参数解析器,让方法形参接收请求
参数;