您的位置:首页 > 编程语言 > Java开发

关于spring,springMVC,hibernate,mybatis面试题

2018-03-08 13:53 357 查看

1.关于spring

1.谈谈你对spring IOC和DI的理解,它们有什么区别?

IoC反转控制,就是将原本在程序中手动创建对象的控制权,交由Spring框架管理。

DI:依赖注入,在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件

面试题: IoC 和 DI的区别?

IoC 控制反转,指将对象的创建权,反转到Spring容器 , DI 依赖注入,指Spring创建对象的过程中,将对象依赖属性通过配置进行注入

2.BeanFactory 接口和 ApplicationContext 接口有什么区别 ?

①ApplicationContext 接口继承BeanFactory接口,Spring核心工厂是BeanFactory ,BeanFactory采取延迟加载,第一次getBean时才会初始化Bean, ApplicationContext是会在加载配置文件时初始化Bean。

②ApplicationContext是对BeanFactory扩展,它可以进行国际化处理、事件传递和bean自动装配以及各种不同应用层的Context实现

3.spring配置bean实例化有哪些方式?

1)使用类构造器实例化(默认无参数)

<bean id="bean1" class="cn.itcast.spring.b_instance.Bean1"></bean>

2)使用静态工厂方法实例化(简单工厂模式)

<bean id="bean2" class="cn.itcast.spring.b_instance.Bean2Factory" factory-method="getBean2"></bean>

3)使用实例工厂方法实例化(工厂方法模式)

<bean id="bean3Factory" class="cn.itcast.spring.b_instance.Bean3Factory"></bean>

<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>

4.简单的说一下spring的生命周期?

1)在配置 <bean> 元素,通过 init-method 指定Bean的初始化方法,通过 destroy-method 指定Bean销毁方法

需要注意的问题:

* destroy-method 只对 scope="singleton" 有效

* 销毁方法,必须关闭ApplicationContext对象(手动调用),才会被调用

5.请介绍一下Spring框架中Bean的生命周期和作用域

(1)bean定义

在配置文件里面用<bean></bean>来进行定义。

(2)bean初始化

有两种方式初始化:

A.在配置文件中通过指定init-method属性来完成

B.实现org.springframwork.beans.factory.InitializingBean接口

(3)bean调用

有三种方式可以得到bean实例,并进行调用

(4)bean销毁

销毁有两种方式

A.使用配置文件指定的destroy-method属性

B.实现org.springframwork.bean.factory.DisposeableBean接口

##作用域

singleton

当一个bean的作用域为singleton, 那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。

prototype

Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean() 方法)时都会创建一个新的bean实例。根据经验,对所有有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用 singleton作用域

request

在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例, 它们依据某个bean定义创建而成。该作用 域仅在基于web的Spring ApplicationContext情形下有效。

session

在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。

global session

在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于 web的Spring ApplicationContext情形下有效。

6.Bean注入属性有哪几种方式?

spring支持构造器注入和setter方法注入

构造器注入,通过 <constructor-arg> 元素完成注入

setter方法注入, 通过<property> 元素完成注入【开发中常用方式】

7.什么是AOP,AOP的作用是什么?

面向切面编程。它是为解耦而生的.Spring的一个关键的组件就是AOP框架,允许用户实现自定义切面,用AOP来完善OOP的使用,可以把Spring AOP看作是对Spring的一种增强

8.Spring的核心类有哪些,各有什么作用?

BeanFactory:产生一个新的实例,可以实现单例模式

BeanWrapper:提供统一的get及set方法

ApplicationContext:提供框架的实现,包括BeanFactory的所有功能

9.Spring里面如何配置数据库?

10.Spring里面applicationContext.xml文件能不能改成其他文件名?

ContextLoaderListener是一个ServletContextListener, 它在你的web应用启动的时候初始化。缺省情况下, 它会在WEB-INF/applicationContext.xml文件找Spring的配置。 你可以通过定义一个<context-param>元素名字为”contextConfigLocation”来改变Spring配置文件的位置。示例如下:

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/xyz.xml</param-value>

</context-param>

