Java开发校招面试考点汇总第四篇:JAVA EE:Spring+SpringMVC+MyBatis

Spring
mybatis
springmvc
1、● 请谈一谈Spring中自动装配的方式有哪些?
2、● 请问Spring中Bean的作用域有哪些?
3、● 请问什么是IoC和DI?并且简要说明一下DI是如何实现的?
4、● 请说明一下Spring中BeanFactory和ApplicationContext的区别是什么?
5、● 请简单说明一下依赖注入的方式有哪几种?以及这些方法如何使用?
6、● 请说明一下@Controller和@RestController的区别是什么?
7、@RequestMapping、@RequestBody和@ResponseBody
8、● 请问在以前的学习中有使用过Spring里面的注解吗?如果有请谈一下autowired 和resource区别是什么?
9、● 请介绍一下bean的生命周期
10、AOP
11、● 请简单谈一下spring框架的优点都有哪些?
12、springmvc的工作流程
13、spring在SSM中的作用
14、Spring的注解
15、SpringMvc中函数的返回值是什么
16、Spring 支持的事务管理类型有哪些?你在项目中使用哪种方式?怎么理解全局事务和局部事务?
17、简单介绍下你对mybatis的理解?
18、● 请问MyBatis中的动态SQL是什么意思?
19、SpringMVC-方法四种类型返回值总结

Spring:
1、 IOC/DI
在这里插入图片描述
1.1使用注解配置的时候:在applicationcontext.xml中配置要扫描的包:
在这里插入图片描述
1.2@component(“user”) 其实就等于
< bean name=“user” class="******"/>

2、 Bean元素的作用以及内部属性(写在apllicationcontext.xml中)
Class、name、id、scope(singleton单例、prototype多例)
spring创建对象:
在这里插入图片描述
3、 使用bean时进行Spring的属性注入
(1) set注入
<property name=” ” value=””> 依赖其他类型
<property name=” ” ref=”类名”> 依赖的是一个类
(2) 构造函数注入
在这里插入图片描述
(3)接口注入
4、 使用注解配置spring(使用注解代替application.xml中的bean)
在applicationcontext.xml中加入:
在这里插入图片描述
在我们想让spring管理的类上加@Component(“名字”),这就相当于在applicationcontext.xml中加了一个
在这里插入图片描述
需要注意的是以下四个注解作用一样,只是为了表明对象是哪一层的对象。
在这里插入图片描述
5、 使用注解时,进行属性注入
(1)值类型注入(有两种方法)
1、在成员变量上加@Value(“”)【基本不用】
2、在成员变量的set方法上加@Value(“”),就可以把tom的值赋给name
在这里插入图片描述
(2)对象类型注入(分为自动注入和手动注入,推荐手动注入)
自动装配
在这里插入图片描述
手动装配
在这里插入图片描述
6、 使用spring管理对象时的程序:
在这里插入图片描述
即利用classpathxmlapplicationcontext获取容器,再在容器中获取对象
7、 AOP(Aspect Oriented Program面向切面编程)
特点:横向重复,纵向抽取
在这里插入图片描述
织入操作是在applicationcontext.xml中进行的,使用</aop:config>

7.1Spring中AOP的实现
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第四步中配置切点时:

其中,id是给这个切点起的名字,可以随意起。
如果只想给save方法进行织入操作,则可以

即execution()的括号中写切入点。

8、 spring提供了一个可以操作数据库的对象,对象封装了jdbc技术
JDBCTemplate(JDBC模板)
在这里插入图片描述
8.1、 将数据库连接池,JDBC模板也都放入spring容器中。
在这里插入图片描述
4、使用:
在这里插入图片描述
将userDao注入给ud
5、更新数据库
在这里插入图片描述
10、 Spring管理事务
先导包、再准备目标对象、通知对象,再配置:
(1) applicationcontext.xml配置
只需要将事务管理的代码织入到目标对象中即可,而且事务管理的代码spring已经给了(spring的事务管理其实就是一个AOP中的环绕通知,这里spring已经写好了),所以我们只需要配置就行了。需要配置事务通知,配置目标对象,配置织入
1》、先配置事务管理::
DataSourceTransactionmanager
TransactionTemplate(事务模板)
,TransactionTemplate模板封装了事务的操作,使得我们只需要配置织入就行了。
在这里插入图片描述
2》、配置事务通知
在这里插入图片描述
3》、配置目标对象
在这里插入图片描述
4》、配置织入
在这里插入图片描述
(2) 注解配置
1》配置事务管理
注意:配置DataSourceTransactionmanagerTransactionTemplate(事务模板),TransactionTemplate模板封装了事务的操作,使得我们只需要配置织入就行了。
在这里插入图片描述
2》、在applicationcontext.xml中加入这句代码,开启注解管理事务
在这里插入图片描述
4》、在类上加上蓝色的这一行(也可以在方法上加,方法上加的注解会覆盖掉类上的这句话(可以修改属性))
在这里插入图片描述

