(1) 写出Spring的优点和缺点
优点:
1.使用Spring的IOC容器,将对象之间的依赖关系交给Spring,降低组件之间的耦合性,让我们更专注于应用逻辑。
2.可以提供众多服务,事务管理,WS等。
3.AOP的很好支持,方便面向切面编程。
4.对主流的框架提供了很好的集成支持,如hibernate,Struts2,JPA等
5.Spring DI机制降低了业务对象替换的复杂性。
6.Spring属于低侵入,代码污染极低。
7.Spring的高度可开放性,并不强制依赖于Spring,开发者可以自由选择Spring部分或全部。
缺点:
1.jsp中要写很多代码、控制器过于灵活,缺少一个公用控制器。
2.Spring不支持分布式,这也是EJB仍然在用的原因之一。
(2) 什么是IOC
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。
(3) 什么是依赖注入(DI)
依赖注入,全名Dependency Injection,简称DI。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。
(4) IOC注入有哪几种方式
构造器注入,setter注入,静态工厂注入,实例工程注入,基于注解的注入。
(5) IOC优点和缺点
IOC的优点:
实现组件之间的解耦,提高程序的灵活性和可维护性。
IOC的缺点:
1、创建对象的步骤变复杂了,不直观,当然这是对不习惯这种方式的人来说的。
2、因为使用反射来创建对象,所以在效率上会有些损耗。但相对于程序的灵活性和可维护性来说,这点损耗是微不足道的。
3、缺少IDE重构的支持,如果修改了类名,还需到XML文件中手动修改,这似乎是所有XML方式的缺憾所在。
(6) Spring中bean有几种scope,具体说两个
request:每次http请求将会有各自的bean实例,类似于prototype。
session:在一个http session中,一个bean定义对应一个bean实例。
(7) 什么是AOP
全称是 Aspect Oriented Programming 即:面向切面编程,面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
(8) 切面有几种类型的通知,分别是什么
@Before: 前置通知, 在方法执行之前执行。
@After: 后置通知, 在方法执行之后执行。
@AfterRunning: 返回通知, 在方法返回结果之后执行。
@AfterThrowing: 异常通知, 在方法抛出异常之后。
@Around: 环绕通知, 围绕着方法执行。
(9) 什么是切点,什么是切面
切入点(Pointcut) 在连接点的基础上,来定义切入点,你的一个类里,有15个方法,那就有十几个连接点了对吧,但是你并不想在所有方法附件都使用通知(使用叫织入,下面再说),你只是想让其中几个,在调用这几个方法之前、之后或者抛出异常时干点什么,那么就用切入点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。
切面(Aspect) 切面是通知和切入点的结合。现在发现了吧,没连接点什么事,链接点就是为了让你好理解切点搞出来的,明白这个概念就行了。通知说明了干什么和什么时候干(什么时候通过方法名中的befor,after,around等就能知道),二切入点说明了在哪干(指定到底是哪个方法),这就是一个完整的切面定义。
(10) 什么是MVC框架,SpringMVC的优点
Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet。
优点:
1.清晰地角色划分,Spring MVC 在 Model、View 和 Controller 方面提供了一个非常清晰的角色划分,这3个方面真正是各司其职,各负其责。
2.灵活的配置功能,可以把类当作 Bean 通过 XML 进行配置。
3.提供了大量的控制器接口和实现类,开发者可以使用 Spring 提供的控制器实现类,也可以自己实现控制器接口。
4.真正做到与 View 层的实现无关。它不会强制开发者使用 JSP,可以根据项目需求使用 Velocity、FreeMarker 等技术。
5.国际化支持。
6.面向接口编程。
7.与 Spring 框架无缝集成。
(11) 写出SpringMVC的几个组件
1.DispatcherServlet
这个控件是SpringMVC 最核心的一个控件,顾名思义其实他就是一个Servlet,是Spring写好的一个Servlet。
2.HandleMapping
控件标明了路径与Controller的对应关系,不同的路径访问不同的Controller。
- Controller
用来处理业务逻辑的Java类。 - ModeAndView
Mode用来绑定处理后所得的数据,View视图名。 - ViewResolver
视图解析器明确了视图名与视图对象的关系,是调用demo.jsp还是调用demo.html,以及明确视图的位置。
(12) SpringMVC的工作流程
1.用户发送请求至前端控制器DispatcherServlet
2.DispatcherServlet收到请求调用处理器映射器HandlerMapping。
3.处理器映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给DispatcherServlet。
4.DispatcherServlet根据处理器Handler获取处理器适配器HandlerAdapter执行HandlerAdapter处理一系列的操作,如:参数封装,数据格式转换,数据验证等操作
5.执行处理器Handler(Controller,也叫页面控制器)。
6.Handler执行完成返回ModelAndView
7.HandlerAdapter将Handler执行结果ModelAndView返回到DispatcherServlet
8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9.ViewReslover解析后返回具体View
10.DispatcherServlet对View进行渲染视图(即将模型数据model填充至视图中)。
11.DispatcherServlet响应用户。
(13) 自动装配有哪几种方式,分别是什么
1.byName实际是根据set后面的属性去注入
2.byType
3.constructor
3.no方式自己设置依赖关系
5.default方式
(14) 说几个声明Bean的注解
@Component 组件,没有明确的角色
@Service 在业务逻辑层使用(service层)
@Repository 在数据访问层使用(dao层)
@Controller 在展现层使用,控制器的声明(C)
(15) 声明切面注解是哪个
Spring支持AspectJ的注解式切面编程。
@Aspect 声明一个切面(类上)
使用@After、@Before、@Around定义建言(advice),可直接将拦截规则(切点)作为参数。
@After 在方法执行之后执行(方法上)
@Before 在方法执行之前执行(方法上)
@Around 在方法执行之前与之后执行(方法上)
@PointCut 声明切点
在java配置类中使用@EnableAspectJAutoProxy注解开启Spring对AspectJ代理的支持(类上)
(16) 映射web请求注解是?
@RequestMapping
(17) 接收路径参数用哪个注解?
@PathVariable 用于接收路径参数。
(18) 解释一下@Qualifier注解
@Qualifier是Spring中的注解,是在使用Spring框架中@Autowired注解进行自动注入时,Spring 容器中匹配的候选Bean数目必须有且仅有一个 。
(19) Spring事务实现方式有?
spring框架提供了两种事务实现方式:编程式事务、声明式事务。
(20) 什么是MyBatis
mybatis是一款用于持久层的、轻量级的半自动化ORM框架,封装了所有jdbc操作以及设置查询参数和获取结果集的操作,支持自定义sql、存储过程和高级映射。
(21) MyBatis的优点和缺点
一、MyBatis 框架的优点: - 与JDBC相比,减少了50%以上的代码量。
- MyBatis是最简单的持久化框架,小巧并且简单易学。
- MyBatis灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL可以写在XML里(还可以以注解方式写到Java代码中),从程序代码中彻底分离,降低耦合度,便于统一管理和优化,可重用。
- 提供XML标签,支持编写动态SQL语句(XML中使用 if, else 等)。
- 提供映射标签,支持对象与数据库的ORM字段关系映射(可以在XML中配置映射关系,也可以使用注解配置映射关系)。
二、MyBatis 框架的缺点: - SQL语句的编写工作量较大,尤其是字段多、关联表多时,更是如此,对开发人员编写SQL语句的功底有一定要求。
- SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
- 与JDBC相比,增加了调试代码和查错的难度(使用了ORM需要额外花费时间学习ORM的框架,调试错误比JDBC难很多)。封装程度越高,查错越难。
- JDBC可以单步调试,MyBatis不能单步调试。
(22) MyBatis有哪些核心组件,简要说明一下
SqlSessionFactoryBuilder(构造器):根据配置来构造SqlSessionFactory。配置方式有2种:xml和java config,使用的设计模式是建造者(Builder)模式。
SqlSessionFactory(工厂接口):用于生产SqlSession的工厂,使用的设计模式是工厂(Factory)模式。
SqlSession(会话):包含了执行SQL的所有的方法。
Mapper(会话):完成Java与SQL语句之间的映射,也就是我们平时说的xxxMapper.java和xxxMapper.xml文件,负责发送SQL去执行,并返回结果。
(23) #{}和${}的区别是什么
答:#{}是预编译处理,${}是字符串替换。
(24) MyBatis中的9个动态标签是?
Trim、where、set、 foreach 、if、choose、when、otherwise、bind
(25) XML映射文件中,有哪些标签
常见的有Select,insert,update,delete 还有、 、 、 、 、再加上9中动态标签 、 、 、 、 、 、 、 、
(26) 为什么Mapper接口没有实现类,却能被正常调用
因为被引用的是动态代理,通过反射机制给接口生成对象,动态代理反射对象,这样接口被调用,就会触发动态代理,就成功调用了。
(27) MyBatis中用注解好还是XML好,为什么
用注解好,XML也好,注解优点开发速度快,开发量小,而XML恰恰相反,而注解开发速度仅限于简单SQL语句,对于复杂的SQL语句,就有点力不从心,甚至带来混乱,当然也可以采取混用,简单语句用注解,复杂语句用XML也行,网上挺多人说注解终究替代XML,不管结果怎样,我跟大势所趋。
(28) 当实体类属性名和数据表中字段名不一致时怎么办
可以通过在查询的SQL语句中定义字段的别名,让字段名的别名和实体类的属性名一致。也可以通过来映射字段名和实体类属性名的一一对应的关系。
(29) MyBatis映射文件中嵌套查询用什么标签
Collection标签
(30) MyBatis映射文件中怎么写Like模糊查询
1.’%${question}%’
2.CONCAT(‘%’,#{question},’%’)
3.NAME like ‘%’|| #{name} || ‘%’
4.使用bind