</listener-class>

</listener>

11.Spring里面如何定义hibernate的session工厂?

<bean id="sessionFactory"

class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

<property name="dataSource" ref="dataSource" /><!--数据源-->

<property name="packagesToScan" value="com.**" /><!-- 扫描并加载基于JPA注解PO类目录(此目录下所有带注解的实体类) -->

<property name="hibernateProperties"><!-- 指定Hibernate的属性信息 -->

<props>

<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>

<prop key="hibernate.show_sql">true</prop>

</props>

</property>

<!--加载实体类的映射文件位置及名称 -->

<property name="mappingLocations" value="classpath:config:/*.hbm.xml"></property>

</bean>

12.Spring如何处理线程并发问题?

Spring使用ThreadLocal解决线程安全问题

ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。

在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量。这时该变量是多个线程共享的,使用同步机制要求程序慎密地分析什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放对象锁等繁杂的问题,程序设计和编写难度相对较大。

而ThreadLocal则从另一个角度来解决多线程的并发访问。ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。

概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。

13.为什么要有事物传播行为?

14.介绍一下Spring的事物管理

Spring既支持编程式事务管理,也支持声明式的事务管理,但其亮点在于声明式事务管理,即允许通过声明方式,在IoC配置中指定事务的边界和事务的属性。

1.Spring为不同的持久化框架提供了PlatformTrancationManager接口的实现类,不同的持久化技术对应不同的事务管理器实现类。

2.Spring为不同的持久化技术提供了一套从TransactionSynchronizationManager中获取对应线程绑定资源的工具类。

15.解释一下Spring AOP里面的几个名词

切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @Aspect 注解(@AspectJ风格)来实现。

连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。 在Spring AOP中,一个连接点 总是 代表一个方法的执行。 通过声明一个org.aspectj.lang.JoinPoint类型的参数可以使通知(Advice)的主体部分获得连接点信息。

通知(Advice):在切面的某个特定的连接点(Joinpoint)上执行的动作。通知有各种类型,其中包括“around”、“before”和“after”等通知。 通知的类型将在后面部分进行讨论。许多AOP框架,包括Spring,都是以拦截器做通知模型, 并维护一个以连接点为中心的拦截器链。

切入点(Pointcut):匹配连接点(Joinpoint)的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。 切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。

引入(Introduction):(也被称为内部类型声明(inter-type declaration))。声明额外的方法或者某个类型的字段。 Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。

目标对象(Target Object): 被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做 被通知(advised) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个 被代理(proxied) 对象。

AOP代理(AOP Proxy): AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。 注意:Spring 2.0最新引入的基于模式(schema-based)风格和@AspectJ注解风格的切面声明,对于使用这些风格的用户来说,代理的创建是透明的。

织入(Weaving):把切面(aspect)连接到其它的应用程序类型或者对象上,并创建一个被通知(advised)的对象。 这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。 Spring和其他纯Java AOP框架一样,在运行时完成织入。

16. spring aop通知(advice)有哪些类型?

spring aop通知(advice)分成五类:

前置通知[Before advice]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常。

正常返回通知[After returning advice]:在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行。

异常返回通知[After throwing advice]:在连接点抛出异常后执行。

后置[b]通知[After (finally) advice][/b]:在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容。

环绕通知[Around advice]:环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大的通知类型,能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行。

2.关于springMVC

1.简单的谈一下SpringMVC的工作流程?

1、用户发送请求至前端控制器DispatcherServlet

2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。

3、处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

4、DispatcherServlet调用HandlerAdapter处理器适配器

5、HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

6、Controller执行完成返回ModelAndView

7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet

8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器

9、ViewReslover解析后返回具体View

10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。

11、DispatcherServlet响应用户

2. SpringMVC与Struts2的主要区别?

①springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。

②springmvc是基于方法开发,传递参数是通过方法形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。

③Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request对象内容进行解析成方法形参,将响应数据和页面封装成ModelAndView对象,最后又将模型数据通过request对象传输到页面。 Jsp视图解析器默认使用jstl。

3. 关于hibernate

