一、
1、控制反转(IOC)
将创建管理对象的工作交给容器来做。在容器初始化(或在某个时间节点)通过反射机制创建好对象,在使用时直接从容器中获取。
控制反转:将对象的控制权反过来交给容器管理。
IOC实现原理(流程):(反射+XML技术)
利用(反射+工厂)技术,根据配置文件中给出的类名生成相应的对象。
Tomcat启动Spring容器;
初始化Spring容器,加载application.xml配置文件;
获取扫描包下所有class文件;
解析class中的注解信息;
通过反射实例化相应bean对象,以<beanId,bean>的形式保存集合,存储在IOC容器中。
通过ApplicationContext的getBean方法获取Bean。
IOC优势
创建Bean及其依赖对象的工作交给IOC容器管理,业务代码只需要getBean就行了。将依赖关系写入配置文件中,有修改时,直接修改配置文件即可,而不用去业务代码中每一个使用Bean的地方修改。
IOC类型:
- 构造注入:通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。(对象的依赖关系可在构造函数中完成)。
- Setter方法注入:容器通过调用无参构造器或无参static方法实例化bean之后,调用bean的setter方法。
- 接口注入
spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,是一个分层的javaEE一站式轻量级开源框架
2、DI(依赖注入)
什么是DI
dependency injection;属性的依赖注入,spring在通过IOC创建对象的时候,如果对象还有属性,就一并给赋值进去DI是在IOC的基础上进行对象的属性注入;在spring框架负责创建Bean对象时,动态将依赖对象注入到Bean组件。
依赖注入的三种实现方式
构造器注入,Setter方法注入,接口注入。
依赖注入的相关注解
@Autowired :自动按类型注入,如果有多个匹配则按照指定的Bean的id查找,查找不到会报错。
@Qualifier :在自动按照类型注入的基础上再按照Bean的id注入,给变量注入时必须搭配@Autowired,给方法注入时可单独使用。
@Resource:直接按照Bean的id注入,只能注入Bean类型。
@Value:用于注入基本数据类型和String类型
IOC和DI区别
IOC 控制反转,是指对象实例化权利由spring容器来管理
DI 依赖注入 在spring创建对象的过程中,对象所依赖的属性通过配置注入对象中。
方便解耦,简化开发,AOP编程支持,声明式事务支持,集成Junit更加方便的进行分层测试,方便集成各种优秀框架
1、什么是spring框架?
spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,是一个分层的javaEE一站式轻量级开源框架
2、spring的作用
方便解耦,简化开发,AOP编程支持,声明式事务支持,集成Junit更加方便的进行分层测试,方便集成各种优秀框架
3.什么是IOC?
控制反转,把创建对象的权利交给spring
4.什么是DI
属性的依赖注入,spring在通过IOC创建对象的时候,如果对象还有属性,就一并给赋值进去DI是在IOC的基础上进行对象的属性注入
5.什么是 Spring 的依赖注入?
平常的 java 开发中,程序员在某个类中需要依赖其它类的方法,则通常是 new 一个依赖类再调用类实例的方法, 这种开发存在的问题是 new 的类实例不好统一管理,spring 提出了依赖注入的思想,即依赖类不由程序员实例化,而 是通过 spring 容器帮我们 new 指定实例并且将实例注入到需要该对象的类中。依赖注入的另一种说法是“控制反 转”,通俗的理解是:平常我们 new 一个实例,这个实例的控制权是我们程序员,而控制反转是指 new 实例工作不 由我们程序员来做而是交给 spring 容器来做
6.IOC 的优点是什么?
IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和 JNDI 查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC 容器支持加载服务时的饿汉式初始化和懒加载。
7.依赖注入的三种实现方式?
构造器注入,Setter方法注入,接口注入
8.解释Spring支持的几种bean的作用域
a、singleton : bean在每个Spring ioc 容器中只有一个实例。
b、prototype:一个bean的定义可以有多个实例。
c、request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。
d、session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
e、global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
缺省的Spring bean 的作用域是Singleton.
9.Spring支持的事务管理类型
a、编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。
b、声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。
10.你更倾向用那种事务管理类型?
大多数Spring框架的用户选择声明式事务管理,因为它对应用代码的影响最小,因此更符合一个无侵入的轻量级容器的思想. 声明式事务管理要优于编程式事务管理,虽然比编程式事务管理(这种方式允许你通过代码控制事务)少了一点灵活性。
11.解释AOP
在软件业,AOP为Aspect Oriented Programming的缩写,意味:面向切面编程.通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术,AOP是OOP的延续.将一些共性的内容进行抽取,在需要用到的地方,以动态代理的方式进行插入.在不修改源码的基础上,还能对源码进行前后增强。
AOP 它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为
封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所 共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
使用"横切"技术,AOP 把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点, 与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似, 比如权限认证、日志、事物。AOP 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。 AOP 核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组 API 提供横切功能。比如,一个日 志模块可以被称作日志的 AOP 切面。根据需求的不同,一个应用程序可以有若干切面。在 Spring AOP 中,切面通过
带有@Aspect 注解的类实现。
12.在 Spring AOP 中,关注点和横切关注的区别是什么?
关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点
13.什么是连接点?
被拦截到的点,因为 Spring 只支持方法类型的连接点,所以在 Spring 中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
14.什么是通知?有哪五种类型的通知?
通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过SpringAOP框架触发的代码段。Spring切面可以应用五种类型的通知:
15.Spring 的常用注解
Spring 在 2.5 版本以后开始支持注解的方式来配置依赖注入。可以用注解的方式来代替 xml 中 bean 的描述。注解注入将会被容器在 XML 注入之前被处理,所以后者会覆盖掉前者对于同一个属性的处理结果。
注解装配在 spring 中默认是关闭的。所以需要在 spring 的核心配置文件中配置一下才能使用基于注解的装配模式。配置方式如下:
<context:annotation-config />
常用的注解:
@Required:该注解应用于设值方法
@Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量。
@Qualifier:该注解和@Autowired 搭配使用,用于消除特定 bean 自动装配的歧义。
16.Spring 能帮我们做什么?
a. Spring 能帮我们根据配置文件创建及组装对象之间的依赖关系。
Spring 根据配置文件来进行创建及组装对象间依赖关系,只需要改配置文件即可
b. Spring 面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制。
Spring 面向切面编程能提供一种更好的方式来完成,一般通过配置方式,而且不需要在现有代 码中添加任何额外代码,现有代码专注业务逻辑。
c. Spring 能非常简单的帮我们管理数据库事务。
采用 Spring,我们只需获取连接,执行 SQL,其他事物相关的都交给 Spring 来管理了。
d. Spring 还能与第三方数据库访问框架(如 Hibernate、JPA)无缝集成,而且自己也提供了一套 JDBC 访问模板,来方便数据库访问。
e. Spring 还能与第三方 Web(如 Struts、JSF)框架无缝集成,而且自己也提供了一套 Spring MVC 框架,来方便 web 层搭建。
f. Spring 能方便的与 Java EE(如 Java Mail、任务调度)整合,与更多技术整合(比如缓存框架)。
17.Spring 框架中的单例 bean 是线程安全的吗?
Spring 框架中的单例 bean 不是线程安全的
18.在 Spring 中如何注入一个 java 集合?
Spring 提供以下几种集合的配置元素:
<list>类型用于注入一列值,允许有相同的值。
<set> 类型用于注入一组值,不允许有相同的值。
<map> 类型用于注入一组键值对,键和值都可以为任意类型。
<props>类型用于注入一组键值对,键和值都只能为 String 类型
19.什么是基于 Java 的 Spring 注解配置? 给一些注解的例子
基于 Java 的配置,允许你在少量的 Java 注解的帮助下,进行你的大部分 Spring 配置而非通过 XML 文件。
以@Configuration 注解为例,它用来标记类可以当做一个 bean 的定义,被 Spring IOC 容器使用。另一个例子是
@Bean 注解,它表示此方法将要返回一个对象,作为一个 bean 注册进 Spring 应用上下文。
20.怎样开启注解装配?
注解装配在默认情况下是不开启的,为了使用注解装配,我们必须在 Spring 配 置 文 件 中 配
置 <context:annotation-config/>元素