IOC(Inversion of Control),即“控制反转”,不是一种技术而是一种思想

1、IOC的理解

Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。

控制:在使用spring之前,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是由专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建,IoC 容器控制了对象,那就是主要控制了外部资源获取(不只是对象包括比如文件等)。对于某个具体的对象而言,以前是程序控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。

反转:传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,而反转则是由容器来帮忙创建及注入依赖对象;为何是反转,因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,控制对象生存周期的不再是引用它的对象,而是spring。

优点:实现资源的可配置和易管理、降低了程序的耦合度

缺点:ioc使用反射来创建对象,在效率上会有些损耗。但相对于程序的灵活性和可维护性来说,这点损耗是微不足道的。


Dependency Injection,即“依赖注入”

2、DI的理解

你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务, 之后一个容器( IOC 容器) 负责把他们组装起来。

依赖:应用程序依赖于IOC容器来获取外部资源

注入:注入某个对象所需要的外部资源(包括对象、资源、常量数据),下面的代码中,注入的既可以是值类型的数据也可以是对象

性能方面:在使用spring框架之前,我们在web开发中,如果service层的A类需要调用dao层的B类的方法,那么就需要在A类中创建B类的对象,对象的创建是由我们自己决定的,而使用了spring之后,spring从容器中取出A类需要的对象并将其给A类,具体的实现细节我们不需要知道(是通过反射机制来产生对象的)


<!--将连接池放入Spring容器-->     <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">         <property name="driverClass" value="com.mysql.jdbc.Driver"></property>         <property name="jdbcUrl" value="jdbc:mysql:///stu_mangement"></property>         <property name="user" value="root"></property>         <property name="password" value="root"></property>     </bean> <!--将JDBCTemplate放入Spring容器-->     <bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">         <property name="dataSource" ref="dataSource"></property>     </bean> <!--将StudentDao放入Spring容器中-->     <bean name="studentDao" class="pers.zhb.jdbc.StudentDaoImp">         <property name="jdbcTemplate" ref="jdbcTemplate"></property>     </bean>
  • request:每次 HTTP 请求,使用 request 定义的 bean 都将产生一个新实例,即每次 HTTP 请求将会产生不同的 bean 实例
  • session:同一个 Session 共享一个 bean 实例
  • global-session:同 session 作用域不同的是,所有的Session共享一个Bean实例

8、什么是 Spring IOC 容器

Spring IOC 负责创建对象, 管理对象( 通过依赖注入、 装配对象、 配置对象,并且管理这些对象的整个生命周期)


FileSystemXmlApplicationContext : 此容器从一个 XML 文件中加载 beans的定义, 是读取的文件系统的xml文件

ClassPathXmlApplicationContext: 从XML 文件中加载 beans的定义, 容器将在 classpath 里找bean 配置

WebXmlApplicationContext:从Web系统中的XML文件来载入Bean定义的信息


15、哪种依赖注入方式你建议使用,构造器注入,还是 Setter 方法注入

两种依赖方式都可以使用, 构造器注入和 Setter 方法注入。 最好的解决方案是用构造器参数实现强制依赖, setter 方法实现可选依赖。

能够保证注入的组件不可变,并且确保需要的依赖不为空。此外,构造器注入的依赖总是能够在返回客户端(组件)代码的时候保证完全初始化的状态


16、 一个 Spring Bean 定义 包含什么?

一 个 Spring Bean 的 定 义 包 含 容 器 必 知 的 所 有 配 置 元 数 据 , 包 括 如 何 创 建 一 个bean, 它的生命周期详情及它的依赖。bean默认是单例的

给Spring容器提供配置元数据的三种方式:XML 配置文件、基于注解的配置、基于 java 的配置


17、Spring 框架中的单例 bean 是线程安全的吗

不, Spring 框架中的单例 bean 不是线程安全的

18、 哪些是重要的 bean 生命周期方法? 你能重载它们吗?

有两个重要的 bean 生命周期方法, 第一个是 setup , 它是在容器加载 bean 的时候被调用。 第二个方法是 teardown 它是在容器卸载类的时候被调用。

bean 标签有两个重要的属性( init-method 和 destroy-method) 。 用它们可以自己定制初始化和注销方法 。 它们 也 有 相 应 的 注 解 ( @PostConstruct 和@PreDestroy) 。


19、 什么是 Spring 的内部 bean

当一个 bean 仅被用作另一个 bean 的属性时, 它能被声明为一个内部 bean, 为了定义 inner bean, 在 Spring 的 基于 XML 的 配置元数据中, 可以在 <property/>或

<constructor-arg/>元素内使用<bean/> 元素, 内部 bean 通常是匿名的, 它们的 Scope 一般是 prototype。

Spring 提供以下几种集合的配置元素:

<list>类型用于注入一列值, 允许有相同的值

<set> 类型用于注入一组值, 不允许有相同的值

<map> 类型用于注入一组键值对, 键和值都可以为任意类型

<props>类型用于注入一组键值对, 键和值都只能为 String 类型

21、什么是 bean 装配?

bean 装配是指在 Spring 容器中把 bean 组装到一起, 前提是容器需要知道 bean 的依赖关系, 如何通过依赖注入来把它们装配到一起。


22、 什么是 bean 的自动装配?

Spring 容 器 能 够 自 动 装 配 相 互 合 作 的 bean , 这 意 味 着 容 器 不 需 要<constructor-arg>和<property>配置,需要做的仅仅实在<bean>的autowire属性里指定自动装配的模式,

能通过 Bean 工厂自动处理 bean 之间的协作。