Mybatis:
1、(1)SqlMapConfig.xml是mybatis的全局配置文件,配置了运行环境等
(2)Mapper.xml文件即是sql映射文件,配置了操作数据库的sql语句,此文件要在SqlMapConfig.xml中加载。
2、具体过程
MybatisTest编写测试程序如下:

public class MybatisTest {
	private SqlSessionFactory sqlSessionFactory = null;
	@Before
	public void init() throws Exception {
		// 1. 创建SqlSessionFactoryBuilder对象
		SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
		// 2. 加载SqlMapConfig.xml配置文件
		InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");

		// 3. 创建SqlSessionFactory对象
		this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
	}
	@Test
	public void testQueryUserById() throws Exception {
		// 4. 创建SqlSession对象
		SqlSession sqlSession = sqlSessionFactory.openSession();
		// 5. 执行SqlSession对象执行查询,获取结果User
		// 第一个参数是User.xml的statement的id,第二个参数是执行sql需要的参数;
		Object user = sqlSession.selectOne("queryUserById", 1);
		// 6. 打印结果
		System.out.println(user);
		// 7. 释放资源
		sqlSession.close();
	}
}

3、#{}和${}的区别是什么?
#{}是占位符,用?代替,相当于对数据 加上 双引号,可以防止sql注入攻击
${}相当于直接显示数据
执行SQL:select * from emp where name = #{employeeName}
参数:employeeName=>Smith
解析后执行的SQL:select * from emp where name = ?

示例2:

执行SQL:select * from emp where name = ${employeeName}
参数:employeeName传入值为:Smith
解析后执行的SQL:Select * from emp where name =Smith

4、(1)原始Dao开发模式,需要开发者自己写DAO接口,DAO实现类,和映射文件(usermapper.xml),再将usermapper.xml加载到sqlmapconfig.xml中
(2)Mapper动态代理方式,只需要自己写一个DAO接口,一个映射文件(usermapper.xml),
再将usermapper.xml加载到sqlmapconfig.xml中
在这里插入图片描述
即:动态代理要求mapper.xml中sql的id、输入输出参数类型和DAO接口的方法名、输入输出参数类型一致,且mapper.xml的namespace与DAO接口的类路径相同。
5、
在这里插入图片描述

Springmvc
1、 springmvc的流程
在这里插入图片描述
2、 springmvc.xml是核心配置文件
由于springmvc本身就是spring的子项目,所以对spring的兼容性很好,故springmvc.xml中只需要配置一个Controller扫描就可以了。
3、 @RequestMaping(“/itemlist.action”)注解中放的是请求的url。
4、 使用modelAndView存放数据并返回。
5、 Springmvc架构:
在这里插入图片描述
(1) 用户发送请求到前端控制器
(2) 前端控制器调用处理器映射器查询相应的处理器
(3) 前端控制器使用处理器适配器调用处理器,产生结果
(4) 前端控制器调用视图解析器处理结果
(5) 前端控制器渲染结果并给用户返回数据。
其中,处理器映射器,处理器适配器,视图解析器不用开发者自己写(是springmvc的三大组件,可以在springmvc.xml中加载)。开发者只需要写处理器和视图
6、 解决post乱码问题:
在web.xml中加入
在这里插入图片描述
SSM整合
在这里插入图片描述
在这里插入图片描述
3、配置监听器加载spring
4、配置过滤器,解决post的乱码问题

解释:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:处理器映射器、处理器适配器、视图解析器是springmvc的三大组件,处理器映射器、处理器适配器可以自动加载,所以只需要配置视图解析器。

1、● 请谈一谈Spring中自动装配的方式有哪些?

  • no:不进行自动装配,手动设置Bean的依赖关系。
  • byName:根据Bean的名字进行自动装配。
  • byType:根据Bean的类型进行自动装配。
  • constructor:类似于byType,不过是应用于构造器的参数,如果正好有一个Bean与构造器的参数类型相同则可以自动装配,否则会导致错误。
  • autodetect:如果有默认的构造器,则通过constructor的方式进行自动装配,否则使用byType的方式进行自动装配。

自动装配没有自定义装配方式那么精确,而且不能自动装配简单属性(基本类型、字符串等),在使用时应注意。

