spring那些事
I1.什么是 Spring
Spring 主要用来开发Java 应用,但是有些扩展是针对 构建 J2EE 平台的 web 应用。Spring 框架目标是简化 Java 企业级应用开发,并通过POJO为基础的编程 模型促进良好的编程习惯。 、你们项目中为什么使用 框架?这么问的话,就直接说 Spring 框架的好处就可以了。比如说 Spring 有以下特点:轻量:Spring 是轻量的,基本的版本大约 2MB。 控制反转:Spring 通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找 依赖的对象们。 面向切面的编程( :Spring 支持面向切面的编程,并且把应用业务逻辑和系统服务分开。 容器:Spring 包含并管理应用中对象的生命周期和配置。框架 :Spring 的 WEB 框架是个精心设计的框架,是 Web 框架的一个很好的替代品。事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务 (JTA )。 异常处理:Spring 提供方便的 API 把具体技术相关的异常(比如由JDBC ,HibernateorJDO抛 出的)转化为一致的 unchecked 异常。 、 和 关键字的区别?@Resource 和@Autowired 都是做 bean 的注入时使用,其实@Resource 并不是Spring的注解,它的 包是 javax.annotation.Resource ,需要导入,但是 Spring 支持该注解的注入。1、共同点 两者都可以写在字段和 setter 方法上。两者如果都写在字段上,那么就不需要再写setter 方法。2、不同点 ( 1 )
@Autowired @Autowired 为 Spring 提供的注解,需要导入包 org.springframework.beans.factory.annotation.Autowired;只按照byType 注入。public class TestServiceImpl { // 下面两种@Autowired 只要使用一种即可 @Autowired private UserDao userDao; // 用于字段上 @Autowired public void setUserDao(UserDao userDao) { // 用于属性的方法上this.userDao = userDao; } }
@Autowired 注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如 果允许 null 值,可以设置它的 required 属性为 false。如果我们想使用按照名称(byName)来装 配,可以结合@Qualifier 注解一起使用。如下: public class TestServiceImpl { @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 自动注入策略。public class TestServiceImpl { // 下面两种@Resource 只要使用一种即可
@Resource(name="userDao") private UserDao userDao; // 用于字段上 @Resource(name="userDao") public void setUserDao(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 自动注入。、
依赖注入的方式有几种,各是什么?
一、构造器注入 将被依赖对象通过构造函数的参数注入给依赖对象,并且在初始化对象的时候注 入。 优点: 对象初始化完成后便可获得可使用的对象。 缺点: 当需要注入的对象很多时,构造器参数列表将会很长; 不够灵活。若有多种注入方式,每种 方式只需注入指定几个依赖,那么就需要提供多个重载的构造函数,
二、 方法注入 IoC Service Provider 通过调用成员变量提供的setter 函数将被依赖对象注入给 依赖类。 优点: 灵活。可以选择性地注入需要的对象。 缺点: 依赖对象初始化完成后由于尚未注入被依赖对象,因此还不能使用。
三、接口注入 依赖类必须实现指定的接口,然后实现该接口中的一个函数,该函数就是用于依赖注入。该函数的参数就是要注入的对象。 优点 接口注入中,接口的名字、函数的名字都不重要,只要保证函数的参数是要注入的对象类型即 可。 缺点: 侵入性太强,不建议使用。 PS:什么是侵入行? 如果类 A 要使用别人提供的一个功能,若为了使用这功能,需要在自己的类中 增加额外的代码,这就是侵入性。 、讲一下什么是 Spring 是一个轻量级的 IoC 和 AOP 容器框架。是为 Java 应用程序提供基础性服务的一套框架,目的是 用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:基于 XML 的配置、基于注解的配置、基于 Java 的配置。 主要由以下几个模块组成: Spring Core :核心类库,提供 IOC 服务
; Spring Context:提供框架式的 Bean 访问方式,以及企业级功能(JNDI、定时任务等);
Spring AOP:AOP 服务; Spring DAO:对 JDBC 的抽象,简化了数据访问异常的处理;
Spring ORM:对现有的 ORM 框架的支持;
Spring Web:提供了基本的面向 Web 的综合特性,例如多方文件上传;
Spring MVC:提供面向 Web 应用的 Model-View-Controller 实现。,