面试宝典总结二【Spring】

前言

根据各种方式学习总结,留此博客方便个人查阅。


目标

技术面广度以及深度提升,找到理想工作,离开对日开发。(有大佬收留可私信❀❀)


已更新面试技术总结

面试宝典总结一【Mybatis】


技术方向

必知

1.三层架构

M(model)模型
    pojo+service+dao
        pojo
            对应数据库中的数据表JavaBean
        service
            一些业务判断处理
        dao
            负责数据库交互 CRUD(增查改删)
V(view)视图
    jsp+html
        jsp
            动态网页开发技术
        html
C(controll)控制器
    servlet+SpringMVC+Struts
        servlet
            服务器端程序
        SpringMVC
            构建 Web 应用程序
        Struts
            淘汰技术

2.七大模块

 Spring Core
    核心类库,提供IOC 服务
Spring Context
    提供框架式的Bean 访问方式,以及企业级功能(JNDI.定时任务等),还有认证、邮件校验、EJB、UI
Spring AOP
    面向切面编程
Spring DAO
    对JDBC 的抽象,简化了数据访问异常的处理
Spring ORM
    对现有的ORM 框架的支持
Spring Web
    提供了基本的面向Web 的综合特性,例如多方文件上传
Spring MVC
    提供面向Web 应用的Model-View-Controller 实现

Spring是什么

Spring就是用来管理对象创建依赖关系的技术 

Spring能做什么

1.Spring管理对象之间的依赖关系
2.为service层提供事务
3.整合第三方框架
4.提供DAO层
5.提供控制器
6.web的支持
7.上下文的支持
    上下文:一堆必要的状态码存放专门程序 

Spring的家族产品

Spring
Spring Security
Spring data
Spring Boot
Spting Cloud

获取对象的三种方式

通过类型获取
通过名字获取
通过id获取 

Bean 的调用方式

使用BeanWrapper

    HelloWorld hw=new HelloWorld();
    BeanWrapper bw=new BeanWrapperImpl(hw);
    bw.setPropertyvalue("msg","HelloWorld");
    System.out.println(bw.getPropertyCalue("msg"));

使用BeanFactory

    InputStream is=new FileInputStream("config.xml");
    XmlBeanFactory factory=new XmlBeanFactory(is);
    HelloWorld hw=(HelloWorld) factory.getBean("HelloWorld");
    System.out.println(hw.getMsg());

使用ApplicationConttext

    ApplicationContext actx=new FleSystemXmlApplicationContext("config.xml");
    HelloWorld hw=(HelloWorld) actx.getBean("HelloWorld");
    System.out.println(hw.getMsg()); 

Spring MVC拦截器

<!-- 配置SpringMvc 的拦截器--> 
<mvc:interceptors>
<!-- 配置一个拦截器的Bean 就可以了默认是对所有请求都拦截-->
<bean id="myInterceptor" class="com.et.action.MyHandlerInterceptor"/>
<!-- 只针对部分请求拦截-->
<mvc:interceptor>
      <mvc:mapping path="/modelMap.do" />
      <bean class="com.et.action.MyHandlerInterceptorAdapter" />
</mvc:interceptor> 
</mvc:interceptors> 

 常用注解

@RequestMapping
    处理请求地址映射的注解,可用于类或方法上
@PathVariable
    绑定URI 模板变量值是用来获得请求url 中的动态参数
@RequestParam
    用于将指定的请求参数赋值给方法中的形参
@RequestBody
    读取Request 请求的body 部分数据
@ResponseBody
    用于将Controller 的方法返回的对象,通过适当的HttpMessageConverter 转换为指定格式后,写入到Response 对象的body 数据区(list,Object)
@Configuration
    一个类作为一个IoC 容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring 容器中的Bean。
@Lazy(true)
    表示延迟初始化
@Controller
    标注控制层组件(如struts 中的action)
@DependsOn
    定义Bean 初始化及销毁时的顺序
@Primary
    自动装配时当出现多个Bean 候选者时,被注解为@Primary 的Bean 将作为首选者,否则将抛出异常

