先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
| — | — |
| Singleton
| Spring IoC 容器中仅存在一个 Bean 实例,以单例方式存在,是 Spring 中的默认值 |
| Prototype
| 每次从容器中调用 Bean 时,均返回一个新的实例,即每次调用 getBean()
方法,相当于 new
一个新的对象 |
| Request
| 每次 HTTP 请求均创建一个新的 Bean,仅适用于 WebApplicationContext 环境 |
| Session
| 每次 HTTP Session 共享一个 Bean,不同 Session 使用不同的 Bean,仅适用于 WebApplicationContext 环境 |
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 容器通过自动装配方式来进行依赖注入;
| 装配方式 | 说明 |
| — | — |
| no
| 默认不进行自动装配,通过显式设置 ref
属性来进行装配 |
| byName
| 通过参数名自动装配,Spring 容器在配置文件中发现 Bean
的 autowire
属性被设置为 byName
后试图匹配、装载和该 Bean
的属性具有相同名字的 Bean
|
| byType
| 通过参数类型自动装配,Spring 容器在配置文件中发现 Bean
的 autowire
属性被设置为 byType
后试图匹配、装载和该 Bean
的属性具有相同了类型的 Bean
,若发现多个 Bean
符合条件,则抛出错误 |
| constructor
| 类似于 byType
,但需要提供给构造器参数,若无固定的带参的构造器参数类型,则抛出异常 |
| autodetect
| 首先尝试使用 constructor
来自动装配,若无法工作,则使用 byType
方式 |
4.6 IoC 的优缺点
-
优点:组件之间的解耦,提高程序可维护性、灵活性;
-
缺点:创建对象步骤复杂,有一定学习成本;利用反射创建对象,效率会降低;
5.1 定义
即剖开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为 Aspect
,即切面。所谓切面即 与业务无关,但被业务模块所公用的逻辑,便于减少系统的重复代码,降低模块间的耦合度,利于后续的可操作性和可维护性。
通过使用横切,AOP 将软件切分为:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与横切关注点关系不大。横切关注点的特点是经常发生在核心关注点的多处,且各处基本相似。AOP 的作用就在于 分离系统中的各种关注点,将核心关注点和横切关注点分离开。
5.2 核心概念
5.3 AOP 的两种代理方式
Spring 提供了两种方式来生成代理对象:JDK Proxy 和 CGlib,默认的策略是如果目标类是接口,则使用 JDK 动态代理技术,否则使用 CGlib 来生成代理;
- JDK 动态接口代理
主要涉及 Proxy
和 InvocationHandler
,InvocationHandler
是一个接口,通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态地将横切逻辑与业务逻辑编制在一起。而 Proxy
则利用 InvocationHandler
动态创建一个符合某一接口的实例,生成目标类的代理对象;
- CGlib 动态代理
全称 Code Generation Library
,是一个高性能高质量的代码生成类库,能在运行期间扩展 Java 类与实现 Java 接口。 CGlib 封装了 ASM,能在运行期间动态生成新的类。
- JDK 动态代理和 CGlib 动态代理的区别
JDK 动态代理只能为接口创建代理实例,而对于没有通过接口定义业务方法的类,则需要通过 CGlib 创建动态代理;
5.4 切面的通知类型
-
前置通知(Before):目标方法在被调用前调用通知;
-
后置通知(After):目标方法完成后调用通知;
-
返回通知(After-returning):目标方法成功执行之后调用通知;
-
异常通知(After-throwing):目标方法抛出异常后调用通知;
-
环绕通知(Around):在被通知的方法调用之前和调用之后执行自定义的行为;
6.1 什么是 MVC 框架?
MVC,全称 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范。用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件中,然后在改进和个性化定制界面及用户交互的同时,不用重写业务逻辑;
采用 MVC 设计模式主要有如下好处:
-
通过分层设计,实现了业务系统各组件之间的结构,有利于业务系统的可扩展性和可维护性;
-
有利于系统的并行开发,提升开发效率;
6.2 SpringMVC
6.2.1 定义
最后
无论是哪家公司,都很重视基础,大厂更加重视技术的深度和广度,面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。
针对以上面试技术点,我在这里也做一些分享,希望能更好的帮助到大家。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
真的得到锻炼。
针对以上面试技术点,我在这里也做一些分享,希望能更好的帮助到大家。
[外链图片转存中…(img-Ab7GVyef-1713438832259)]
[外链图片转存中…(img-PVxqrBnF-1713438832259)]
[外链图片转存中…(img-DPncno8c-1713438832260)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-y7cBNdaP-1713438832260)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!