您的当前位置:首页正文

秋招八股--Spring01

2024-11-29 来源:个人技术集锦

什么是Spring

Spring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。

常见的配置方式有三种:基于XML的配置、基于注解的配置、基于Java的配置。

主要由以下几个模块组成:
 Spring Core:核心类库,提供IOC服务;
 Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等);
 Spring AOP:AOP服务;
 Spring DAO:对JDBC的抽象,简化了数据访问异常的处理;
 Spring ORM:对现有的ORM框架的支持;
 Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传;
 Spring MVC:提供面向Web应用的Model-View-Controller实现。

Spring 有什么好处

为什么要用Spring,Spring为什么效率高

对Spring Aop的理解,解决什么问题,实现原理,jdk动态代理,cglib区别,优缺点,怎么实现方法的调用的

Spring的Aop是什么?如何实现的

Spring IOC 和 Spring Aop原理(大致源码名词+整体流程)

IOC和AOP是如何实现的,底层实现

(1) IOC(Inversion Of Controll,控制反转)

把创建对象过程交给Spring进行管理。将原本在程序中手动创建对象的控制权,交给IOC容器来管理,并由IOC容器完成对象的注入。

这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。IOC容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。

IOC的实现原理就是工厂模式+反射机制。
1、xml配置文件,配置要创建的对象类
2、创建工厂类,进行xml解析,通过反射创建对象

IOC的优点有哪些?

自己new一个对象,可能会导致程序耦合度过高,后期可能维护不便。引入IOC,将创建对象的控制权交Spring的IOC容器;如果要去使用对象,通过DI(依赖注入)@Autowired注解 自动注入,就可以使用对象了!

(2) AOP(Aspect-Oriented Programming,面向切面编程)

不通过修改源代码方式,在主干功能里面添加新功能。

利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

AOP是基于动态代理的,如果被代理的类实现了某个接口,使用JDK动态代理去创建代理对象;没有实现接口,使用CGlib动态代理去创建代理对象。

AOP用来解决什么问题(业务场景)

AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理、缓存、对象池管理以及日志记录。 AOP将这些分散在各个业务逻辑中的代码通过横向切割的方式抽取到一个独立的模块中。

AOP打日志和业务里面写日志有什么区别

spring AOP中before和after是干什么的,切点的注解?

在Spring AOP中,before和after是通知(advice)的两种类型,用于在目标方法执行之前和之后执行一些逻辑。before通知在目标方法执行之前执行,而after通知在目标方法执行之后执行。

切点的注解用于指定在哪些连接点(join point)上应用通知。在Spring AOP中,可以使用@Pointcut注解来定义切点,然后在通知中引用这些切点。

什么是动态代理?

动态代理:在运行时在内存中“临时”生成 AOP动态代理类,因此也被称为运行时增强。

动态代理,通俗点说就是:无需声明式的创建java代理类,而是在运行过程中生成"虚拟"的代理类,被ClassLoader加载。从而避免了静态代理那样需要声明大量的代理类。

动态代理是怎么实现的?

JDK 动态代理

Spring默认使用JDK的动态代理实现AOP。类如果实现了接口,Spring就会使用这种方式实现动态代理。

JDK实现动态代理需要两个组件,首先第一个就是InvocationHandler接口,需要编写一个类,去实现这个接口,然后重写invoke方法,这个方法其实就是我们提供的代理方法。然后JDK动态代理需要使用的第二个组件就是Proxy这个类,我们可以通过这个类的newProxyInstance方法,返回一个代理对象。生成的代理类实现了原来那个类的所有接口,并对接口的方法进行了代理,我们通过代理对象调用被代理类的方法时,底层将通过反射,调用我们实现的invoke方法

CGLIB

JDK的动态代理存在限制,那就是被代理的类必须是一个实现了接口的类,代理类需要实现相同的接口。若被代理的类没有实现接口,此时JDK动态代理将没有办法使用,于是Spring会使用CGLib的动态代理来生成代理对象。CGLib直接操作字节码,生成类的子类,重写类的方法完成代理。

基于JDK和基于CGLib的动态代理的区别

基于JDK的动态代理和基于CGLib的动态代理的主要区别在于它们的实现方式。基于JDK的动态代理是通过接口来生成代理类,而基于CGLib的动态代理是通过继承来生成代理类。

这两者最大的区别在于基于JDK 的动态代理需要被代理的对象有接口,而基于CGLib的动态代理并不需要被代理对象有接口。

切入点是什么?环绕通知是什么?

切入点:实际真正被增强的方法。

• 前置通知(Before): 在目标方法被调用之前通知功能。
• 后置通知(After):在目标方法被调用之后通知功能。
• 返回通知(After-returning):在目标方法执行成功之后调用通知。
• 异常通知(After-throwing):在目标方法抛出异常之后调用通知。
• 环绕通知(Around):通知包含了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。


更多后端全部八股点击??【闲鱼】 「我在闲鱼发布了【京985计算机硕士自用后端八股文出售,不同于市面上的几块钱八】」
点击链接直接打开

Java后端各科最全八股自用整理,获取方式见


整理不易??,关注和收藏后拿走??欢迎留言???
欢迎专注我的公众号AdaCoding 和

显示全文