bean作用域

singleton
    默认,每个容器中只有一个bean 的实例
prototype
    为每一个bean 请求提供一个实例
request
    为每一个网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收
session
    与request 范围类似,确保每个session 中有一个bean 的实例,在session 过期后,bean 会随之失效
global-session
    全局作用域 

Spring bean的生命周期

Servlet 的生命周期
    实例化
    初始化init()
    接收请求service
    销毁destroy 

Spring 上下文中的Bean 生命周期
    实例化instantiate Bean
        请求到来,调用createBean方法创建bean
    设置对象属性(依赖注入) populate properties
        封装到BeanWrapper,完成相关的设置
    处理Aware 接口
        如果Bean 实现BeanNameAware 执行setBeanName
        如果Bean 实现BeanFactoryAware 或者ApplicationContextAware 设置工厂setBeanFactory 或者上下文对象setApplicationContext
    执行BeanPostProcessor的postProcessBeforeInitialization(Object obj, String s)
    InitializingBean 与init-method
        如果Bean 实现InitializingBean 执行afterPropertiesSet
        如果Bean 在Spring 配置文件中配置了init-method 属性,则会自动调用其配置的初始化方法<bean init-method="init">
    执行BeanPostProcessor的postProcessAfterInitialization(Object obj, String s)方法
    执行业务处理
    DisposableBean
        调用destroy方法
    <bean destroy-method="方法名">
        如果这个Bean 的Spring 配置中配置了destroy-method 属性,会自动调用其配置的销毁方法

IOC和AOP原理

IOC

Spring IOC容器:控制反转
    Spring的IOC容器控制对象的创建
常用注解
    @Component
        当前类的实例化对象放入IOC容器中(全局)
    @Service
        语义化的component,一般用于service层
    @Repository
        语义化的component,一般用于dao层
    @Scope
        用于设置当前类是单例还是多例
    @PostConstruct
        当前类对象存放到IOC容器时,执行的初始化方法
    @PreDestroy
        对象在IOC容器中销毁时,还需要执行的方法(资源回收)
    @Autowired
        根据属性类型实现注入
    @Resource
        通过名字进行注入 

原理
    创建接口UserService
    实现类UserServiceImpl
   普通方式
   UserService user=new UserServiceImpl();
   Spring IOC实现方式
   加入了工厂模式和动态代理
   新增UserServiceFactory
   class UserServiceFactory{
       public UserService getUserServiceFactory(){
           // 通过xml/properties配置文件读取完整的类名
            return Class.forName(UserServiceImpl).newInstance();
       }
   }
   UserServiceFactory factory=new UserServiceFactory ();
   UserService user=factory.getUserServiceFactory();

AOP

面向切面编程
    软件开发中,不属于业务代码,属于可重复使用的代码,具有公共行为和逻辑,这一类称为切面类
    在软件正常运行中,通过动态代理和设计模式编程,称为面向切面编程
好处
    风险控制、用户的行为记录、用户的行为日志、系统运行日志
pom依赖
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

常用注解
    @Component
        将AOP类放入IOC容器
    @Aspect
        表名当前类是切面类
    @Scope(value="singleton")
        切面类一般在类都是单例模式
    @Pointcut(value="execution(* com.hikktn.aop.UserService.*(..))")
        切入点表达式
        execution:用于匹配子表达式
        within:用于匹配指定类型内的方法执行
        this:用于匹配当前AOP代理对象类型的执行方法;注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配
        target:用于匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配
        args:用于匹配当前执行的方法传入的参数为指定类型的执行方法
    @Around(value="pt()")
        环绕的意思,在方法执行的前后来调用
    @AfterReturning(value="pt()")
        方法执行完毕的时候执行
    @AfterThrowing(value="pt()")
        方法异常的时候执行
    @Before(value="qt()")
        在切入点表达式前执行的方法,value是那个方法前执行
    @After(value="qt()")
        方法执行完成后调用qt()方法