1.为什么要使用Hibernate开发你的项目呢?Hibernate的开发流程是怎么样的?

为什么要使用

①.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。

②.Hibernate 是一个基于JDBC的主流持久化框架,是一个优秀的ORM 实现。他很大程度的简化DAO层的编码工作

③.hibernate 的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。

开发流程

2.什么是延迟加载?

延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载。

3.说一下hibernate的缓存机制

hibernate 共有两个级别的缓存

* 一级缓存,保存Session中, 事务范围的缓存

* 二级缓存,保存SessionFactory
,进程范围的缓存

二级缓存好处: 将数据库或者硬盘数据,保存在内存中,减少数据库查询次数,减少硬盘交互,提高检索效率。

Hibernate支持哪些二级缓存技术?

* EHCache (主要学习,支持本地缓存,支持分布式缓存)

可作为进程范围内的缓存, 存放数据的物理介质可以是内存或硬盘, 对 Hibernate 的查询缓存提供了支持。

* OSCache

可作为进程范围内的缓存, 存放数据的物理介质可以是内存或硬盘, 提供了丰富的缓存数据过期策略, 对 Hibernate 的查询缓存提供了支持

* SwarmCache

可作为集群范围内的缓存, 但不支持 Hibernate 的查询缓存

* JBossCache

可作为集群范围内的缓存, 支持 Hibernate 的查询缓存

4.Hibernate的查询方式有哪些?

本地SQL查询、Criteria、Hql

5.如何优化Hibernate?

1.使用双向一对多关联,不使用单向一对多

2.灵活使用单向一对多关联

3.不用一对一,用多对一取代

4.配置对象缓存,不使用集合缓存

5.一对多集合使用Bag,多对多集合使用Set

6. 继承类使用显式多态

7. 表字段要少,表关联不要怕多,有二级缓存撑腰

6.Hibernate中GET和LOAD的区别?

session.get 方法, 查询立即执行 , 返回类对象

session.load 方法,默认采用延迟加载数据方式,不会立即查询,返回类子类对象 (动态生成代理对象)。但如果PO类使用final修饰,load无法创建代理对象,返回目标对象本身 (load效果和 get效果 相同 )

7.说说在 hibernate中使用Integer做映射和使用int做映射之间有什么差别?

Integer是对象,对象可以为空;int 是普通类型,不可能=null。

8.SQL和HQL有什么区别?

sql 面向数据库表查询 ;hql 面向对象查询 。

hql:from 后面跟的 类名+类对象 where 后 用 对象的属性做条件

sql:from 后面跟的是表名
where 后 用表中字段做条件

在Hibernate中使用查询时,一般使用Hql查询语句。

9.Hibernate的分页查询

例如:从数据库中的第20000条数据开始查后面100条记录

Query q =
session.createQuery("from Cat as c");;

q.setMaxResults(100);;

List l = q.list();;

q.setFirstResult(20000);;

10.Hibernate中Java对象的状态以及对应的特征有哪些?

OID 指与数据表中主键对应 PO类中属性

Hibernate框架使用OID来区分不同PO对象

* 例如内存中有两个PO对象,只要具有相同 OID, Hibernate认为同一个对象

*
Hibernate 不允许缓存同样OID的两个不同对象

持久化对象的三种状态:

①瞬时态(临时态、自由态):不存在持久化标识OID,尚未与Hibernate
Session关联对象

②持久态:存在持久化标识OID,与当前session有关联

③脱管态(离线态、游离态):存在持久化标识OID,但没有与当前session关联,

区分三种状态:判断对象是否有OID,判断对象是否与session关联(被一级缓存引用)

①瞬时态对象:通过new获得

瞬时----->持久
save、saveOrUpdate(都是session)

瞬时----->脱管
book.setId(1) 为瞬时对象设置OID

②持久态对象:通过get/load 、Query查询获得

持久----->瞬时
delete (被删除持久化对象 不建议再次使用 )

持久----->脱管
evict(清除一级缓存中某一个对象)、close(关闭Session,清除一级缓存)、clear(清除一级缓存所有对象 )

③脱管态对象 无法直接获得

