最后
俗话说,好学者临池学书,不过网络时代,对于大多数的我们来说,我倒是觉得学习意识的觉醒很重要,这是开始学习的转折点,比如看到对自己方向发展有用的信息,先收藏一波是一波,比如如果你觉得我这篇文章ok,先点赞收藏一波。这样,等真的沉下心来学习,不至于被找资料分散了心神。慢慢来,先从点赞收藏做起,加油吧!
另外,给大家安排了一波学习面试资料:
以上就是本文的全部内容,希望对大家的面试有所帮助,祝大家早日升职加薪迎娶白富美走上人生巅峰!
3. Spring 常用注解
4. IoC 原理
4.1 定义
Spring 通过一个配置文件来描述 Bean
之间的相互依赖关系,利用 Java 的反射功能来实例化 Bean
并建立 Bean
之间的依赖关系。Spring 的 IoC 容器在完成这些底层工作的基础上,还提供 Bean
实例缓存、生命周期管理、Bean
实例代理、事件发布、资源装载等高级服务;
总结而言:IOC 负责创建对象、管理对象(通过依赖注入)、整合对象、配置对象以及管理对象的生命周期;
4.2 Spring 容器高层视图
- Spring 启动时先读取
Bean
配置信息,并在 Spring 容器中生成一份对应的Bean
配置注册表; - 根据上一步中生成的
Bean
配置注册表来实例化Bean
,并装配好Bean
之间的依赖关系; - 将实例化后的
Bean
装载到 Spring 容器中的Bean
缓存池中,供上层的应用程序使用;
4.3 Spring Bean 的作用域及生命周期
4.3.1 作用域
Spring 中,用来组成应用程序的主体以及由 Spring IoC 容器所管理的对象叫做 Bean。简而言之,Bean 就是由 IoC 容器来进行初始化、装配和管理的对象。
Bean 的作用域主要有如下几种:
- Singleton(单例)
作用域为 Singleton
,该模式在多线程下不安全,表明 IoC 容器中只会存在一个共享 Bean 实例,而且所有对 Bean 的请求,主要 id
和该 Bean 定义相匹配,那么就会返回 Bean 的同一实例。Singleton
是单例模型,即在从创建容器的同时就会自动创建一个 Bean 的对象,无论是否使用,而且 每次获取到的对象都是同一对象。
- Prototype(原型):每次创建时使用
作用域为 Prototype
,表明一个 Bean 定义对应多个实例,该作用域中的 Bean 会导致在 每次对该 Bean 请求时均创建一个新的 Bean 实例。Prototype
是一个原型类型,在我们创建容器时并未实例化,而是当我们获取 Bean 时才去创建一个对象,而且每次获取到的对象都不一样。
- Request:一次 request 一个实例
作用域为 Request
,表明在一次 HTTP
请求中,容器返回该 Bean 的同一个实例,即每个 HTTP
请求均有各自的 Bean 实例,依据某个 Bean 定义创建而成,只在基于 Web 的 Spring ApplicationContext 情形下有效。当一次 HTTP
请求处理结束时,该作用域中的 Bean 实例均被销毁。
- Session
作用域为 Session
,表明 在一个 HTTP Session
中,容器返回该 Bean 的同一个实例,对不同的 Session
请求则创建新的实例,该 Bean
实例仅在当前 Session
内有效,只在基于 Web 的 Spring ApplicationContext 情形下有效。当一个 HTTP Session
被废弃时,在该作用域内的 Bean 也将失效。
4.3.2 生命周期
- Spring 对 Bean 进行实例化;
- Spring 将值和 Bean 的引用注入到 Bean 对应属性中;
- 若 Bean 实现了 BeanNameAware 接口,则 Spring 将 Bean 的 ID 传递给 setBeanName() 方法;
- 若 Bean 实现了 BeanFactoryAware 接口,Spring 将调用
setBeanFactory()
方法,将 Bean 所在应用引用传入进来; - 若 Bean 实现了 ApplicationContextAware 接口,Spring 将调用
setApplicationContext()
方法,将 Bean 所在应用的引用传入进来; - 若 Bean 实现了 BeanPostProcessor 接口,Spring 将调用
post-ProcessBeforeInitalization()
方法; - 若 Bean 实现了
InitializingBean
接口,Spring 将调用他们的after-PropertiesSet()
方法,类似地,如果 Bean 使用init-method
声明了初始化方法,则该方法也会被调用; - 若 Bean 实现了 BeanPostProcessor 接口,Spring 将调用他们的
post-ProcessAfterInitialization()
方法; - 此时,Bean 已经准备就绪,我们就可以被应用程序使用,他们将一直驻留在应用上下文中,直到该应用被销毁;
- 若 Bean 实现了 DisposableBean 接口,Spring 将调用它的
destory()
接口方法;同样,若 Bean 使用destroy-method
声明了销毁方法,该方法也将被调用;
4.4 Spring 依赖注入的四种方式
- 构造器注入
// 带参,方便用构造器进行注入
public CatDaoImpl(String name){
this.name = name;
}
- setter 方法注入
public class Id {
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
- 静态工厂注入
所谓静态工厂就是通过调用静态工厂的方法来获取自己所需对象,而且为了方便 Spring 管理,我们不能通过 “类.静态方法()” 来获取对象,而应该通过 Spring 注入的形式;
// 静态工厂
public class DaoFactory {
public static final FactoryDao getStaticFactoryDaoImpl(){
return new StaticFacotryDaoImpl();
}
}
public class SpringAction {
// 需要注入的对象
private FactoryDao staticFactoryDao;
// 注入对象的 set 方法
public void setStaticFactoryDao(FactoryDao staticFactoryDao) {
this.staticFactoryDao = staticFactoryDao;
}
}
- 实例工厂
实例工厂表示获取对象实例的方法不是静态的,所以需要先 new
工厂类,然后再调用普通的实例方法;
// 实例工厂
public class DaoFactory {
public FactoryDao getFactoryDaoImpl(){
return new FactoryDaoImpl();
}
}
public class SpringAction {
// 注入对象
private FactoryDao factoryDao;
public void setFactoryDao(FactoryDao factoryDao) {
this.factoryDao = factoryDao;
}
}
4.5 Spring 自动装配方式
要实现自动装配,主要从如下两个角度来进行实现:
- 组件扫描(Component Scanning):Spring 会自动发现应用上下文中所创建的 Bean;
- 自动装配(Autowiring):Spring 自动满足 Bean 之间的依赖;
Spring 装配包括 手动转配和自动装配,手动装配是通过 XML
装配、构造方法、setter
方法等方式;
而自动装配有如下几种,使得 Spring 容器通过自动装配方式来进行依赖注入;
4.6 IoC 的优缺点
- 优点:组件之间的解耦,提高程序可维护性、灵活性;
- 缺点:创建对象步骤复杂,有一定学习成本;利用反射创建对象,效率会降低;
5. AOP 原理
最后
看完美团、字节、腾讯这三家的面试问题,是不是感觉问的特别多,可能咱们又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。
开篇有提及我可是足足背下了1000道题目,多少还是有点用的呢,我看了下,上面这些问题大部分都能从我背的题里找到的,所以今天给大家分享一下互联网工程师必备的面试1000题。
注意不论是我说的互联网面试1000题,还是后面提及的算法与数据结构、设计模式以及更多的Java学习笔记等,皆可分享给各位朋友
互联网工程师必备的面试1000题
而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题。