有五种自动装配的方式, 可以用来指导 Spring 容器用自动装配方式来进行依赖注入

no: 默认的方式是不进行自动装配, 通过显式设置 ref 属性来进行装配。

byName: 通过参数名 自动装配, Spring 容器在配置文件中发现 bean 的 autowire属性被设置成 byname, 之后容器试图匹配、 装配和该 bean 的属性具有相同名字的bean。

byType: 通过参数类型自动装配, Spring 容器在配置文件中发现 bean 的 autowire属性被设置成 byType, 之后容器试图匹配、 装配和该 bean 的属性具有相同类型的bean。 如果有多个 bean 符合条件, 则抛出错误。

constructor: 如果有默认构造函数,则按照构造函数注入,若没有构造函数则以“按类型自动装配”

autodetect: 首先尝试使用 constructor 来自动装配, 如果无法工作, 则使用 byType方式。


23、自动装配有哪些局限性

自动装配的局限性是:

重写: 你仍需用 <constructor-arg>和 <property> 配置来定义依赖, 意味着总要重写自动装配。

基本数据类型: 你不能自动装配简单的属性, 如基本数据类型, String 字符串和类

模糊特性: 自动装配不如显式装配精确, 如果有可能, 建议使用显式装配

24、你可以在 Spring 中注入一个 null 和一个空字符串吗?

可以。


25、什么是基于 Java 的 Spring 注解配置? 给一些注解的例子

基于 Java 的配置, 允许你在少量的 Java 注解的帮助下, 进行你的大部分 Spring配置而非通过 XML 文件。

@Configuration 注解为例, 它用来标记类可以当做一个 bean 的定义, 被 SpringIOC 容器使用,相当于beans标签

@Bean 注解, 它表示此方法将要返回一个对象, 作为一个 bean 注册进 Spring 应用上下文,相当于bean标签

@Configuration注解表明这个类是一个配置类。可以启动组件扫描,用来将带有@Bean的实体进行实例化bean等


26、什么是基于注解的容器配置

相对于 XML 文件, 注解型的配置依赖于通过字节码元数据装配组件, 而非尖括号的声明。

开发者通过在相应的类, 方法或属性上使用注解的方式, 直接组件类中进行配置, 而不是使用 xml 表述 bean 的装配关系。


27、怎样开启注解装配

注解装配在默认情况下是不开启的, 为了使用注解装配, 我们必须在 Spring 配置文件中配置 <context:annotation-config/>元素。

<context:component-scan>除了具有<context:annotation-config>的功能之外,<context:component-scan>还可以在指定的package下扫描以及注册javabean 。还具有自动将带有

@component,@service,@Repository等注解的对象注册到spring容器中的功能。当使用 <context:component-scan> 后,就可以将 <context:annotation-config>移除。



使用 SpringJDBC 框架, 资源管理和错误处理的代价都会被减轻。 所以开发者只需写 statements 和 queries 从数据存取数据, JDBC 也可以在 Spring 框架提供的模板类的帮助下更有

效地被使用, 这个模板叫 JdbcTemplate


29、JdbcTemplate

JdbcTemplate 类提供了很多便利的方法解决诸如把数据库数据转变成基本数据类型或对象, 执行写好的或可调用的数据库操作语句, 提供自定义的数据错误处理。


30、Spring 支持的 ORM(对象关系映射)

Hibernate

iBatis

JPA (Java Persistence API)

TopLink

JDO (Java Data Objects)

OJB


Spring 支持两种类型的事务管理:

编程式事务管理: 这意味你通过编程的方式管理事务, 给你带来极大的灵活性, 但是难维护(在代码中调用commit(),rollback()等事务管理相关的方法)

声明式事务管理: 这意味着你可以将业务代码和事务管理分离, 你只需用注解和 XML配置来管理事务

如:@Transactional(rollbackFor = RuntimeException.class)出现RuntimeException回滚


32、Spring 框架的事务管理有哪些优点?

它为不同的事务 API 如 JTA, JDBC, Hibernate, JPA 和 JDO, 提供一个不变的编程模式。

它为编程式事务管理提供了一套简单的 API 而不是一些复杂的事务 API 如它支持声明式事务管理。

它和 Spring 各种数据访问抽象层很好得集成。

33、你更倾向用那种事务管理类型?

  大多数 Spring 框架的用户选择声明式事务管理, 因为它对应用代码的影响最小, 因此更符合一个无侵入的轻量级容器的思想。 声明式事务管理要优于编程式事务管理,虽然比编程式事

务管理( 这种方式允许你通过代码控制事务) 少了一点灵活性。


在这种情况下(基于@AspectJ 的实现), 涉及到的切面声明的风格与带有 java5 标注的普通 java 类一致。



spring:spring再总结(ioc、aop、DI等)_自动装配


35、spring在ssm中所起的作用

spring:轻量级的框架

作用:bean工厂,用来管理bean的生命周期和框架的集成

两大核心:IOC/DI、AOP


36、spring主要运用了什么模式

工厂模式:每一个bean的创建通过方法

单例模式:默认每一个bean的作用域是单例的

代理模式:关于AOP的实现使用的是代理模式


37、IOC与AOP的实现原理

IOC:反射

AOP:动态代理



每个人都会有一段异常艰难的时光 。 生活的压力 , 工作的失意 , 学业的压力。 爱的惶惶不可终日。 挺过来的 ,人生就会豁然开朗。 挺不过来的 ,时间也会教你 ,怎么与它们握手言和 ,所以不必害怕的。 ——杨绛