Spring-什么是Spring,IOC,AOP,Autowired和Resource区别,依赖注入(1-4,共13)

2021-11-05 04:11:1414:18 760
所属专辑:Java面试系列
声音简介

你好,今天我要和您分享的是java面试--Spring篇(1-4个小节,共13个小节)



在上期当中,我们学习了:


1、说说自己是怎么使用 synchronized 关键字,在项目中用到了吗?

2、讲一下 synchronized 关键字的底层原理

3、为什么要用线程池?

4、实现Runnable接口和Callable接口的区别

5、执行execute()方法和submit()方法的区别是什么呢?

6、如何创建线程池?



今天我们来学习:


1、 Spring的IOC和AOP机制?

2、 Spring中Autowired和Resource关键字的区别?

3、依赖注入的方式有几种,各是什么?

4、讲一下什么是Spring




那话不多说,我们开始学习吧



1、 Spring的IOC和AOP机制?


我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂。


主要用到的设计模式有工厂模式和代理模式。

IOC就是典型的工厂模式,通过SessionFactory去注入实例。

AOP就是典型的代理模式的体现。


代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。

代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务,这就好比我们要租一个房子,一般是通过房产中介和房东联系,代理类可以看做房产中介,委托类为租房的人。


spring的IoC容器是spring的核心,spring AOP是spring框架的重要组成部分。

在传统的程序设计中,当调用者需要被调用者的协助时,通常由调用者来创建被调用者的实例。但在spring里创建被调用者的工作不再由调用者来完成,因此控制反转(IoC);创建被调用者实例的工作通常由spring容器来完成,然后注入调用者,因此也被称为依赖注入(DI),依赖注入和控制反转是同一个概念。


面向方面编程(AOP)是以另一个角度来考虑程序结构,通过分析程序结构的关注点来完善面向对象编程(OOP)。OOP将应用程序分解成各个层次的对象,而AOP将程序分解成多个切面。spring AOP 只实现了方法级别的连接点,在J2EE应用中,AOP拦截到方法级别的操作就已经足够。在spring中,未来使IoC方便地使用健壮、灵活的企业服务,需要利用spring AOP实现为IoC和企业服务之间建立联系。


IOC:控制反转也叫依赖注入。利用了工厂模式 将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类(假设这个类名是A),分配的方法就是调用A的setter方法来注入,而不需要你在A里面new这些bean了。 注意:面试的时候,如果有条件,画图,这样更加显得你懂的这个原理.


那下面是

spring ioc初始化流程



什么是

AOP:就是我们通常说的面向切面编程。(Aspect-Oriented Programming) AOP可以说是对OOP的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系(这里可以理解为与业务无关)。在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。 将程序中的交叉业务逻辑(比如安全,日志,事务等等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。


实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码.


简单点解释,比方说你想在你的biz层所有类中都加上一个打印‘你好’的功能,这时就可以用aop思想来做.你先写个类方法,方法经实现打印‘你好’,然后Ioc这个类引用 ref=“biz.*”让每个类都注入即可实现。



2、 Spring中Autowired和Resource关键字的区别?


@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,使用时需要导入,但是Spring支持该注解的注入。


@Resource和@Autowired有什么共同点和不同点呢?


2.1、共同点

两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。


2.2、不同点

(1)@Autowired

@Autowired是Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。

具体的代码请返回文稿查看

public class TestServiceImpl { // 下面两种@Autowired只要使用一种即可 @Autowiredprivate UserDao userDao; // 用于字段上@AutowiredpublicvoidsetUserDao(UserDao userDao) { // 用于属性的方法上this.userDao = userDao; }}

@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。如下:

publicclassTestServiceImpl { @Autowired@Qualifier("userDao") private UserDao userDao; }


(2)@Resource

@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。

如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。

publicclassTestServiceImpl { // 下面两种@Resource只要使用一种即可@Resource(name="userDao") private UserDao userDao; // 用于字段上@Resource(name="userDao") publicvoidsetUserDao(UserDao userDao) { // 用于属性的setter方法上this.userDao = userDao; }}

注:最好是将@Resource放在setter方法上,因为这样更符合面向对象的思想,通过set、get去操作属性,而不是直接去操作属性。


@Resource装配顺序:

①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。

②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。

③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。

④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。


@Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。



3、依赖注入的方式有几种,各是什么?



一、构造器注入 将被依赖对象通过构造函数的参数注入给依赖对象,并且在初始化对象的时候注入。

优点: 对象初始化完成后便可获得可使用的对象。

缺点: 当需要注入的对象很多时,构造器参数列表将会很长; 不够灵活。如果有多种注入方式,每种方式只需注入指定几个依赖,那么就需要提供多个重载的构造函数,麻烦。


二、setter方法注入 IoC Service Provider通过调用成员变量提供的setter函数将被依赖对象注入给依赖类。

优点: 灵活。可以选择性地注入需要的对象。

缺点: 依赖对象初始化完成后由于尚未注入被依赖对象,因此还不能使用。


三、接口注入 依赖类必须要实现指定的接口,然后实现该接口中的一个函数,该函数就是用于依赖注入。该函数的参数就是要注入的对象。


优点 接口注入中,接口的名字、函数的名字都不重要,只要保证函数的参数是要注入的对象类型即可。

缺点: 侵入行太强,不建议使用。

PS:什么是侵入行? 如果类A要使用别人提供的一个功能,若为了使用这功能,需要在自己的类中增加额外的代码,这就是侵入性。



4、讲一下什么是Spring



Spring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。


常见的配置方式有三种:

1、基于XML的配置、

2、基于注解的配置、

3、基于Java的配置。


Spring主要由以下几个模块组成:

1、Spring Core:核心类库,提供IOC服务;

2、Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等);

3、Spring AOP:AOP服务,切面编程;

4、Spring DAO:对JDBC的抽象,简化了数据访问异常的处理;

5、Spring ORM:对现有的ORM框架的支持;

6、Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传;

7、Spring MVC:提供面向Web应用的Model-View-Controller实现。



好了,今天我们学习了:


1、 Spring的IOC和AOP机制?

2、 Spring中Autowired和Resource关键字的区别?

3、依赖注入的方式有几种,各是什么?

4、讲一下什么是Spring



希望对你所帮助,我们下期再见


坚持学习,加油



用户评论

表情0/300
喵,没有找到相关结果~
暂时没有评论,下载喜马拉雅与主播互动
猜你喜欢
SPRING

《heyyou》录制于2015年12月,由制作过香奈儿亚太主题音乐、乔丹、张靓颖等大牌品牌、艺人的美国F1st音乐团队倾力打造。由百万粉丝主播张振浩演唱,收录...

by:华语音乐

Silence Spring

此书献给阿尔伯特·施维茨,他声明人类的软件和自制力已然消失殆尽,人类将毁灭地球,并随后毁灭自身。

by:主播阿琨

Spring MVC

课程介绍:SpringMVC属于SpringFrameWork的后续产品,已经融合在SpringWebFlow里面。Spring框架提供了构建Web...

by:e安在线

Spring全家桶:Spring→Boot→MVC→Cloud→Security

突击面试,总结Spring全家桶(Spring/Boot/MVC/Cloud/Security)面试涨薪题解与底层原理源码等学习视频!官方小助理【V:mf975...

by:马士兵老师