Spring框架是大家学习后续其他框架的基础吧,建议大家好好学习,有时间和精力的可以结合视频去看看源码,对自己的提升还是很不错的。在阅读源码的过程中可以自己画一些流程图之类的,加深自己的理解。下图就是我当时在看源码视频跟着画的图,画完后感觉印象很深,在面试的是就可以跟面试官说你看过Spring某一块的源码,这绝对是一个加分项!
需要Spring思维导图和更多Spring面试八股的可以在公众号(公众号:代码界的小白)后台回复:Spring资源
回答:Spring 是一种轻量级开发框架,旨在提高开发人员的开发效率以及系统的可维护性。
一般说 Spring 框架指的都是 Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发。这些模块是:核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块。比如:Core Container 中的 Core 组件是Spring 所有组件的核心,Beans 组件和 Context 组件是实现IOC和依赖注入的基础,AOP组件用来实现面向切面编程。
Spring 官网列出的 Spring 的 6 个特征:
Spring框架的好处?
Spring框架的缺点?
Spring 能够给我们带来很多方便之处,但是同样也存在很多的问题:
使用了大量的反射机制,反射机制非常占用内存。
(一)重量级框架
我们看到 Spring 架构图时会发现 Spring 里面包含有很多其他组件,比如数据访问、MVC、事务管理、面向切点、WebSocket 功能等,因此这么复杂的组件集中到一起就会提高初学者的学习成本。还有一方面随着你的服务越多,那么 Spring 的启动就会变得越慢。
(二)集成复杂
比如我们想要使用 MyBatis 或者 MongoDB的时候,我们要做很多工作不管使用配置方式也好还是使用注解方式。
(三)配置复杂
在使用 Spring 的时候,我们更多可能是选择 XML 进行配置,但目前这种配置方式已不在流行。
(四)构建和部署复杂
启动 Spring 的 IOC 容器,是完全要依赖于第三方的 web 服务器。自身不能启动的。
回答:Spring中有两个非常重要的特性IOC和AOP,其中AOP是对IOC功能的拓展,
IOC:IOC是一种设计思想,就是 **将原本在程序中手动创建对象的控制权,交由Spring框架来管理。**负责创建对象,使用依赖注入(dependency injection,DI)管理它们,将对象集中起来,配置对象,管理对象的整个生命周期。
AOP:AOP模块用于为支持Spring应用程序面向切面的开发。AOP联盟提供了很多支持,这样就确保了Spring和其他AOP框架的共通性。面向切面编程能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
回答:AOP就是基于动态代理的,如果要代理的对象,实现了某个接口,那么Spring AOP会使用JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候Spring AOP会使用Cglib ,这时候Spring AOP会使用 Cglib 生成一个被代理对象的子类来作为代理
回答:
1、CGLib所创建的动态代理对象在实际运行时候的性能要比JDK动态代理高(1.6和1.7的时候,CGLib更快;1.8的时候,jdk更快)
2、CGLib在创建对象的时候所花费的时间却比JDK动态代理多
3、singleton的代理对象或者具有实例池的代理,因为无需频繁的创建代理对象,所以比较适合采用CGLib动态代理,反之,则适合用JDK动态代理
4、JDK生成的代理类类型是Proxy(因为继承的是Proxy),CGLIB生成的代理类类型是Enhancer类型
5、JDK动态代理是面向接口的,CGLib动态代理是通过字节码底层继承代理类来实现(如果被代理类被final关键字所修饰,那么会失败)
6、如果要被代理的对象是个实现类,那么Spring会使用JDK动态代理来完成操作(Spirng默认采用JDK动态代理实现机制);
如果要被代理的对象不是实现类,那么Spring会强制使用CGLib来实现动态代理。
默认的作用域是singleton。
(这个问题阿里二面的时候被问到过)
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。(这个大家可以自行去网上搜一下,顺便学习一下。)
回答:这个问题可以选择几个常见的说一下就行,下面给大家列出比较全面的,主要说几个自己项目里用到的即可。
@Component:用于指示类是组件。这些类用于自动注入,并在使用基于注解的配置时配置为bean。
@Controller:是一种特定类型的组件,用于MVC应用程序,主要与@RequestMapping注解一起使用。
@Repository:用于表示组件用作存储库和存储/检索/搜索数据的操作。我们可以将此注解应用于DAO实现类。
@Service:用于指示类是服务层。
@Required:此注解简单地说明作用的bean属性必须在配置时通过bean定义中的显式属性值或通过自动注入填充。如果作用的bean属性未填充,容器将抛出BeanInitializationException。
@ResponseBody:用于将对象作为response,通常用于将XML或JSON数据作为response发送。
@PathVariable:用于将动态值从URI映射到处理方法参数。
@Autowired:对自动注入的位置和方式提供了更细粒度的控制。它可以用于在setter方法上自动注入bean。就像@Required 注解一样,修饰setter方法、构造器、属性或者具有任意名称和/或多个参数的PN方法。
@Qualifier:当有多个相同类型的bean并且只需要将一个bean自动注入时,@Qualifier注解与@Autowired注释一起使用,通过指定将连接哪个bean来消除歧义。
@Scope:配置Spring bean的作用域。
@Configuration:表示Spring IOC容器可以将该类用作bean定义的源。
@ComponentScan:应用此注解时,将扫描包下的所有可用类。
@Bean:对于基于java的配置,用@Bean注解修饰的方法将返回一个在Spring应用程序上下文中注册为Bean的对象。
用于配置切面和通知、@Aspect、@Before、@After、@Around、@Pointcut等的AspectJ注解。
注解的优点:
xml配置的优点:
回答:
声明式事务又分为两种:
TransactionDefinition 接口中定义了五个表示隔离级别的常量:
推荐阅读
Java面试基础知识在面试中的高频考点
MySQL数据索引在面试中的高频考点
Redis在面试中的高频考点