2、● 请问Spring中Bean的作用域有哪些?
在Spring的早期版本中,仅有两个作用域:singleton和prototype,前者表示Bean以单例的方式存在;后者表示每次从容器中调用Bean时,都会返回一个新的实例,prototype通常翻译为原型。

3、● 请问什么是IoC和DI?并且简要说明一下DI是如何实现的?
IoC叫控制反转,是Inversion of Control的缩写,DI(Dependency Injection)叫依赖注入,是对IoC更简单的诠释。
控制反转是将我们创建对象的方式反转了,以前对象的创建是由开发人员new出来的,使用spring以后,对象的创建以及依赖关系可以有spring完成创建及注入。
依赖注入就是将属性注入到对象当中,是实现控制反转思想的必要条件。

4、● 请说明一下Spring中BeanFactory和ApplicationContext的区别是什么?
BeanFactory:
BeanFactory是spring中比较原始,比较古老的Factory。因为比较古老,所以BeanFactory无法支持spring插件,例如:AOP、Web应用等功能。

ApplicationContext
ApplicationContext是BeanFactory的子类,因为古老的BeanFactory无法满足不断更新的spring的需求,于是ApplicationContext就基本上代替了BeanFactory的工作,以一种更面向框架的工作方式以及对上下文进行分层和实现继承,并在这个基础上对功能进行扩展:
<1>MessageSource, 提供国际化的消息访问
<2>资源访问(如URL和文件)
<3>事件传递
<4>Bean的自动装配
<5>各种不同应用层的Context实现

区别:

<1>如果使用ApplicationContext,如果配置的bean是singleton,那么不管你有没有或想不想用它,它都会被实例化。好处是可以预先加载,坏处是浪费内存。
<2>BeanFactory,当使用BeanFactory实例化对象时,配置的bean不会马上被实例化,而是等到你使用该bean的时候(getBean)才会被实例化。好处是节约内存,坏处是速度比较慢。多用于移动设备的开发。
<3>没有特殊要求的情况下,应该使用ApplicationContext完成。因为BeanFactory能完成的事情,ApplicationContext都能完成,并且提供了更多接近现在开发的功能。

5、● 请简单说明一下依赖注入的方式有哪几种?以及这些方法如何使用?
(1) set注入
<property name=” ” value=””> 依赖其他类型
<property name=” ” ref=”类名”> 依赖的是一个类
(2) 构造函数注入
在这里插入图片描述
(3)接口注入

6、● 请说明一下@Controller和@RestController的区别是什么?
@RestController注解相当于@ResponseBody + @Controller合在一起的作用

@RestController注解,相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面

7、@RequestMapping、@RequestBody和@ResponseBody
@RequestMapping 是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径;用于方法上,表示在类的父路径下追加方法上注解中的地址将会访问到该方法,此处需注意@RequestMapping用在类上可以没用,但是用在方法上必须有。

@ResponseBody是作用在方法上的,通常是在使用 @RequestMapping 后。@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中
@RequestBody是作用在形参列表上,用于将前台发送过来固定格式的数据【xml 格式或者 json等】封装为对应的 JavaBean 对象,封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上。

@RequestMapping("/login.do")
    @ResponseBody
    public Object login(@RequestBody User loginUuser, HttpSession session) {
        user = userService.checkLogin(loginUser);
        session.setAttribute("user", user);
        return new JsonResult(user);
    }

8、● 请问在以前的学习中有使用过Spring里面的注解吗?如果有请谈一下autowired 和resource区别是什么?
1)@Autowired(自动装配)
在这里插入图片描述
即在对象上方写上@Autowired
这种方法的思想是在容器中找有没有Car类型的对象(不是按照名字,只按照类型找),如果有,则把这个对象装入到User对象中
但是这样装配有问题:如果匹配多个类型一致的对象.将无法选择具体注入哪一个对象.
解决方法:加一个辅助注解,加上一个@Qualifier(“xxx”)
即,使用@Qualifier注解告诉spring容器自动装配哪个名称的对象(上面的例子中名字是xxx)
在这里插入图片描述
(2)@Resource(手动装配)
即在对象上方写上@Resource(name=“xxx”),手动注入,指定注入哪个名称的对象
在这里插入图片描述
9、● 请介绍一下bean的生命周期
https://blog.csdn.net/w_linux/article/details/80086950
在这里插入图片描述
在IoC容器启动之后,并不会马上就实例化相应的bean,此时容器仅仅拥有所有对象的BeanDefinition(BeanDefinition:是容器依赖某些工具加载的XML配置信息进行解析和分析,并将分析后的信息编组为相应的BeanDefinition)。只有当getBean()调用时才是有可能触发Bean实例化阶段的活动

