其他分享
首页 > 其他分享> > 锁屏面试题百日百刷-Spring篇(四)

锁屏面试题百日百刷-Spring篇(四)

作者:互联网

  锁屏面试题百日百刷,每个工作日坚持更新面试题。锁屏面试题app、小程序现已上线,官网地址:https://www.demosoftware.cc/#/introductionPage。已收录了每日更新的面试题的所有内容,还包含特色的解锁屏幕复习面试题、每日编程题目邮件推送等功能。让你在面试中先人一步,吊打面试官!接下来的是今日的面试题:

  

1、在 Spring 中如何注入一个 java 集合?

 

Spring 提供以下几种集合的配置元素:

 

1.<list>类型用于注入一列值,允许有相同的值。

 

<!-- 给数组注入值 -->

 

       <property name="empName">

 

           <list>

 

               <value>小米</value>

 

               <value>小明</value>

 

               <value>小四</value>

 

           </list>

 

       </property>

 

       <!-- 给list注入值 可以有相同的多个对象  -->

 

       <property name="empList">

 

           <list>

 

               <ref bean="emp1" />

 

               <ref bean="emp2"/>

 

           </list>

 

       </property>

 

2.<set> 类型用于注入一组值,不允许有相同的值。

 

<!-- 给set注入值 不能有相同的对象 -->

 

       <property name="empSets">

 

           <set>

 

               <ref bean="emp1" />

 

               <ref bean="emp2"/>

 

           </set>

 

       </property>

 

  1. <map> 类型用于注入一组键值对,键和值都可以为任意类型。

 

    <!-- 给map注入值 只要map中的key值不一样就可以装配value -->

 

       <property name="empMap">

 

           <map>

 

               <entry key="1" value-ref="emp1" />

 

               <entry key="2" value-ref="emp2" />

 

           </map>

 

       </property>

 

4.<props>类型用于注入一组键值对,键和值都只能为 String 类型。

 

<!-- 给属性集合配置 -->

 

       <property name="pp">

 

           <props>

 

               <prop key="pp1">hello</prop>

 

               <prop key="pp2">world</prop>

 

           </props>

 

       </property>

 

2、什么是 bean 的自动装配?

 

~无须在 Spring 配置文件中描述 javaBean 之间的依赖关系(如配置<property>、<constructor-arg>)。IOC 容器会自动建立 javabean 之间的关联关系。

 

~Spring IOC容器可以自动装配Bean,需要做的仅仅实在<bean>的autowire属性里指定自动装配的模式。

 

~Spring2.5开始支持注解@Autowired和@Resource来自动装配

 

3、解释不同方式的自动装配?

 

有五种自动装配的方式,可以用来指导 Spring 容器用自动装配方式来进行依赖注入。

 

1)no:默认的方式是不进行自动装配,通过显式设置 ref 属性来进行装配。

 

2)byName:通过参数名自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byname,之后容器试图匹配、装配和该 bean 的属性具有相同名字的 bean。

 

<bean id="cat" class="pojo.Cat"/>

 

<bean id="dog" class="pojo.Dog"/>

 

<bean id="people" class="pojo.People" autowire="byName">

 

    <property name="name" value="zj"/>

 

</bean>

 

3)byType::通过参数类型自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byType,之后容器试图匹配、装配和该 bean 的属性具有相同类型的 bean。如果有多个 bean 符合条件,则抛出错误。

 

<bean id="cat" class="pojo.Cat"/>

 

<bean id="dog" class="pojo.Dog"/>

 

<bean id="people" class="pojo.People" autowire="byType">

 

    <property name="name" value="zj"/>

 

</bean>

 

4)constructor:这个方式类似于 byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。

 

5)autodetect:首先尝试使用 constructor 来自动装配,如果无法工作,则使用 byType 方式。

 

4、@Autowired和@Resource异同?

 

~@Autowired和@Resource的相同点:

 

