说一说你对Spring IoC的理解
IoC是控制反转的意思,是一种面向对象编程的设计思想。IoC则可以解决这种问题,它可以帮我们维护对象与对象之间的依赖关系,并且降低对象之间的耦合度。之前需要自己new的对象,现在交给ioc容器来解决,最重要的做用是管理bean,ioc的底层是基于反射来实现的


说到IoC就不得不说DI,DI是依赖注入的意思,它是IoC实现的实现方式。由于IoC这个词汇比较抽象而DI比较直观,所以很多时候我们就用DI来代替它,在很多时候我们简单地将IOC和DI划等号,这是一种习惯。实现依赖注入的关键是IoC容器,它的本质就是一个工厂。
说一说你对Spring AOP的理解
AOP是一种编程思想,是通过预编译方式和运行期动态代理的方式,在不修改源代码的情况下实现给程序动态统一添加功能的技术。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。所谓切面,相当于应用对象间的横切点,我们可以将其单独抽象为单独的模块。
利用AOP可以对业务逻辑各个部分进行隔离,从而使业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高开发效率。
AOP可以有多种实现方式,而Spring AOP支持如下两种实现方式。
JDK动态代理:这是Java提供的动态代理技术,可以在运行时创建接口的代理实例。Spring AOP默认采用这种方式,在接口的代理实例中织入代码。
CGLib动态代理:采用底层的字节码技术,在运行时创建子类代理的实例。当目标对象不存在接口时,Spring AOP就会采用这种方式,在子类实例中织入代码。
什么是MVC
MVC是一种设计模式,在这种模式下软件被分为三层,即Model(模型)、View(视图)、Controller(控制器)。Model代表的是数据,View代表的是用户界面,Controller代表的是数据的处理逻辑,它是Model和View这两层的桥梁。将软件分层的好处是,可以将对象之间的耦合度降低,便于代码的维护。
Model:指从现实世界中抽象出来的对象模型,是应用逻辑的反应。它封装了数据和对数据的操作,是实际进行数据处理的地方。在MVC的三个部件中,模型拥有最多的处理任务。被模型返回的数据是中立的,模型与数据格式无关,这样一个模型能为多个视图提供数据,由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。
View:是应用和用户之间的接口,它负责将应用显示给用户和显示模型的状态。MVC的好处之一在于它能为应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,它只是作为一种输出数据并允许用户操纵的方式。
Controller:控制器负责视图和模型之间的交互,控制对用户输入的响应、响应方式和流程。它主要负责两方面的动作,一是把用户的请求分发到相应的模型,二是把模型的改变及时地反映到视图上。
什么是依赖注入?有哪些不同类型的依赖注入方式?
依赖注入(Dependency Injection)是一种设计模式,也是Spring框架的核心概念之一。其作用是去除组件之间的依赖关系,实现解耦合。用到的注解:@Autowired
Spring实现依赖注入有三种方式:注解方式(官方推荐方式)、xml配置文件方式、javaConfig方式。
你是如何使用Spring的,它有什么作用?
1.Spring在三层结构中的作用?
可以对持久层的框架Mybatis提供很好的支持,同时还可以支持事务的处理。
2.Spring中的核心的概念:IOC和AOP
AOP面向切面编程,它是对OOP面向对象编程的补充。作用:可以处理事务,也可以处理日志。
AOP核心的思想就是在某一个方法(切入点)前后做一些操作。
3.常用的配制标签:

4.AOP的底层实现原理是基于什么设计模式的:动态代理的设计模式
1什么是代理模式:代理模式是指一个对象A通过持有另一个对象B,可以只有B对象同样的行为。
单例也是一种动态代理
代理模式一般来说会有三个角色
1.抽象(subject)主题角色
2.真实角色(Real Subject)
3.代理角色(Proxy)
aop:pointcut生成一个切入点 method.invoke获取切入点

动态代理:
1.JDK的动态代理
2.CGLIB的动态代理(spring提供)
两个动态代理有什么区别?
1.JDK public class SuperMarketInvocationHandlerimplements InvocationHandler{


@Override
public Objectinvoke(Object proxy, Method method, Object[] args)throws Throwable {
System.out.println("在切入点之前做一些操作(开启事务)");
Object result = method.invoke(superMarketAction, args);//调用方法,获取到切入点
System.out.println("在切入点之后做一些操作(提交事务)");
return result;
}
}
CGLIB

