Spring面试总结
spring的核心是控制反转(IOC)和面向切面编程(AOP)
spring简介
- Spring是一个轻量级的ioc和aop容器框架。目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题以及应用开发的复杂性,简化java开发
- 优点:
- Spring属于低侵入设计,代码的污染极低
- spring的DI机制将对象之间的依赖关系交由框架处理,减低组件的耦合性
- Spring提供了AOP技术,支持将一些通用的任务,如安全,事务,日志,权限等进行集中式管理,从而提供更好的复用
- Spring对于主流的应用框架提供了集成支持
IOC
- IOC就是控制反转,把创建对象的控制权转交给spring框架进行管理,并由spring根据配置文件去创建实例和管理各个实例之间的依赖关系,对象与对象之间松耦合,也利于功能的复用,DI依赖注入,和控制反转是同一个概念的不同角度的描述,即应用程序在运行时依赖ioc容器来动态注入对象需要的外部依赖
- 最直观的表达就是,以前创建对象的主动权和时机都是自己把控的,ioc让对象的创建不用去new了,可以由spring自动生产,使用java的反射机制,根据配置文件在运行时动态的去创建对象以及管理对象,并调用对象的方法
- Spring的ioc有三种方式注入:构造器注入,set方法注入,根据注解注入
AOP
- AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
AOP作用
- 提供声明式事务;允许用户自定义切面
即 Aop 在 不改变原有代码的情况下 , 去增加新的功能 (方法增强)
<!-- 注册bean对象-->
2 <bean id="userService" class="com.Gao.Service.UserServiceImpl"/>
3 <bean id="beforeLog" class="com.Gao.Log.BeforeLog" />
4 <bean id="afterLog" class="com.Gao.Log.AfterLog" />
5
6 <!-- 配置AOP-->
7 <aop:config>
8<!-- 配置切入点 expression:表达式 * * * * * 对应(修饰词 返回值 列名 方法名 参数) -->
9 <aop:pointcut id="pointcut" expression="execution(*com.Gao.Service.UserServiceImpl.*(..))"/>
10 <!--执行环绕增强-->
11 <aop:advisor advice-ref="beforeLog" pointcut-ref="pointcut"/>
12 <aop:advisor advice-ref="afterLog" pointcut-ref="pointcut" />
13 </aop:config>
AOP详解
- AOP一般被称为面向切面编程,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为切面(Aspect),减少系统中的重复代码,降低了模块间的耦合度,提高系统的可维护性,可用于权限认证,日志,事务处理
- AOP的实现关键在于代理模式,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ,动态代理则以spring AOP为代表
- springAOP中的动态代理有两种情况:JDK代理和CGLIB代理,有接口的情况使用JDK动态代理,没有接口的情况,使用CGLIB动态代理
AOP名词解释
- 切面(Aspect):共有功能的实现,如权限切面,日志切面等。通俗理解:在实际开发中通常用一个存放共有功能实现的标准java类,当java类使用了@Aspect注解修饰时,就能被AOP容器识别为切面
- 通知(Advice):属于切面的具体实现,就是要给目标对象织入事情。通俗理解:在实际开发中通常是切面类中的一个方法,具体属于哪类通知,通过方法上的注解区分
- 连接点(JoinPoint):程序在运行过程中能够插入切面的点。通俗理解:一个类的所有方法前,后,抛出异常时等都是连接点
- 切入点(Pointcut):用于定义通知应该切入到哪些点上,不同的通知通常需要切入到不同的连接点上,这种精准的匹配是由切入点的正则表达式来定义的。通俗理解:切入点就是来定义哪些类里面的哪些方法会得到通知
- 目标对象(Target):那些即将切入切面的对象,也就是那些被通知的对象。这些对象专注业务本身的逻辑,所有的共有功能等待AOP容器的切入
- 织入(Weaving):将切面应用到目标对象从而创建一个新的代理对象的过程。这个过程可以发生在编译时、类加载时、运行时。Spring是在运行时完成织入,运行时织入通过Java语言的反射机制与动态代理机制来动态实现
- 代理对象(Proxy):将通知应用到目标对象之后被动态创建的对象。可以简单地理解为,代理对象的功能等于目标对象本身业务逻辑加上共有功能。代理对象对于使用者而言是透明的,是程序运行过程中的产物。目标对象被织入共有功能后产生的对象
Beanfactory和applicationcontext的区别
- BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器(看底层源码可以知道,ApplicationContext是BeanFactory的子类)
- 当我们使用ApplicationContext去获取bean的时候,在加载XXX.xml的时候,会创建所有的配置单实例bean
- 当我们使用BeanFactory去获取Bean的时候,我们只是实例化了该容器,而该容器中的bean并没有被实例化。当我们getBean的时候,才会实时实例化该bean对象
- BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而 ApplicationContext则是自动注册
- 区别总结:ApplicationContext启动后预载入所有的单实例Bean,所以在运行的时候速度比较快,因为它们已经创建好了。相对于BeanFactory,ApplicationContext 唯一的不足是占用内存空间,当应用程序配置Bean较多时,程序启动较慢
未完待续...