Spring面试题, @Component,@Controller,@Repository和@Service 的区别?
Spring面试题, @Component,@Controller,@Repository和@Service 的区别?
QA
Step 1
Q:: Spring中 @Component、@Controller、@Repository 和 @
Service 的区别是什么?
A:: 在 Spring 框架中,@Component 是一个通用的 Spring 组件注解,它可以用于任何类,Spring 容器会自动将标注为 @Component 的类注册为 Spring Bean。而 @Controller、@Repository 和 @Service 是 @
Component 的特定化形式,具有更明确的语义:
- @
Controller 用于标注控制层组件,通常是处理用户请求的类。
- @
Repository 用于标注数据访问层组件,通常用于 DAO 层,并支持持久化异常的转换。
- @
Service 用于标注服务层组件,通常表示业务逻辑类。
虽然这四个注解的功能基本相同,但通过使用特定注解,代码的可读性和维护性得到了增强,同时它们还可以让开发者对代码的意图进行明确标识。
Step 2
Q:: 什么情况下会使用 @Component 而不是 @Controller、@Repository、@
Service?
A:: @Component 通常用于那些不直接属于控制层、服务层或数据访问层的类。例如,实用工具类、帮助器类或一些基础设施相关的类。如果一个类不适合归类为控制器、服务或数据访问组件,@
Component 是一个很好的选择。
Step 3
Q:: Spring 中的依赖注入有几种方式?它们之间有什么区别?
A:: Spring 中的依赖注入方式主要有三种:构造函数注入、Setter 方法注入和字段注入。
-
构造函数注入:通过构造函数将依赖传递给类的实例,确保类的依赖在实例化时就已完全初始化。
-
Setter 方法注入:通过 Setter 方法设置类的依赖,在实例化后可以设置或更改依赖。
- 字段注入:直接在字段上使用 @
Autowired 注解,由 Spring 框架直接注入依赖。通常不推荐这种方式,因为它违反了面向对象的设计原则,使得类的依赖不透明。
构造函数注入最为推荐,因为它使得类的依赖在实例化时就完全确定,确保了类的不可变性。
Step 4
Q:: Spring 中 Bean 的生命周期是什么?如何管理 Bean 的生命周期?
A:: Spring 中 Bean 的生命周期包括以下几个阶段:
1.
实例化:Spring 容器根据配置实例化 Bean 对象。
2.
属性注入:Spring 容器进行依赖注入,将需要的依赖注入到 Bean 中。
3. 初始化:如果 Bean 实现了 InitializingBean 接口或者配置了 init-
method,Spring 将调用相应的方法进行初始化操作。
4.
使用:Bean 被容器或客户端代码调用并使用。
5. 销毁:当容器关闭时,如果 Bean 实现了 DisposableBean 接口或者配置了 destroy-
method,Spring 会调用相应的方法进行清理操作。
可以通过实现 InitializingBean 和 DisposableBean 接口,或通过 @PostConstruct 和 @
PreDestroy 注解来自定义 Bean 的初始化和销毁逻辑。
Step 5
Q:: @Autowired 和 @
Qualifier 注解有什么区别?
A:: @Autowired 是 Spring 用于自动注入依赖的注解。它会自动匹配类型相同的 Bean。如果有多个类型相同的 Bean,Spring 无法决定注入哪个 Bean 时,会抛出 NoUniqueBeanDefinitionException 异常。@Qualifier 注解与 @Autowired 搭配使用,用于指明具体的 Bean 名称,以避免歧义。通过 @
Qualifier 指定 Bean 的名称后,Spring 会根据指定的名称进行依赖注入。