2.jdk 的动态代理需要自己生成代理对象
而CGLIB动态代理 enhancer.create();
3.JDK的动态代理只能返回被代理对象所对应的接口
SuperMarketAction marketAction = (SuperMarketAction) marketInvocationHandler.createProxy();
CGLIB动态代理可以返回接口,也可以返回实现类的对象
SpringBoot是一个快速开发的框架,是基于SSM。主要的作用就是简化开发,实现零配制。
Spring、SpringBoot、 SpringMVC的关系?
Spring 包含了多个功能模块(上面刚刚提高过),其中最重要的是 Spring-Core(主要提供 IoC 依赖注入功能的支持) 模块, Spring 中的其他模块(比如 Spring MVC)的功能实现基本都需要依赖于该模块。

Spring MVC 是 Spring 中的一个很重要的模块,主要赋予 Spring 快速构建 MVC 架构的 Web 程序的能力。MVC 是模型(Model)、视图(View)、控制器(Controller)的简写,其核心思想是通过将业务逻辑、数据、显示分离来组织代码。

使用 Spring 进行开发各种配置过于麻烦比如开启某些 Spring 特性时,需要用 XML 或 Java 进行显式配置。于是,Spring Boot 诞生了!
Spring 旨在简化 J2EE 企业应用程序开发。Spring Boot 旨在简化 Spring 开发(减少配置文件,开箱即用!)。
Spring Boot 只是简化了配置,如果你需要构建 MVC 架构的 Web 程序,你还是需要使用 Spring MVC 作为 MVC 框架,只是说 Spring Boot 帮你简化了 Spring MVC 的很多配置,真正做到开箱即用!
SpringMVC的工作流程?客户端发送一个请求,你是如何通过这个请求找到对应的资源的?
客户端想服务器端发送请求(?key=value&key1=value1),会由SpringMVC的前端控制器DispatcherServlet拦截请求并分发给相应的Controller来处理客户端的请求。controller中可以直接使用po(bean)来获取前台的请求参数(规范:请求参数中的key 要与po中的属性名相同),最终将结果要以json的格式返回给客户端浏览器(使用的注解:@RestController = @Controller+@ResponseBody),比Servlet方便,不用getParmater()获取请求参数。
AOP(面向切面编程)
AOP:它是对OOP的补充和扩展,作用:可以处理事务,可以处理日志,在某一个方法前后处理,动态代理。
在切入点前后要进行的操作
AOP:全称是 Aspect Oriented Programming 即:面向切面编程。
简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有方法进行增强。
Spring AOP 可以使用xml文件形式实现,也可以使用注解方式实现。下面只使用注解方式实现Spring AOP。
1.先将方面代码抽取出来 2.运行时将业务代码和方面代码编织在一起
面试题: Jdk的动态代理与Spring中提供的CGLIB的动态代理的区别。
1.
```java
JDK public class SuperMarketInvocationHandler implements InvocationHandler
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("在切入点之前做一些操作(开始事务)");
Object result = method.invoke(superMarketAction,args); //获取到切入点
System.out.println("在切入点之后做一些操作(提交事务)");
return result;
}```
2. Spring提供的 CGCGLIB public class MethodHandler implements MethodInterceptor
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("使用cglib代理调用方法之前做的操作");
Object result = methodProxy.invokeSuper(o,objects); //切入点
System.out.println("使用cglib代理调用方法之后做的操作");
return result;
}
2. jdk的动态代理需要自己生成代理对象
return Proxy.newProxyInstance(superMarketAction.getClass().getClassLoader(),
superMarketAction.getClass().getInterfaces(),this);
而CGLIB动态代理 enhancer.create();
3. Jdk的动态代理只能返回被代理对象所对应的接口
```java
SuperMarketAction(接口) marketAction= (SuperMarketAction) marketInvocationHandler.createProxy();
```
CGLIB 可以返回接口也可以返回实现类的对象
MappingFactory工厂,单例,