《天净沙·我·Spring》 双非菜鸡奇葩,面试项目框架,java java,卑微学子去哪?


别问 问就是为了面试豁出了老命
[文章都是搬运艿艿的]
[http://svip.iocoder.cn/Java/Core/Interview/]

Spring 核心组件 (8大模块)

Spring Core

核心容易,主要是提供Ioc的依赖注入功能

Spring Aspects

为了让Spring可以更好的融合AspectJ,实际上也是切面

Spring AOP

提供了面向切面编程的实现

Spring JDBC

数据库连接驱动

Spring JMS

Java 消息服务( Java Message Service , JMS )

Spring ORM

ORM的全称是Object Relational Mapping,即对象关系映射 ==> 为Mybatis,Hibernate提供支持

Spring Web

为Web应用提供支持

Spring Test

顾名思义就是为了测试 Junit等

@RestController vs @Controller

@Controller

如果是@Controler,Return的值将直接指向一个页面,或者用转发和重定向的方式
如果加上@ResponseBody 那么就是@Controller

@RestController

也就是 前后分离 模式下最常用的解决方式

Request / Response 的过程

DispatcherServlet -> Handler Mapping -> Controller/RestController
如果是 @Controller则是继续到View层 ,如果是@RestController 直接返回Client

谈谈自己对IOC的理解

谈到Ioc就是一种托付的关系,最传统的应用所创建的对象等全部都托付给系统本身之间的
依赖,无论耦合度,都是在不断的变大,Ioc控制反转,也就是责任托付从系统本身变成了
由Ioc容器管理,我们只需要明白自己需要什么,不用去想怎么管理怎么创建,如果需要的话可以直接使用xml,注解等方式直接配置引用

Ioc初始化机制

XML >读取> Resource >解析> BeanDefinition >注册> BeanFactory

xml 是程序员的配置 ,并根据反射机制可以通过BeanDefinition映射,在BeanFactory中创建出对象

AOP 面向切面编程

Aop就是一种想要把自己构造出来的方法切入到某个已经写好的类指定的方法之中

1.通知(Advice)

自己需要在某类的指定方法上实现的功能,日志,事务,安全等功能

2.连接点(JoinPoint)

就是Spring中可以插入通知的地方

3.切入点(Pointcut)

就是在需要插入通知的方法重新实现一下,可以说是作为一个标记

4.切面(Aspect)

就是切入点和通知放在一起,同时构成的一个类的某个位置

5.引入(introduction)

就是把切面的功能正式融入到类中使用

6.目标(target)

别切入的类

7.代理(proxy)

Java的动态代理机制  

8.织入(weaving)

引入到类中后,开始正式的调用

串读理解

Java的动态代理机制

Proxy + InvocationHandler

让目标类implemet InvocationHandler
再调用的时候,利用Proxy的静态方法newProxyInstance() ,通过反射机制,调用目标类的方法等

CGLIB

生成目标类的一个子类

解读

在理解切面之后,深入到方法本身,如何去插入一个另外写好的类,就是在程序运行时
利用动态代理的特点,在调用某个方法的时候,再调用proxy将另一个方法调用进去,
Before/After等,所以与其说是切入了方法,不如说是切入到了动态代理的执行过程中

SpringBean

SpringBean 的作用域

Request :每次HTTP请求都会创建一个新的Bean
Session :同一个HTTP Session共享一个Bean,不同Session使用不同Bean
singleton : 唯一的bean实例
prototype : 每次请求都会创建一个新的bean实例

SpringBean没有解决线程安全问题
可以用ThreadLocal成员变量

Bean的生命周期

Bean生命周期

  1. 创建调用构造函数
  2. set方法注入属性
  3. BeanNameAware
  4. BeanFactoryAware
  5. ApplicationContextAware
  6. BeanPostProcessor的before方法
  7. initializingBean
  8. 自定义init方法
  9. BeanPostProcessor的after方法
  10. 使用
  11. 容器的销毁
  12. DisposableBean的destry
  13. 自定义的销毁方法
  • Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化

  • Bean实例化后对将Bean的引入和值注入到Bean的属性中

  • 如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法

  • 如果Bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入

  • 如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来。

  • 如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。

  • 如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用

  • 如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。

  • 此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。

  • 如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。

    @Bean 和 @Component

    @Bean

    修饰方法级 可以用Autowired装配

    @Component

    用于修饰类级别 可以用@CompontScan装配

SpringMVC 工作流程

  1. client 向 DispatcherServlet 发送请求
  2. DispatcherServlet根据请求信息调用HandlerMapping ,解析请求到handle
  3. 解析到handle以后开始用HandlerAdapter适配器处理
  4. HandlerAdapter会根据Haddler调用真正的处理器处理请求和逻辑
  5. 之后返回一个ModelAndView对象
  6. ViewResolver会把逻辑View查询具体的视图
  7. DispatcherServlet会把返回的Model给view 或者 Client

Spring 事务

  1. 编程式事务:在代码中用
  2. 声明式事务(xml,注解):在配置文件中用

隔离等问题跟数据库一致