spring aop切面织入方式
    通知(Advice)
        通知定义了切面是什么以及何时使用。描述了切面要完成的工作和何时需要执行这个工作。
    连接点(Joinpoint)
        程序能够应用通知的一 个“时机”,这些“时机”就是连接点,例如方法被调用时、异常被抛出时等等。
    切入点(Pointcut)
        通知定义了切面要发生的“故事”和时间,那么切入点就定义了“故事”发生的地点,例如某个类或方法的名称,spring中允许我们方便的用正则表达式来指定
    切面(Aspect)
        通知和切入点共同组成了切面:时间、地点和要发生的“故事”
    引入(Introduction)
        引入允许我们向现有的类添加新的方法和属性(spring提供了一个方法注入的功能)
    目标(Target)
        即被通知的对象,如果没有AOP,那么它的逻辑将要交叉别的事务逻辑,有了AOP之后它可以只关注自己要做的事(AOP让他做爱做的事)
    代理(proxy)
        应用通知的对象,详细内容参见设计模式里面的代理模式
    织入(Weaving)
        把切面应用到目标对象来创建新的代理对象的过程,织入一般发生在如下几个时机:
            (1)编译时:当一个类文件被编译时进行织入,这需要特殊的编译器才可以做的到,例如AspectJ(静态代理)的织入编译器
            (2)类加载时:使用特殊的ClassLoader在目标类被加载到程序之前增强类的字节代码
            (3)运行时:切面在运行的某个时刻被织入,SpringAOP就是以这种方式织入切面的,原理应该是使用了JDK的动态代理技术

原理
    JDK 动态代理和CGLIB 动态代理

 SpringBoot自动装配原理

在Spring 程序main 方法中, 添加@Spring BootApplication 或者@EnableAutoConfiguration 注解, 程序启动时会通过扫描注解自动去maven 中读取每个starter 中的spring.factories 文件,此文件里配置了所
有需要被创建Spring 容器中的Bean。

事务的实现方法和原理

事务特性
    原子性:事务不可分割
    一致性:事务执行的前后,数据完整性保持一致
    隔离性:一个事务执行的时候,不应该受到其他事务的打扰
    持久性:一旦结束,数据就永久的保存到数据库 

DI注解

依赖注入,spring创建对象时,动态依赖注入到bean组件中 

Spring通知类型

前置通知(Before advice)
    在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)
环绕通知(Around Advice)
    在目标方法执行之前和之后都可以执行额外代码的通知。也可以选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行
        控制事物
        权限控制
后置通知(After (finally) advice)
    目标方法执行之后(某连接点退出的时候)执行的通知(不论是正常返回还是异常退出)
        记录日志(方法已经成功调用)
异常后通知(After throwing advice)
    在方法抛出异常退出时执行的通知
        异常处理
最终通知(After returning advice)
    在某连接点(join point)正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回
        记录日志(方法已经调用,但不一定成功) 

Spring如何处理多线程并发问题

使用ThreadLocal解决 

ThreadLocal实例

 BeanFactory和ApplicationContext区别

BeanFactory
    包含了各种Bean 的定义,读取bean 配置文档,管理bean 的加载.实例化,控制bean 的生命周期,维护bean 之间的依赖关系。
    延迟加载形式来注入Bean
ApplicationContext
    ApplicationContext 接口作为BeanFactory 的派生
        继承MessageSource,因此支持国际化
        统一的资源文件访问方式
        提供在监听器中注册bean 的事件
        同时加载多个配置文件
        载入多个(有继承关系)上下文

扩展

Spring Boot热部署方式

Spring Loaded
    <plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.6.RELEASE</version>
</dependency>
</dependencies>
<configuration>
<mainClass>此处为入口类</mainClass>
</configuration>
</plugin>
Spring-boot-devtools
    <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>provided</scope>
<optional>true</optional></dependency> 

spring框架的总结到此结束,下一篇是springmvc面试宝典总结。 

猜你喜欢

转载自blog.csdn.net/qq_41520636/article/details/113821277