【精选】64道题拿下Spring(第二篇)
上一篇
16、Spring 支持几种 bean 的作用域?
当通过spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。Spring支持如下5种作用域:
singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例 prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例 request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效 session:对于每次HTTP Session,使用session定义的Bean豆浆产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效 globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效
17、spring bean 容器的生命周期是什么样的?
spring bean 容器的生命周期流程如下:
1、Spring 容器根据配置中的 bean 定义中实例化 bean。
2、Spring 使用依赖注入填充所有属性,如 bean 中所定义的配置。
3、如果 bean 实现BeanNameAware 接口,则工厂通过传递 bean 的 ID 来调用setBeanName()。
4、如 果 bean 实现 BeanFactoryAware 接口,工厂通过传递自身的实例来调用 setBeanFactory()。
5、如果存在与 bean 关联的任何BeanPostProcessors,则调用 preProcessBeforeInitialization() 方 法。
6、如果为 bean 指定了 init 方法( 的 init-method 属性),那么将调用它。
7、最后,如果存在与 bean 关联的任何 BeanPostProcessors,则将调用 postProcessAfterInitialization()方法。
8、如果 bean 实现DisposableBean 接口,当 spring 容器关闭 时,会调用 destory()。
9、如果为bean 指定了 destroy 方法( 的 destroy-method 属性),那么将调用它。
18、什么是 spring 的内部 bean?
只有将 bean 用作另一个 bean 的属性时,才能将 bean 声明为内部 bean。为了定义 bean, Spring
的基于 XML 的配置元数据在 或 中提供了 元素的使用。内部 bean 总是匿名的,它们总是作为 原型。
例如,假设我们有一个 Student 类,其中引用了 Person 类。
Student.java public class Student { private Person person; //Setters and Getters }
public class Person { private String name; private String address; //Setters and Getters}
<bean id="StudentBean" class="com.edureka.Student"> <property name="person"> <!--This is inner bean --> <bean class="com.edureka.Person"> <property name="name" value="Scott"></property> <property name="address" value="Bangalore"></property> </bean> </property> </bean>
19、什么是 spring 装配
当 bean 在 Spring 容器中组合在一起时,它被称为装配或 bean 装配。Spring
容器需要知道需要什 么
bean 以及容器应该如何使用依赖注入来将 bean 绑定在一起,同时装配 bean。
20、自动装配有哪些方式?
Spring 容器能够自动装配 bean。也就是说,可以通过检查 BeanFactory 的内容让 Spring 自动解析 bean
的协作者。
自动装配的不同模式:
-
no - 这是默认设置,表示没有自动装配。应使用显式 bean 引用进行装配。
-
byName - 它根据 bean 的 名称注入对象依赖项。
它匹配并装配其属性与 XML文件中由相同名称定义的 bean。
-
byType - 它根据类型注入对象依赖项。
如果属性的类型 与XML 文件中的一个 bean 名称匹配,则匹配并装配属性。
构造函数- 它通过调用类的构造函数来注入依赖项。它有大量的参数。
-
autodetect - 首先容器尝试通过构造函数使
用 autowire 装配,如果不能,则尝试通过 byType 自动装配
21、自动装配有什么局限?
覆盖的可能性 - 您始终可以使用 和 设置指定依赖项,这将覆盖自动装配。
基本元数据类型 - 简单属性 (如原数据类型,字符串和类)无法自动装配。
令人困惑的性质 - 总是喜欢使用明确的装配,因为自动装配不太精确。
22、什么是基于注解的容器配置
不使用 XML 来描述 bean 装配,开发人员通过在相关的类,方法或字段声明上使用注解将配置移 动到
组件类本身。它可以作为 XML 设置的替代方案。
例如:
Spring 的 Java 配置是通过使用 @Bean和@Confifiguration 来实现。
-
@Bean 注解扮演与 元素相同的角色。
-
@Confifiguration 类允许通过简单地调用同一个类中的其他 @Bean 方法来定义 bean 间依赖关系。
@Configuration public class StudentConfig { @Bean public StudentBean myStudent() { return new StudentBean(); } }
23、如何在 spring 中启动注解装配?
默认情况下,Spring 容器中未打开注解装配。
因此,要使用基于注解装配,我们必须通过配置<context:annotation-confifig/> 元素在spring 配置文件中启用它。
24、@Component, @Controller,@Repository,@Service 有何区别?
-
@Component :这将 java 类标记为 bean。它是任何 Spring 管理组件的通用构造型。spring 的组件 扫描
机制现在可以将其拾取并将其拉入应用程序环境中。
-
@Controller :这将一个类标记为 Spring Web MVC 控制器。标有它的Bean 会自动导入到 IoC 容器 中。
-
@Repository :这个注解是具有类似用途和功能的 @Component 注解的特化。它为 DAO 提供了额外 的好
处。它将 DAO 导入 IoC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException。
-
@Service :此注解是组件注解的特化。它不会对 @Component 注解提供任何其他行为。您可以在服 务层
类中使用@Service 而不是@Component,因为它以更好的方式指定了意图。
25、@Required 注解有什么用?
@Required 应用于 bean 属性 setter 方法。
此注解仅指示必须在配置时使用bean 定义中的显式属性值或使用自动装配填充受影响的 bean属性。
如果尚未填充受影响的 bean 属性,则容器将抛出eanInitializationException。
示例:
public class Employee { private String name; @Required public void setName(String name){ this.name=name; } public string getName(){ return name; } }
26、@Autowired 注解有什么用?
@Autowired 可以更准确地控制应该在何处以及如何进行自动装配。此注解用于在 setter 方法,构 造函
数,具有任意名称或多个参数的属性或方法上自动装配bean。
public class Employee { private String name; @Autowired public void setName(String name) { this.name=name; } public string getName(){ return name; } }
27、@Qualififier 注解有什么用?
当您创建多个相同类型的 bean 并希望仅使用属性装配其中一个 bean 时,您可以使用@Qualififier 注解
和 @Autowired 通过指定应该装配哪个确切的 bean来消除歧义。
例如:
这里我们分别有两个类,Employee 和 EmpAccount。
Employee.java public class Employee { private String name; @Autowired public void setName(String name) { this.name=name; } public string getName(){ return name; } }
EmpAccount.java
public class EmpAccount {
private Employee emp;
@Autowired
@Qualifier(emp1)
public void showName() {
System.out.println(“Employee name : ”+emp.getName);
}
}
28、@RequestMapping 注解有什么用?
@RequestMapping 注解用于将特定 HTTP 请求方法映射到将处理相应请求的控制器中的特定类/ 方法 。
此注释可应用于两个级别:
-
类级别:映射请求的 URL
-
方法级别:映射 URL 以及 HTTP 请求方法
29、spring DAO 有什么用?
Spring DAO 使得 JDBC,Hibernate 或 JDO 这样的数据访问技术更容易以一种统一的方式工作。
这使得用户容易在持久性技术之间切换。
它还允许您在编写代码时,无需考虑捕获每种技术不同的异常。
30、举例Spring DAO抛出的异常
下一篇
#面试复盘##春招##秋招##面经##笔记#宝剑锋从磨砺出,梅花香自苦寒来,我是小码哥为你圆梦大厂少走弯路,值得关注。