你好,今天我要和您分享的是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
希望对你所帮助,我们下期再见
坚持学习,加油
用户评论