脱管----->瞬时
book.setId(null); 删除对象OID

脱管----->持久
update、saveOrUpdate、 lock(过时)

11.Hibernate中怎样处理事务?

Hibernate是对JDBC的轻量级对象封装,Hibernate本身是不具备Transaction 处理功能的,Hibernate的Transaction实际上是底层的JDBC
Transaction的封装,或者是JTA
Transaction的封装。

12.简单的介绍一下Hibernate的核心API?

1.Configuration
用于加载hibernate配置

①加载核心属性配置hibernate.properties和hibernate.cfg.xml

②手动加载hbm映射配置,持久化类与数据表的映射关系(*.hbm.xml 文件)

2.SessionFactory

3.Session代表hibernate操作会话对象,相当于Connection

4.Transaction
事务操作

5.Query :session.createQuery()获得

6.Criteria
接口(QBC查询 Query By Criteria )

13.update与saveOrUpdate有什么区别?

save() 方法很显然是执行保存操作的,如果是对一个新的刚new出来的对象进行保存,自然要使用这个方法了,数据库中没有这个对象。

update() 如果是对一个已经存在的托管对象进行更新那么肯定是要使用update()方法了,数据中有这个对象。

saveOrUpdate() 这个方法是更新或者插入,有主键就执行更新,如果没有主键就执行插入。【此方法慎用】

14.Hibernate的inverse和cascade属性的作用?

1.明确inverse和cascade的作用

inverse 决定是否把对对象中集合的改动反映到数据库中;

cascade决定是否把对对象的改动反映到数据库中,所以cascade对所有的关联关系都起作用(因为关联关系就是指对象之间的关联关系)。

2.inverse属性 :inverse所描述的是对象之间关联关系的维护方式。

inverse只存在于集合标记的元素中 。Hibernate提供的集合元素包括<set/>
<map/> <list/> <array /> <bag />

3.cascade属性

级联操作:指当主控方执行某项操作时,是否要对被关联方也执行相同的操作。

cascade属性的作用是描述关联对象进行操作时的级联特性。因此,只有涉及到关系的元素才有cascade属性。具有cascade属性的标记包括<many-to-one /> <one-to-one /> <any
/> <set /><bag /> <idbag /> <list /> <array />

注意:<one-to-many
/>和 <many-to-many />是用在集合标记内部的,所以是不需要cascade属性的。

4.inverse和cascade的区别

作用的范围不同:

Inverse是设置在集合元素中的。

Cascade对于所有涉及到关联的元素都有效。

<many-to-one/><ont-to-many/>没有inverse属性,但有cascade属性

执行的策略不同

Inverse 会首先判断集合的变化情况,然后针对变化执行相应的处理。

Cascade 是直接对集合中每个元素执行相应的处理

执行的时机不同

Inverse是在执行SQL语句之前判断是否要执行该SQL语句

Cascade则在主控方发生操作时用来判断是否要进行级联操作

执行的目标不同

Inverse对于<ont-to-many>和<many-to-many>处理方式不相同。

对于<ont-to-many>,inverse所处理的是对被关联表进行修改操作。

对于<many-to-many>,inverse所处理的则是中间关联表

Cascade不会区分这两种关系的差别,所做的操作都是针对被关联的对象。

总结:

<one-to-many>

<one-to-many>中,建议inverse=”true”,由“many”方来进行关联关系的维护

<many-to-many>中,只设置其中一方inverse=”false”,或双方都不设置

Cascade,通常情况下都不会使用。特别是删除,一定要慎重。

操作建议:

一般对many-to-one和many-to-many不设置级联,这要看业务逻辑的需要;对one-to-one和one-to-many设置级联。

many-to-many关联关系中,一端设置inverse=”false”,另一端设置为inverse=”true”。在one-to-many关联关系中,设置inverse=”true”,由多端来维护关系表

4.Hibernate支持哪些二级缓存技术?

* EHCache (主要学习,支持本地缓存,支持分布式缓存)

可作为进程范围内的缓存, 存放数据的物理介质可以是内存或硬盘, 对
Hibernate 的查询缓存提供了支持。

