关于Spring 的IoC和AOP的面试题,快看看你都能答上来哪些

Posted 派 大 星.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Spring 的IoC和AOP的面试题,快看看你都能答上来哪些相关的知识,希望对你有一定的参考价值。

推荐:前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。。 点击跳转到网站

🏡  博客首页:派 大 星

⛳️  欢迎关注  ❤️ 点赞  🎒 收藏  ✏️ 留言

🎢  本文由派大星原创编撰

🚧  系列专栏:《迎战面试》

🎈  本系列分享自己准备面试的过程和一些经典的面试题

目录

🍓 Spring IOC

🍉 IOC是什么?

Ioc即控制反转,把原来的代码里需要实现的对象创建,依赖反转给容器来帮忙实现,需要创建一个容器并且需要一种描述让容器知道要创建的对象间的关系,在Spring中管理对象及其依赖关系是通过Spring IOC容器实现的。Ioc的实现方式有依赖注入和依赖查找,由于依赖查找使用的很少,因此Ioc也叫做依赖注入。依赖注入指对象被动地接收依赖类而不用自己主动去找,对象不是从容器中查找它依赖的类,而是在容器实例化对象时主动将它依赖的类注入给它。假设一个Car类需要一个Engine的对象,那么一般需要手动new 一个Engine,利用Ioc就只需要定义一个私有的Engine类型的成员变量,容器会在运行时自动创建一个Engine的实例对象并将引入自动注入给成员变量。

🥝 Ioc容器的初始化过程?

当创建一个ClassPathXmlApplicationContext时,构造方法做了两件事情:①调用父容器的构造方法为容器设置好Bean资源加载器。②调用父类的setConfigLocations方法设置Bean配置信息的定位路径。 ClassPathXmlApplicationContext通过调用父类AbstractApplicationContext的refresh方法启动整个Ioc容器对Bean定义的载入过程,refresh是一个模板方法,规定了Ioc容器的启动流程。在创建Ioc容器前如果已有容器存在,需要把已有的容器销毁,保证在refresh方法后使用新创建的Ioc容器。容器创建后通过loadBeanDefinitions方法加载Bean 配置资源,该方法做两件事:①调用资源加载器的方法获取要加载的资源。②真正执行加载的功能,由子类XmlBeanDefinitionReader实现,加载资源时首先解析配置文件路径,读取配置文件的内容,然后通过XML解析器将Bean配置信息转换成文档对象,之后按照Spring Bean的定义规则对文档进行解析。Spring Ioc容器中注册解析的Bean信息存放在一个HashMap集合中,key是字符集,只是BeanDefinition,注册过程中需要使用synchronized 保证线程安全。当配置信息中配置的Bean被解析且被注册到Ioc容器中后,初始化就算真正完成了,Bean定义信息已经可以使用且可被检索。Spring Ioc容器的作用就是对这些注册的Bean定义信息进行处理和维护,注册的Bean定义信息是控制反转和依赖注入的基础。

🍒 基于注解的容器初始化

  • 直接将注解Bean注册到容器中,可以在初始化容器时注册,也可以在容器创建之后手动注册,然后刷新容器使其对注册的注解Bean进行处理。
  • 通过扫描指定的包及其子包的所有类处理,在初始化注解容器时指定要自动扫描的路径。

🍅 依赖注入的相关注解?

  • @Autowired :自动按类型注入,如果有多个匹配则按照指定的Bean的id查找,查找不到会报错。
  • @Qualifier :在自动按照类型注入的基础上再按照Bean的id注入,给变量注入时必须搭配@Autowired,给方法注入时可单独使用。
  • @Resource:直接按照Bean的id注入,只能注入Bean类型。
  • @Value:用于注入基本数据类型和String类型

🌰 如何通过注解创建Bean?

@Component 把当前类对象存入Spring容器中,相当于xml中配置了一个bean标签。value属性指定bean的id,默认使用当前类的首字母小写的类名。@Controller 、@Service、@Repository 三个注解都是@Component的衍生注解,作用及属性都是一模一样的,只是提供了更加明确的语义。@Controller用于表现层,@Service用于业务层,@Repository用于持久层。如果注解的中只有一个value属性要赋值时可以省略value。如果想将第三方的类变成组件有没有源代码,也就没办法使用@Component进行自动配置,这种时候就要使用@Bean注解,被@Bean注解的方法返回值是一个对象,将会实例化,配置和初始化一个新对象并返回,这个对象由Spring的Ioc容器管理。name属性用于给当前@Bean注解方法创建的对象指定一个名称,即Bean的id,当使用注解配置方法时,如果方法有参数,Spring会去容器查找是否有可用的bean对象,查找方式和@Autowired一样。

🍰 SpringAOP

🍕 AOP是什么?

AOP即面向切面编程,通过预编译和运行期动态代理实现程序功能的统一维护。常用场景:权限认证、自动缓存、错误处理、日志、调试和事务等。

🍨 实现AOP的方式?

  • 采用动态代理方式实现:利用拦截方法的方式,对该方法进行装饰,以增强原有对象的方法。具体实现技术有JDK动态代理基于接口代理和CGLib基于类代理的字节码提升。
  • 采用静态织入的方式:引入特定的语法创建“切面”,从而使得编译器可以在编译期间织入相关“切面”的代码。

