前言
日更SpringBoot
相关面试题,每日两题
问题①:
问题描述
@Autowired
和@Resource
的区别是什么?
问题难度及重要程度
这是一个相对间的问题,@Resource
和@Autowired
都是在做bean的注入时使用的注解,我们平时在代码中也用的很多,但是跟多人都不明白二者有什么区别之处
答案
相同点:
两者都是可以放在字段和setter方法上的。两者如果放在字段上,那么就不需要写setter方法
不同点:
@Autowired
@Autowired
是Spring提供的注解,需要导入org.springframework.beans.factory.annotation.Autowired
;只按照byType注入
默认情况下使用@Autowired导入的依赖对象必须是存在的,如果允许null值,可以设置他的required属性为false。如果我们想要使用@Autowired注解按照byName的方式来装配,可以结合@Qualifier注解一起使用
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
boolean required() default true;
}
@Resource
@Resource注解装配默认方式是ByName的方式自动注入,由J2EE提供,需要导入javax.annotation.Resource。
@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名称,而type属性解析为bean的类型。所以使用name属性,则使用byName的方式装配,使用type属性则会通过byType的方式装配。如果都不使用,则会通过反射机制使用byName的自动注入策略
综上所述,@Resource的作用其实是和@Autowired一样的,只是@AutoWired注解是由Spring提供的,而@Resource注解是由J2EE提供的,两者的作用都是自动装配bean,只是装配的方式又有所区别,@Autowired默认通过按照类型的方式进行自动装配bean,而@Resource既可以通过名称装配也可以通过类型装配(默认是通过byName的方式装配)。
问题②
问题描述
Spring
中的Bean的生命周期
问题难度及重要程度
比较简单基础的一个问题,被询问几率较大
答案
1、实例化
当容器实例化一个bean时,spring会调用bean的一个构造方法来创建一个实例
2、属性设置
当bean被实例化后,spring会通过依赖注入(DI)的方式来设置bean的属性;spring还会通过xml配置文件、注解、java配置类来对bean进行管理
3、初始化
当所有的属性都被设置完后,spring会调用初始化方法来对bean进行特定的初始化操作,这个初始化需要通过xml配置文件、注解、java配置类来指定
4、使用
当bean初始化完成后就可以在程序中进行使用了
5、销毁
当容器关闭时,spring会调用销毁方法将bean销毁
在bean的生命周期中前面三个过程比较重要,如果实例化失败,则不会发生后续操作;同理,如果一个bean的属性设置出现错误,则不会进行初始化操作。因此,在实际开发中一定要注意bean的生命周期,确保bean的生命周期是按照正常的顺序进行的,否则会出现潜在的问题。