都是用于自动装配的,都可以放在属性字段和set方法上

 

~@Autowired和@Resource的区别:

 

2.@Autowired为Spring提供的注解,@Resource为java提供的注解

 

3.@Autowired 默认通过 byType 的方式实现,如果有多个对象,则通过 byName 查找,如果都找不到,则报错;此时可以用@Qualifier指定唯一的bean对象

 

4.@Resource 默认通过 byName 的方式实现,如果找不到名字, 则通过 byType 实现!如果两个都找不到,就会报错

 

5、什么是基于 Java 的 Spring 注解配置? 给一些注解的例子

 

基于 Java 的配置,允许你在少量的 Java 注解的帮助下,进行你的大部分 Spring 配置而非通过 XML 文件。以@Configuration 注解为例,它用来标记类可以当做一个 bean 的定义,被 Spring IOC 容器使用。另一个例子是@Bean 注解,它表示此方法将要返回一个对象,作为一个 bean 注册进 Spring 应用上下文。

 

6、简单解释一下 spring 的 AOP

 

AOP(Aspect Oriented Programming),即面向切面编程,可以说是 OOP(Object Oriented Programming面向对象编程)的补充和完善。OOP 引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过 OOP 允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在 OOP 设计中,它导致了大量代码的重复,而不利于各个模块的重用。

 

AOP 技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

 

使用"横切"技术,AOP 把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。AOP 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。

 

AOP 核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组 API 提供横切功能。比如,一个日志模块可以被称作日志的 AOP 切面。根据需求的不同,一个应用程序可以有若干切面。在 Spring AOP 中,切面通过带有@Aspect 注解的类实现。

 

7、在 Spring AOP 中,关注点和横切关注的区别是什么?

 

关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。

 

8、什么是连接点?

 

被拦截到的点,因为 Spring 只支持方法类型的连接点,所以在 Spring 中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器。

 

9、Spring 的通知是什么?有哪几种类型?

 

通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过 SpringAOP 框架触发的代码段。

 

Spring 切面可以应用五种类型的通知:

 

1)before:前置通知,在一个方法执行前被调用。

 

2)after: 在方法执行之后调用的通知,无论方法执行是否成功。

 

3)after-returning: 仅当方法成功完成后执行的通知。

 

4)after-throwing: 在方法抛出异常退出时执行的通知。

 

5)around: 在方法执行之前和之后调用的通知。

 

10、什么是切点?

 

切入点是一个或一组连接点,通知将在这些位置执行。可以通过表达式或匹配的方式指明切入点。

 

11、什么是目标对象?

 

被一个或者多个切面所通知的对象。它通常是一个代理对象。也指被通知(advised)对象。

 

12、什么是代理?

 

代理是通知目标对象后创建的对象。从客户端的角度看,代理对象和目标对象是一样的。

 

13、什么是织入?什么是织入应用的不同点?

 

织入是将切面和到其他应用类型或对象连接或创建一个被通知对象的过程。织入可以在编译时,加载时,或运行时完成。

 

13、AOP中的一些常用术语和解释?

 

通知(Advice): AOP 框架中的增强处理。通知描述了切面何时执行以及如何执行增强处理。

 

连接点(join point): 连接点表示应用执行过程中能够插入切面的一个点,这个点可以是方法的调用、异常的抛出。在 Spring AOP 中,连接点总是方法的调用。

 

切点(PointCut): 可以插入增强处理的连接点。

 

切面(Aspect): 切面是通知和切点的结合。

 

引入(Introduction):引入允许我们向现有的类添加新的方法或者属性。

 

织入(Weaving): 将增强处理添加到目标对象中,并创建一个被增强的对象,这个过程就是织入。

 

 

  更多面试题可关注"demo锁屏面试题"公众号通过小程序或App获取面试题和学习资源

              

 

标签:面试题,Spring,关注点,锁屏,bean,切面,AOP
来源: https://www.cnblogs.com/demosoftware/p/14979388.html