艾瑞巴蒂~好久没更新了。中途发生比较多的事情,等后面文章里慢慢会介绍哈。嘿嘿,登上公众号后台发现最近还多了几位朋友关注我的公众号。感谢。一定抽空多写几篇文章哈!把最好的一面展现给你们。大家一起学习共同进步哈。有问题我们留言区里见哈!
之前已经把Mybatis,SpringMVC有了介绍,作为SSM框架的核心Spring还没有介绍。今天就来简单说说Spring哈。Mybatis和SpringMVC没看过的朋友们建议可以先点击文章链接进去学习一下哈。点击文章即可跳转《梳理 Mybatis(一)》《梳理 Mybatis(二)》《Mybatis面试题准备+源码分析》《SpringMVC那些事儿》
Ps:Spring要说大确实里面的内容很多也很细,要说小,从我面试经验来看,spring在其中的分量也并没有占太多,问的比较多的是它一些常见的核心的(例如IOC、DI和AOP)这些基本概念and问你对它们的理解。结合我做的项目来看目前都是用SpringBoot框架了,在做这些项目的时候,只要对Spring那些常见的比较重要的点理解了知道它们是怎么一回事,做起来并没有什么太大的难度(Ps:大佬们勿喷。。小弟才疏学浅。。。还要不断学习哈)所以这篇文章就抓最主要的常用的我以往面试过程中出现次数比较多的点展开,来学习一下Spring。一来省去了其余细枝末节的东西且日后开发中用的不是很多的点,能够集中火力解决核心点。二来也稍微能减轻一下我的工作量哈,毕竟目前项目工期还是比较紧张的,只能每天抽空写点。三来也能对自己是一种提高和帮助,我第一次学习Spring的时候我也一头雾水,没能很好理解容器、DI、IOC是什么,但随着知识的不断学习、面试中频频出现的问题和项目上的打交道,渐渐的我对以前不懂的点有了自己的判断和理解,知道什么时候用,怎么用,为什么用。我想这也是很多新手或者刚入行的朋友们的通病吧。加油,随着时间的推移和你不断的学习,那些难点痛点会逐渐消失的。
送上最近收录的一句话。
马化腾曾这样评价“程序员”这份职业:“做程序员最需要的就是熬得住,有时候你努力了很长一段时间可能一点好的结果都没有,这是很正常的。所以就看你的耐心怎么样”。
送给屏幕前的你和我。坚持下去,不断学习,终有一天我们会收到我们梦寐以求的offer。
为了更好的学习,我把我当初学习Spring的一些笔记和文档资料ppt等资源放在我的百度网盘里了,有需要的朋友们欢迎领取下载。
链接如下:https://pan.baidu.com/s/1l5Dan0m4gD7wcq-FmaopHw
提取码:jusj
本篇采用面试问答形式。以往面试过程中,自己工作中常用到的重点难点以及网上高频出现的面试题作为补充,希望对你有帮助。
1.谈谈你对Spring的理解?
Spring 是一个开源框架,为简化企业级应用开发而生,是一个 IOC(DI) 和 AOP 容器框架。
主要想让你说出IOC(DI)和AOP然后面试官可以为此深入下去判断你对它们的掌握程度。
2.解释一下什么是 IOC(DI)?
IOC:控制反转 体现的是一种思想。DI:依赖注入 它是实现控制反转的一种形式。
当某个角色需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者实例。但在Spring中,创建调用者的实例不再由调用者来完成,而是由Spring来完成,然后注入到调用者中。
就是在.xml文件中创建对象的Bean,需要了就来调用这个Bean。不需要你在纯手工new Dao();
ApplicationContext ctx = newClassPathXmlApplicationContext(“application.xml”);
Dao dao = (Dao)ctx.getBean(“dao”);
3.列举常见的Spring模块?
这些模块主要被分如下图所示的核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块。Spring Core,AOP,ORM,DAO,MVC,WEB,Content
记得我有次面试提前一晚临时抱佛脚看了下面这张图,第二天面试时刚好问到了,虽然没有全部一一都报上来,但至少没有气氛很尴尬哈。
4.说说Spring的容器?
在 Spring IOC 容器读取Bean 配置创建 Bean 实例之前, 必须对它进行实例化. 只有在容器实例化后, 才可以从 IOC 容器里获取Bean 实例并使用。
BeanFactory:IOC容器的基本实现
ApplicationContext:是 BeanFactory 的子接口。几乎所有的应用场合都直接使用ApplicationContext 而非底层的 BeanFactory。
A…C的两个实现类。
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
ConfigurableApplicationContext 扩展于 ApplicationContext,新增加两个主要方法:refresh()和 close(), 让 ApplicationContext 具有启动、刷新和关闭上下文的能力。
调用 ApplicationContext 的 getBean() 方法。
5.Spring依赖注入有哪几种?
属性注入
构造器注入(可以按索引index或者按类型type注入)
6.Bean的自动装配有哪些?
Spring IOC 容器可以自动装配Bean。需要做的仅仅是在
autowire=”byType”根据类型自动装配
若 IOC 容器中有多个与目标 Bean 类型一致的 Bean.。在这种情况下, Spring 将无法判定哪个 Bean 最合适该属性, 所以不能执行自动装配
antowire=byName”根据名称自动装配
必须将目标Bean的名称和属性名设置的一样
例如:Person类下有个Car成员变量。
7.组件装配之@Resource和@Autowired的区别?
@Resource 默认按名称进行装配,通过name属性进行指定。
@Resource(name="userDao")
@Autowired 默认按类型装配。
依赖对象必须存在,如果要允许null值,可以设置它的required属性为false @Autowired(required=false)。
也可以使用名称装配,配合@Qualifier注解。@Qualifier("userDao")
总结:@Autowired自动注解,举个例子吧,一个类,俩个实现类,@Autowired就不知道注入哪一个实现类,而@Resource有name属性,可以区分。
Ps: @Inject 和@Autowired 注解一样也是按类型匹配注入的 Bean, 但@Innject没有 reqired 属性
8.Bean之间的关系?
继承
有子Bean父Bean概念。parent属性来进行具体指定。
抽象Bean abstract属性为true的Bean
依赖
前置依赖的 Bean 会在本 Bean实例化之前创建好。depends-on来设定。
9.Bean 的作用域有哪些?
在 Spring 中, 可以在
默认singleton只为每个在 IOC 容器里声明的Bean 创建唯一一个实例, 整个 IOC 容器范围内都能共享该实例。getBean()和Bean引用都返回这个唯一Bean。
prototype每个Bean调用一次都返回一个新实例。
例如:创建一个实例,singleton的话相当于只调用构造方法一次,prototype的话每使用一次就会调构造方法中的输出语句。
request&session该作用域仅适用于WebApplicationContext环境
10.使用外部属性文件。配置数据库等信息
Spring 2.5 之后: 可通过
11.Spring表达式语言:SpEL
SpEL 使用 #{…}作为定界符,所有在大框号中的字符都将被认为是 SpEL。
知道这个东西叫啥就行下次别人问起,SpEL心中知道个大概就行。通俗点来说就是#{花括号里能干很多事情,既能加减乘除又能调用别人的属性或方法}
12.聊聊Spring里的生命周期?
Spring IOC 容器对 Bean的生命周期进行管理的过程:
通过构造器或工厂方法创建 Bean 实例
为 Bean 的属性设置值和对其他 Bean 的引用
调用 Bean 的初始化方法(init-method)
Bean 可以使用了
当容器关闭时, 调用 Bean 的销毁方法(destroy-method)
创建Bean实例-->属性设置值-->初始化方法-->使用-->销毁
13.Bean后置处理器BeanPostProcessor
Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理。
其典型应用是: 检查 Bean 属性的正确性或根据特定的标准更改 Bean 的属性.
在初始化方法被调用前后, Spring 将把每个 Bean 实例分别传递给上述接
口的以下两个方法:
publicObject postProcessBeforeInitialization(Objectarg0, String arg1) throws BeansException {}
publicObject postProcessAfterInitialization(Objectarg0, String arg1) throws BeansException {}
14.Bean的配置方式有哪几种?
通过全类名(反射)
通过工厂方法(静态工厂和实例工厂)
①调用静态工厂方法创建 Bean 是将对象创建的过程封装到静态方法中
②将对象的创建过程封装到另外一个对象实例的方法里
FactoryBean
Spring 中有两种类型的 Bean,一种是普通Bean, 另一种是工厂Bean, 即FactoryBean.
工厂 Bean 跟普通Bean不同, 其返回的对象不是指定类的一个实例, 其返回的是该工厂 Bean 的getObject方法所返回的对象
15.FactoryBean和BeanFactory的区别?
BeanFactory是SpringIOC容器的基本实现。它是 IOC 的基本容器,负责管理和加载 Bean,它子容器是我们所熟知的ApplicationContext。
FactoryBean 是一个接口,它本身就是一个对象工厂,如果bean 实现了这个接口,它被用作公开的对象工厂,而不是作为直接将bean暴露的实例。返回的是该工厂 Bean 的 getObject 方法所返回的对象
16.Bean的配置形式有哪几种?
基于xml文件
基于注解
组件扫描(component scanning): Spring 能够从 classpath 下自动扫描, 侦测和实例化具有特定注解的组件.
特定组件包括:
@Component:基本注解, 标识了一个受 Spring 管理的组件
@Respository:标识持久层组件
@Service:标识服务层(业务层)组件
@Controller:标识表现层组件
base-package属性指定一个需要扫描的基类包,Spring 容器将会扫描这个基类包里及其子包中的所有类.
当需要扫描多个包时, 可以使用逗号分隔.
如果仅希望扫描特定的类而非基包下的所有类,可使用 resource-pattern 属性过滤特定的类。
*********后面SpringBoot是@CompoentScan的作用************
定义Spring Beans的第一步是使用正确的注解-@Component或@Service或@Repository或@Controller.
Spring不知道你定义了某个bean除非它知道从哪里可以找到这个bean.@ComponentScan做的事情就是告诉Spring从哪里找到bean
由你来定义哪些包需要被扫描。一旦你指定了,Spring将会在被指定的包及其下级的包(sub packages)中寻找bean
@ComponentScan自动扫描组件(Spring里有4大组件哦!)该注解默认会扫描该类所在的包下所有的配置类,相当于之前的
======================相当于把你定义的那些Component或@Service或@Repository告诉Spring,他们在哪。
Ps:如果你的其他包都在使用了@SpringBootApplication注解(启动类)所在的包及其下级包,则你什么都不用做,
SpringBoot会自动帮你把其他包都扫描了。
未完待续。。。。
敬请关注。。。。
好好学习。。。。
天天向上。。。。