####可以简述为以下九步

实例化bean对象(通过构造方法或者工厂方法)
设置对象属性(setter等)(依赖注入)
如果Bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的ID。(和下面的一条均属于检查Aware接口)
如果Bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身
将Bean实例传递给Bean的前置处理器的postProcessBeforeInitialization(Object bean, String beanname)方法
调用Bean的初始化方法
将Bean实例传递给Bean的后置处理器的postProcessAfterInitialization(Object bean, String beanname)方法
使用Bean
容器关闭之前,调用Bean的销毁方法

10、AOP
横向重复、纵向抽取
AOP(Aspect Orient Programming),指面向切面编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理。
Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。JDK动态代理需要被代理对象实现接口,才能产生代理对象。CGLIB不需要被代理对象有实现接口。
在这里插入图片描述

11、● 请简单谈一下spring框架的优点都有哪些?
Spring是一个轻量级的DI和AOP容器框架,在项目的中的使用越来越广泛,它的优点主要有以下几点:

Spring是一个非侵入式框架,其目标是使应用程序代码对框架的依赖最小化,应用代码可以在没有Spring或者其他容器的情况运行。

Spring提供了一个一致的编程模型,使应用直接使用POJO开发,从而可以使运行环境隔离开来。

Spring推动应用的设计风格向面向对象及面向接口编程转变,提高了代码的重用性和可测试性。

Spring改进了结构体系的选择,虽然作为应用平台,Spring可以帮助我们选择不同的技术实现,比如从Hibernate切换到其他的ORM工具,从Struts切换到Spring MVC,尽管我们通常不会这么做,但是我们在技术方案上选择使用Spring作为应用平台,Spring至少为我们提供了这种可能性的选择,从而降低了平台锁定风险。

12、springmvc的工作流程
在这里插入图片描述
(1) 用户发送请求到前端控制器
(2) 前端控制器调用处理器映射器查询相应的处理器
(3) 前端控制器使用处理器适配器调用处理器,返回一个ModelAndView对象(包含了数据模型以及相应的视图的信息)。
(4) 前端控制器调用视图解析器处理结果
(5) 前端控制器渲染结果并给用户返回数据。
其中,处理器映射器,处理器适配器,视图解析器不用开发者自己写(是springmvc的三大组件,可以在springmvc.xml中加载)。开发者只需要写处理器和视图

13、spring在SSM中的作用
Spring是一个轻量级框架,也是一个容器,Spring实质上讲就是一个Bean工厂,主要用来管理Bean的生命周期和框架集成。有IOC控制反转,DI依赖注入,控制反转是把dao依赖注入到servic层,然后service层反转给action层,Spring的顶层容器为BeanFactory,常用的ApplicationContext为它的子接口,实现了工厂模式,Spring还提供了AOP的支持,方便在切面级开发。

14、Spring的注解
• @Controller
• @Service
• @Component
• @RequestMapping
• @Resource、@Autowired
• @ResponseBody
• @Transactional

15、SpringMvc中函数的返回值是什么
返回值可以有很多类型,有String, ModelAndView,List,Set等,一般用String比较好,如果是AJAX请求,返回的可以是一个集合

16、Spring 支持的事务管理类型有哪些?你在项目中使用哪种方式?怎么理解全局事务和局部事务?
Spring 支持编程式事务管理和声明式事务管理。许多 Spring 框架的用户选择声明式事务管理,因为这种方式和应用程序的关联较少,因此更加符合轻量级容器的概念。声明式事务管理要优于编程式事务管理,尽管在灵活性方面它弱于编程式事务管理,因为编程式事务允许你通过代码控制业务。

事务分为全局事务和局部事务。全局事务由应用服务器管理,需要底层服务器 JTA 支持(如 WebLogic、 WildFly等)。局部事务和底层采用的持久化方案有关,例如使用 JDBC 进行持久化时,需要使用 Connetion 对象来操作事务;而采用 Hibernate 进行持久化时,需要使用 Session 对象来操作事务

17、简单介绍下你对mybatis的理解?

  1. mybatis配置
  2. SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
  3. mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
  4. 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
  5. 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行

18、● 请问MyBatis中的动态SQL是什么意思?
对于一些复杂的查询,我们可能会指定多个查询条件,但是这些条件可能存在也可能不存在,需要根据用户指定的条件动态生成SQL语句。MyBatis提供了动态SQL的功能来解决这个问题。MyBatis中用于实现动态SQL的元素主要有:

  • if
  • choose / when / otherwise
  • trim
  • where
  • set
  • foreach

19、https://www.cnblogs.com/lenve/p/10817619.html

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值