【面试题集】Spring的工作机制及底层实现

概念

品茗IT-面试题集-首发

如果大家正在寻找一个java的学习环境,或者在开发中遇到困难,可以加入我们的java学习圈,点击即可加入,共同学习,节约学习时间,减少很多在学习中遇到的难题。

Spring是一个开源的轻量级框架,他的核心主要有两部分组成IOC控制反转和AOP面向切面编程。无论是IOC还是AOP,都是基于动态代理实现的。

IOC(Inverse of Contro)控制反转: 有时候也被称为DI依赖注入,它是一种降低对象耦合关系的一种设计思想。

  • Spring 中,Bean是被实例的,组装的及被Spring 容器管理的Java对象;
  • 所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓的反转;
  • 所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。
  • 通过IOC容器,开发人员不需要关注对象是如何创建的,同时增加新类也非常方便,只需要修改配置文件即可实现对象的热插拔;
  • 对象是通过反射机制实例化出来的,因此对系统的性能有一定的影响,而且创建对象的流程变得复杂。

AOP((Aspect-OrientedProgramming)面向切面编程: 面向对象开发的一种补充,它允许开发人员在不改变原来模型的以满足新的需求,例如,开发人员可以在不改变原来业务逻辑模型的基础可以进行动态的增加日志,安全或异常处理功能。

  • 基于动态代理,在代理对象执行方法前/后增加自定义的功能;
  • 比如记录日志功能,首先定义切面,Spring根据切面,在执行切面前/后可以获取到输入参数、返回值,作为日志记录的依据;
  • Spring的AOP是IOC的基础上才能实现的,拥有bean的代理权,才能在bean执行前后做切面。

bean注入方式

Spring注入bean的方式有三种:

  1. 通过配置文件注入,如:
<bean id="userService" class="com.lyu.spring.service.impl.UserService">
    <property name="userDao" ref="userDaoMyBatis"></property>
</bean>
  1. 通过@Autowired注入,spring注解,默认是以byType的方式去匹配与属性名相同的bean的id,如果没有找到,就通过byName的方式去查找,使用@Qualifier注解(spring注解)指定某个具体名称的bean,如:
@Autowired
@Qualifier("userDaoJdbc")
private IUserDao userDao;
  1. 通过@Resource注入,java的注解,默认以byName的方式去匹配与属性名相同的bean的id,如果没有找到就会以byType的方式查找,如:
@Resource("userDaoMyBatis")
private IUserDao userDao;

@Autowired和@Resource都可以实现Spring的bean注入,@Autowired是Spring的注解,@Resource是java的注解,如果以byName方式注入,@Resource相当于@Autowired + @Qualifier。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章