* OSCache

可作为进程范围内的缓存, 存放数据的物理介质可以是内存或硬盘, 提供了丰富的缓存数据过期策略, 对
Hibernate 的查询缓存提供了支持

* SwarmCache

可作为集群范围内的缓存, 但不支持
Hibernate 的查询缓存

* JBossCache

可作为集群范围内的缓存, 支持
Hibernate 的查询缓存

4. 关于mybatis

1.为什么要使用 MyBatis开发你的项目?

1.在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。

2.将Sql语句配置在XXXXmapper.xml文件中与java代码分离。

3.Mybatis自动将java对象映射至sql语句。

4.Mybatis自动将sql执行结果映射至java对象。

2.MyBatis编程步骤是什么样的?

① 创建SqlSessionFactory

② 通过SqlSessionFactory创建SqlSession

③ 通过sqlsession执行数据库操作

④ 调用session.commit()提交事务

⑤ 调用session.close()关闭会话

3.MyBatis与Hibernate有哪些不同?

Mybatis和hibernate不同,是一个半自动框架,因为它需要手工匹配提供POJO,sql和映射关系,而全表映射的Hibernate只需要提供pojo和映射关系即可。

Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发。

Hibernate对象/关系映射能力强,数据库无关性好,开发量小。

4.使用MyBatis的mapper接口调用时有哪些要求?

① Mapper接口方法名和mapper.xml中定义的每个sql的id相同

② Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同

③ Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

④ Mapper.xml文件中的namespace即是mapper接口的类路径。

5.SqlMapConfig.xml中配置有哪些内容?

SqlMapConfig.xml中配置的内容和顺序如下:

properties(属性)

settings(配置)

typeAliases(类型别名)

typeHandlers(类型处理器)

objectFactory(对象工厂)

plugins(插件)

environments(环境集合属性对象)

environment(环境子属性对象)

transactionManager(事务管理)

dataSource(数据源)

mappers(映射器)

6.简单的说一下MyBatis的一级缓存和二级缓存?

7.Mapper编写有哪几种方式?

①接口实现类继承SqlSessionDaoSupport

使用此种方法需要编写mapper接口,mapper接口实现类、mapper.xml文件

1、在sqlMapConfig.xml中配置mapper.xml的位置

<mappers>

<mapper
resource="mapper.xml文件的地址" />

<mapper
resource="mapper.xml文件的地址" />

</mappers>

2、定义mapper接口

3、实现类集成SqlSessionDaoSupport

mapper方法中可以this.getSqlSession()进行数据增删改查。

4、spring 配置

<bean id=" " class="mapper接口的实现">

<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>

</bean>

②使用org.mybatis.spring.mapper.MapperFactoryBean

1、在sqlMapConfig.xml中配置mapper.xml的位置

如果mapper.xml和mappre接口的名称相同且在同一个目录,这里可以不用配置

<mappers>

<mapper
resource="mapper.xml文件的地址" />

<mapper
resource="mapper.xml文件的地址" />

</mappers>

2、定义mapper接口

注意

1mapper.xml中的namespacemapper接口的地址

2mapper接口中的方法名和mapper.xml中的定义的statementid保持一致

3、 Spring中定义

<bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean">

<property name="mapperInterface" value="mapper接口地址" />

<property name="sqlSessionFactory" ref="sqlSessionFactory" />

</bean>

③使用mapper扫描器

1、mapper.xml文件编写,

注意:

mapper.xml中的namespacemapper接口的地址

mapper接口中的方法名和mapper.xml中的定义的statementid保持一致

如果将mapper.xmlmapper接口的名称保持一致则不用在sqlMapConfig.xml中进行配置

2、定义mapper接口

注意mapper.xml的文件名和mapper的接口名称保持一致,且放在同一个目录

3、配置mapper扫描器

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

<property name="basePackage" value="mapper接口包地址"></property>

<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>

</bean>

4、使用扫描器后从spring容器中获取mapper的实现对象

扫描器将接口通过代理方法生成实现对象,要spring容器中自动注册,名称为mapper 接口的名称。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