《WEB框架 面试题 转行为人民服务 供有需要的人学习》
- 面试题1、详细谈谈你对Spring的理解(****)?
- 面试题2、Spring动态代理原理(***)
- 面试题3、 AOP的原理是什么?有哪些实现的方式?
- 面试题4、既然谈到了AOP,你在项目中如何使用AOP的,AOP还能有哪些应用?
- 面试题5、说说你对Spring事务的理解?
- 面试题5、beanfactory和factorybean的区别?
- 面试题5、你对Mybatis框架的理解 (底层实现难)
- 面试题6、 Mybatis与hibernate不同
- 面试题7、Sring MVC的框架执行流程
- 面试题8、对Restful有了解过吗?
- 面试题9、SSM框架为什么能整合?
- -Redis框架面试题
- MyBatis SQL 注入讲一下,怎么避免
面试题1、详细谈谈你对Spring的理解(****)?
Spring框架是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。如果没有Spring,传统的Web后端开发中,是使用EJB完成我们的javaee开发的。当然我对这个EJB也不怎么了解,传统的web后端Service去调用不同的Dao实现类,我们只能手动的在Service中更改,这样的化,Service和dao之间耦合程度就太高了。这个时候,我们想把需要更改的需要设定的Dao实现类放到某个配置文件中,然后去定义一个工具类,去去读配置文件里面的Dao实现类,然后调用反射的思想,就可以Service中创建Dao的实现类。这样的化,Service和Dao之间的依赖关系就会降低。
Spring主要目的就是为对象直接的依赖关系解耦。通过IOC控制反转,由容器管理对象,对象直接的依赖关系,原先在程序中创建对象的方式更改为由容器完成。对象直接的依赖解耦合。
如果没有Spring,传统的WEB后端开发中,Service中调用Dao层中的对象属性或者方法,比如说我的DAO中有一个UserDao接口,针对MySQL数据库我写了一个UserDaoMysqlImpl,Service中调用的时候只需要UserDao userdao = new UserDaoMysqlImpl();即可使用。如果此时有多个UserDaoOracleImpl,UserDaoHbaseImpl,或者UserDaoSQLServerImpl,每次换不同的数据库,都要在Service 中的UserDao userdao = new UserDaoHbaseImpl()中更换。
如果此时我们想让Service调用不同的Dao实现类耦合程度更低,不用每次都到代码中更改,我们可以自己在文本文件中定义一个容器,描述好对象的属性值读取自定义的文本文件,通过反射的方式Class.forName(“com.mysql.jdbc.Driver”)创建Service类。参考工程:01-miniSpring
关键在于自己写一个Container,负责读取文本,解析每一行,由于UserServiceImpl中有成员变量userDao,因此先要反射创建两个object,然后存放在map<String,object>中,然后还是需要通过反射获得Service对象,然后修改其成员变量的值。
运行效果:
Spring主要目的就是为对象直接的依赖关系解耦,通过IOC控制反转,由容器管理对象,对象直接的依赖关系,原先在程序中创建对象的方式更改为由容器完成。对象直接的依赖解耦合。
什么叫IOC控制反转?
控制反转包含两层含义:1、控制 2、反转
- 控制:控制对象的创建、销毁、属性的赋值,对象的整个生命周期的创建与销毁
- 反转与正转相对应,正转是在程序代码中,由开发人员使用new构造器创建对象,开发人员有权限主动创建对象
而反转是将开发人员创建对象的权限转移到代码之外的容器,在程序代码之外,由容器实现对象的创建和属性的赋值。
若classB是classA的成员变量,classA使用classB的属性或方法,则classA依赖classB.。
IOC控制反转的实现方式有两种:
- 依赖查找DL(Dependency Look):sun公司曾经提出过这种方法,通过特定的类和方法在容器中查找对象,把找到的对象赋值给依赖其的对象
- 依赖注入DI(Dependency Injection):注入就是赋值的意思,我们只需要提供对象名称给容器,由容器创建对象,查询对象,把找到的对象赋值给依赖其的对象,而不是特定的类。依赖注入是日前最优秀的解藕方式,让Spring的Bean之问以配置文件的方式组织在一起,而不是硬编码方式耦合。
Spring框架使用的就是DI这种技术,所以它特地在网站上表明其特征是DI。 当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。即,不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
Spring 基于XML和注解的两种方式注入比较
- 基于XML配置文件方式,配置文件的内容和源代码是完全分离的,修改属性只需要修改配置文件即可,所以可以把经常可能改变的属性值的bean定义在xml中。代码量相对注解方式多,开发效率低。
- 基于注解的方式开发的效率高,可读性好。缺点在于以硬编码方式写入到Java代码中,需要重新编译代码,而基于XML方式只需重启服务器重新加载即可。