1. Spring 的核心特性是什么?Spring 优点?
Spring 的核心是控制反转(IoC)和面向切面(AOP)
Spring 优点:
(1) 方便解耦,简化开发 (高内聚低耦合)
Spring 就是一个大工厂(容器),可以将所有对象创建和依赖关系维护,交给 Spring
管理
spring 工厂是用于生成 bean
(2) AOP 编程的支持
Spring 提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
(3) 声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程
(4) 方便程序的测试
Spring 对 Junit4 支持,可以通过注解方便的测试 Spring 程序
(5) 方便集成各种优秀框架
Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、
Hibernate、MyBatis、Quartz 等)的直接支持
(6) 降低 JavaEE API 的使用难度
Spring 对 JavaEE 开发中非常难用的一些 API(JDBC、JavaMail、远程调用等), 都提供了封装,使这些 API 应用难度大大降低
2. spring 框架中需要引用哪些 jar 包,以及这些jar 包的用途
4 + 1 : 4 个核心( beans 、 core 、 context 、 expression ) + 1 个依赖
(commons-loggins…jar)
3. 理解AOP、IoC 的基本原理;
IOC:控制反转(IoC)与依赖注入(DI)是同一个概念, 控制反转的思想:
传统的 java 开发模式中,当需要一个对象时,我们会自己使用 new 或者getInstance 等直接或者间接调用构造方法创建一个对象。而在 spring 开发模式中,spring 容器使用了工厂模式为我们创建了所需要的对象,不需要我们自己创建了,直接调用 spring 提供的对象就可以了。
引入 IOC 的目的:
(1)脱开、降低类之间的耦合;(2)倡导面向接口编程、实施依赖倒换原则;
(3)提高系统可插入、可测试、可修改等特性
AOP:面向切面编程(AOP)
面向切面编程思想:
在面向对象编程(oop)思想中,我们将事物纵向抽成一个个的对象。而在面向切面编程中,我们将一个个的对象某些类似的方面横向抽成一个切面,对这个切面进行一些如权限控制、事物管理,记录日志等公用操作处理的过程。
切面:简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
AOP 底层:动态代理。
如果是接口采用 JDK 动态代理,如果是类采用 CGLIB 方式实现动态代理。
4. AOP 的一些场景应用;
AOP 用来封装横切关注点,具体可以在下面的场景中使用:
Authentication 权限
Caching 缓存
Context passing 内容传递Error handling 错误处理Lazy loading 懒加载Debugging 调试
logging, tracing, profiling and monitoring 记录跟踪 优化 校准
Performance optimization 性能优化
Persistence 持久化Resource pooling 资源池Synchronization 同步Transactions 事务
5. spring 注入的几种方式
(1) 构造方法注入
(2) setter 注入
(3) 基于注解
6. Spring 中Bean 的作用域有哪些
作用域:用于确定 spring 创建 bean 实例个数取值(常用的两个):
singleton 单例,默认值。
prototype 多例,一个 bean 的定义可以有多个实例。每执行一次 getBean 将获得一个实例。
7. 请介绍一下bean 的生命周期
(1) bean 定义:在配置文件里面用来进行定义。
(2) bean 初始化:有两种方式初始化:
在配置文件中通过指定 init-method 属性来完成
实现 org.springframwork.beans.factory.InitializingBean 接口
(3) bean 调用:有三种方式可以得到 bean 实例,并进行调用
(4) bean 销毁:销毁有两种方式
使用配置文件指定的 destroy-method 属性
实现 org.springframwork.bean.factory.DisposeableBean 接口
8. Spring 中自动装配的方式有哪些
no:不进行自动装配,手动设置 Bean 的依赖关系。byName:根据 Bean 的名字进行自动装配。byType:根据 Bean 的类型进行自动装配。
constructor:类似于 byType,不过是应用于构造器的参数,如果正好有一个 Bean
与构造器的参数类型相同则可以自动装配,否则会导致错误。
autodetect:如果有默认的构造器,则通过 constructor 的方式进行自动装配,否则使用 byType 的方式进行自动装配。
(自动装配没有自定义装配方式那么精确,而且不能自动装配简单属性(基本类型、字符串等),在使用时应注意。)
9. @Resource 和 @Autowired 区别?分别用在什么场景?
(1) 共同点:两者都可以写在字段和 setter 方法上。两者如果都写在字段上, 那么就不需要再写 setter 方法。
(2) 不同点:
@Autowired
@Autowired 为 Spring 提 供 的 注 解 , 需 要 导 入 包org.springframework.beans.factory.annotation.Autowired;只按照 byType 注入。@Autowired 注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许 null 值,可以设置它的 required 属性为 false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier 注解一起使用。@Resource
@Resource 默 认 按 照 ByName 自 动 注 入 , 由 J2EE 提 供 , 需 要 导 入 包javax.annotation.Resource。@Resource 有两个重要的属性:name 和 type,而 Spring将@Resource 注解的 name 属性解析为 bean 的名字,而 type 属性则解析为 bean 的类型。所以,如果使用 name 属性,则使用 byName 的自动注入策略,而使用type 属性时则使用 byType 自动注入策略。如果既不制定 name 也不制定 type 属性,这时将通过反射机制使用 byName 自动注入策略。
10. Hibernate 和 mybatis 的区别?
(1) 两者最大的区别
针对简单逻辑,Hibernate 与 MyBatis 都有相应的代码生成工具,可以生成简单基本的 DAO 层方法。
针对高级查询,MyBatis 需要手动编写SQL 语句,以及ResultMap,而 Hibernate
有良好的映射机制,开发者无需关心 SQL 的生成与结果映射,可以更专注于流程。
(2) 开发难度对比
Hibernate 的开发难度大于 MyBatis,主要由于 Hibernate 比较复杂,庞大, 学习周期比较长。
MyBatis 则相对简单,并且 MyBatis 主要依赖于生气了的书写,让开发者刚进更熟悉。
(3) sql 书写比较
Hibernate 也可以自己写 sql 来指定需要查询的字段, 但这样就破坏了
Hibernate 开发的简洁性,不过 Hibernate 具有自己的日志统计。
MyBatis 的 sql 是手动编写的,所以可以按照要求指定查询的字段,不过没有自己的日志统计,所以要借助 Log4j 来记录日志。
(4) 数据库扩展性计较
Hibernate 与数据库具体的关联在 XML 中,所以 HQL 对具体是用什么数据库并不是很关心
MyBatis 由于所有 sql 都是依赖数据库书写的,所以扩展性、迁移性比较差。
(5) 缓存机制比较
Hibernate 的二级缓存配置在 SessionFactory 生成配置文件中进行详细配置, 然后再在具体的表对象映射中配置那种缓存。
MyBatis 的二级缓存配置都是在每个具体的表对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓冲机制,并且 MyBatis 可以在命名空间中共享相同的缓存配置和实例,通过 Cache-ref 来实现。
两者比较,因为 Hibernate 对查询对象有着良好的管理机制,用户无需关心 SQL, 所以在使用二级缓存时如果出现脏数据,系统会报出错误提示。 而 MyBatis 在这一方面使用二级缓存时需要特别小心,如果不能完全去顶数据更新操作的波及范围,避免 cache 的盲目使用,否则,脏数据的出现会给系统的正常运行带来很大的隐患。