🍫 AOP原理

AOP代理其实是由AOP框架动态生成的一个对象,该对象可作为目标对象使用。AOP代理包含了目标对象的全部方法,但AOP代理中的方法与目标对象的方法存在差异:AOP方法在特定切入点添加了增强处理,并回调了目标对象的方法。Spring的AOP代理由Spring的IOC容器负责生成、管理,其依赖关系也由IoC容器负责管理,因此,AOP代理可以直接使用容器中的其他Bean实例作为目标,这种关系可由IoC容器的依赖注入提供。

🍭 AOP的相关注解有哪些?

  • @Aspect:声明被注解的类是一个切面的Bean;
  • @Before:前置通知,指在某个连接点之前执行的通知;
  • @After:后置通知,指某个连接点退出时执行的通知(不论程序是正常返回还是异常退出)
  • @AfterReturning:返回后通知,指某连接点正常完成之后执行的通知,返回值使用returning属性接收。
  • @AfterThrowing:异常通知,指方法抛出异常导致退出时执行的通知,和@AfterReturning只会有一个执行,异常使用throwing属性接收。

Spring中的ioc和aop有啥作用?为啥要用ioc和aop?面试中多次被问到,求一个详细 清晰的解答...

还是需要去了解,多看看书!
IOC:控制反转,是一种设计模式。一层含义是控制权的转移:由传统的在程序中控制依赖转移到由容器来控制;第二层是依赖注入:将相互依赖的对象分离,在spring配置文件中描述他们的依赖关系。他们的依赖关系只在使用的时候才建立。简单来说就是不需要NEW一个对象了。

AOP:面向切面,是一种编程思想,OOP的延续。将系统中非核心的业务提取出来,进行单独处理。比如事务、日志和安全等。这个简单来说就是可以在一段程序之前或者之后做一些事。

Spring 的AOP和IOC都是为了解决系统代码耦合度过高的问题。使代码重用度高、易于维护。
不过AOP和IOC并不是spring中特有的,只是spring把他们应用的更灵活方便
参考技术A 我来说说我的理解:
面试的时候,尽量不要照本宣科,这样给面试官的印象是很差的。用自己的话理解是最好的。我先来将两个例子:
ioc,控制反转,这个指的就是我们获取对象的方式进行反转了,改变了。在使用spring之前是需要手动new出来的,是我们主动获取的。使用spring之后,是将这个获取的过程交给spring来管理,我们只需要告诉spring你需要什么就行了,它就会把东西给你。比如:在没有电商的时候,我们去上街买东西,需要考虑到这东西有没有,价钱多少,怎么搬回来,去有多远……等等无数个和主要的业务逻辑(买东西)无关的问题。这样就会扰乱主业务逻辑。当我们有了电商平台后,买东西时只需要两步。注册账号(装载bean),告诉电商你要的东西名字(通过名字获取Bean),然后就可以在门口收到东西了。这就是ioc。
aop,面向切面。在谈这个之前需要了解几个词:切面,切入点,织入,目标对象,通知。

我先解释下名字的意思,再讲故事。
切面:就是你要准备增强的那些方法。
切入点:就是具体织入的方法,定义了地点
织入:动词,就是将切面织入的过层
目标对象:被增强的类
通知:就是什么时候增强,定义了时间
好了,了解清楚上面的几个词的意思后,再听故事就容易多了。
aop的功能就是用来增强,在执行主业务的通知也顺带执行其他业务。如:老李上街办点事儿,走啊走,走到了老王家门前(切入点),老王看见老李问:去哪啊!

老李:上街办点事儿(目标类)
老王:那帮我顺便把这封信投到邮筒里吧。(切面),等到10点的时候邮局开门了去柜台投。(通知)
老李:好嘞。然后老李接过信。(织入)
老李继续走啊走,继续上街办事(增强后的目标类)。办完事后老李回家了。
以上就是aop。aop一般用来处理权限控制,日志记录,加载事务等非主要业务逻辑的事情。底层是采用cglib和jdk的动态代理实现的。
以上例子可能会有点不恰当,如有大神,望指点修正,谢谢!
参考技术B ioc为Inversion of Control意思是控制反转,AOP是面向切面。spring就是他们结合的容器框架。
在spring的bean结构中如<bean id="PersonDaoBean" class="..PersonDao"/>,在一个Service类中可以这样写 private PersonDao personDao = new PersonDaoBean();你看这样PersonDao对象就不用自己创建和维护了,交给了bean。也就是控制反转。
AOP设置拦截用户的业务方法,判断权限,有权限则可以执行调用的业务方法,没有权限则不可以。在拦截的时候出现环绕通知 ,前置通知,后置通知,例外通知,最终通知。
这是我的答案,望采纳,要是喜欢,请支持,很难打字的。

以上是关于关于Spring 的IoC和AOP的面试题,快看看你都能答上来哪些的主要内容,如果未能解决你的问题,请参考以下文章

JAVA关于Spring 面试题汇总

求助!使用spring ioc注入管理,spring aop做日志记录。。

面试题中问到 aop di ioc 怎么回答

spring ioc和aop 啥设计模式

spring ioc和aop 啥设计模式

SpringBoot面试题