首页 > 编程技术 > java

spring的13个经典面试题

发布时间:2021-6-16 00:01

1、JDK 动态代理和 CGLIB 代理有什么区别?

详细分析参考:【Java萌新】面试常问设计模式——代理模式

2、FactoryBean、BeanFactory、ApplicationContext 有什么区别?

3、说一说Spring Bean 的生命周期?

Spring Bean 生命周期简单概括为 5 个阶段:

  1. Bean 的实例化阶段:创建一个 Bean 对象。
  2. Bean 实例的属性填充阶段:为 Bean 实例的属性赋值。
  3. Bean 实例的初始化阶段:对 Bean 实例进行初始化。
  4. Bean 实例的正常使用阶段。
  5. Bean 实例的销毁阶段:容器关闭后,将 Bean 实例销毁。

4、依赖注入的实现方法,以及相关注解?

构造方法注入、Setter 方法注入、接口注入 三种。

依赖注入的相关注解

5、什么是 Spring IOC ?

IOC 即控制反转,简单来说就是把原来代码里需要实现的对象创建、依赖反转给容器来帮忙实现,Spring 中管理对象及其依赖关系都是通过 Spring 的 IOC 容器实现的。

IOC 的实现方式有依赖注入和依赖查找,由于依赖查找使用的很少,因此 IOC 也叫做依赖注入。

我们之前在创建一个对象的时候都是直接 new 一个对象实例,而有了 IOC ,对象实例的创建都交给容器去实现即可。

6、Spring IOC 容器的构建流程(初始化过程)

我们以 XML 方式的容器初始化为例:

通过 ClassPathXmlApplicationContext,去创建 ApplicationContext 容器对象:

ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

ClassPathXmlApplicationContext创建容器对象时,构造方法做了如下两件事:

7、依赖注入的过程(Bean 的加载流程)?

源码分析可以参考我的文章:Spring源码分析——Bean的加载

先来看下面几行代码:

public class BeanFactoryTest {
	public static void main(String[] args) {
		// 加载与解析XML配置文件,获得BeanFactory:
		BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-bf.xml"));
		// 从BeanFactory中加载Bean对象
		Object a = beanFactory.getBean("componentA");
		Object b = beanFactory.getBean("componentB");
		System.out.println(a);// com.myspring.test.xmltest.ComponentA@1c93084c
		System.out.println(b);// com.myspring.test.xmltest.ComponentB@6ef888f6
	}
}

8、Bean 的作用范围?

通过 scope 属性指定 Bean 的作用范围,包括:

9、Spring事务传播机制有哪些?

10、Spring 的事务隔离级别有哪些?

Spring 的事务隔离级别底层其实是基于数据库的,Spring 并没有自己的一套隔离级别。

11、AOP 是什么?AOP有哪些应用场景?

AOP 概念: 即面向切面编程,使用动态代理技术,在不修改源码的基础上对目标方法进行增强。

Spring 中的 AOP 目前支持 JDK 动态代理和 Cglib 代理。如果被代理对象实现了接口,则使用 JDK 动态代理,否则使用 Cglib 代理。另外,也可以通过指定 proxyTargetClass=true 来实现强制走 Cglib 代理。

应用场景:

12、AOP 的相关注解有哪些?

@Aspect
@Component
public class LogAspect {
    ...
}

@Pointcut("execution(* top.csp1999.service.impl.*.*(..))")
public void operationLog(){}

@Before("operationLog()")
public void doBeforeAdvice(JoinPoint joinPoint){
    System.out.println("进入方法前执行.....");
}

@After("operationLog()")
public void after(JoinPoint jp){
    System.out.println("方法最后执行.....");
}

@AfterReturning(returning = "ret", pointcut = "operationLog()")
public void doAfterReturning(Object ret) {
    System.out.println("方法的返回值 : " + ret);
}

@AfterThrowing(throwing = "jp", pointcut = "operationLog()")
public void throwss(JoinPoint jp){
    System.out.println("方法异常时执行.....");
}

@Around("operationLog()")
public Object run2(ProceedingJoinPoint joinPoint) throws Throwable {
    // 获取方法参数值数组
    Object[] args = joinPoint.getArgs();
    // 得到其方法签名
    MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
    // 获取方法参数类型数组
    Class[] paramTypeArray = methodSignature.getParameterTypes();
    if (EntityManager.class.isAssignableFrom(paramTypeArray[paramTypeArray.length - 1])) {
         // 如果方法的参数列表最后一个参数是entityManager类型,则给其赋值
         args[args.length - 1] = entityManager;
	}
     logger.info("请求参数为{}",args);
     // 动态修改其参数
     // 注意,如果调用joinPoint.proceed()方法,则修改的参数值不会生效,必须调用joinPoint.proceed(Object[] args)
     Object result = joinPoint.proceed(args);
     logger.info("响应结果为{}",result);
     // 如果这里不返回result,则目标对象实际返回值会被置为null
     return result;
}

13、AOP 的相关术语有什么?

Aspect:切面,一个关注点的模块化,这个关注点可能会横切多个对象。

Joinpoint:连接点,程序执行过程中的某一行为,即业务层中的所有方法。。

Advice:通知,指切面对于某个连接点所产生的动作,包括前置通知、后置通知、返回后通知、异常通知和环绕通知。

Pointcut:切入点,指被拦截的连接点,切入点一定是连接点,但连接点不一定是切入点。

Proxy:代理,Spring AOP 中有 JDK 动态代理和 CGLib 代理,目标对象实现了接口时采用 JDK 动态代理,反之采用 CGLib 代理。

Target:代理的目标对象,指一个或多个切面所通知的对象。

Weaving :织入,指把增强应用到目标对象来创建代理对象的过程。

14、总结

文章会不定时更新,有时候一天多更新几篇,还请三连支持一下,后续会亿点点的更新!也希望大家可以关注猪先飞其他文章!

标签:[!--infotagslink--]

您可能感兴趣的文章: