1、Spring是什么?
Spring是一个分层的开源的轻量级Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架,其目的是为了解决企业应用开发的复杂性,解决业务逻辑层和其他各层的松耦合问题。应用程序是由一组相互协作的对象组成。Spring是一个IOC和AOP容器框架。
2、Spring有什么特征?
- 轻量级 Spring 框架的基础版本是在 2 MB 左右的;Spring是非侵入性的 - 基于Spring应用的开发中的对象可以不依赖于Spring的的特定类(API);
- 控制反转 IOC;促进低耦合,通过IOC将创建对象的权力交给Spring框架,当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。IoC与DI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它;
- 面向切面编程 AOP:利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率;
- 容器 Spring是一个容器,因为它包含并管理应用对象的配置和生命周期;
- 框架 Spring实现了使用简单的组件配置组合成一个复杂的应用,在spring中可以使用xml和java注解组合这些对象,Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
- 一站式 在IOC和AOP的基础上可以整合各种企业应用的开源框架和优秀的第三方类库;
3、为什么使用Spring?
降低组件之间的耦合度,实现软件各层之间的解耦。可以使用容器提供的众多服务,如:事务管理服务、消息服务等等。当我们使用容器管理事务时,开发人员就不再需要手工控制事务.也不需处理复杂的事务传播。
容器提供单例模式支持,开发人员不再需要自己编写实现代码。
容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。
容器提供的众多辅作类,使用这些类能够加快应用的开发,如: JdbcTemplate、 HibernateTemplate。
Spring对于主流的应用框架提供了集成支持,如:集成Hibernate、JPA、Struts等,这样更便于应用的开发。
4、Spring的优点有哪些?
- 方便解耦,简化开发
- Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理
- AOP编程的支持
- Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
- 声明式事务的支持
- 只需要通过配置就可以完成对事务的管理,而无需手动编程
- 方便程序的测试
- Spring对Junit4支持,可以通过注解方便的测试Spring程序
- 方便集成各种优秀框架
- Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持
- 降低JavaEE API的使用难度
- Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低
5、IOC
5.1 什么是IOC
IOC(Inversion of Controller)其思想是反转资源获取的方向,传统的资源查找方式要求组件向容器发起请求查找资源,作为回应,适时得返回资源。Dog dog = new Dod();而使用了IOC之后,则是容器主动得将资源推送给他所管理的组件,组件所要做的仅是选择一种合适的方式来接受资源,这种行为也被称为查找的被动方式。
5.2 什么是DI
DI(Dependency Injection)IOC的另一种表述方式:即组件以一些预定义好的方式(例如:setter方法),接受来自容器的资源注入,相对于IOC而言,这种表述更直接
5.3 IOC和DI的区别
- IoC Inverse of Control 控制反转的概念,就是将原本在程序中手动创建UserService对象的控制权,交由Spring框架管理,简单说,就是创建UserService对象控制权被反转到了Spring框架
- DI:Dependency Injection 依赖注入,在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件
6、Spring框架Bean实例化的方式
- 三种方式实例化Bean
- 构造方法实例化(默认无参数)
- 静态工厂实例化
- 实例工厂实例化
7、Spring 配置共有三种方式:基于XML的配置、基于JAVA配置和基于注解配置
基于JAVA配置和基于注解配置:
https://blog.csdn.net/durendong/article/details/54566027
基于XML的配置:
在XML配置中,通过<bean> </bean>来定义Bean,通过id或name属性定义Bean的名称,如果未指定id和name属性,Spring则自动将全限定类名作为Bean的名称。通过<property>子元素或者p命名空间的动态属性为Bean注入值。还可以通过<bean>的init-method和destory-method属性指定Bean实现类的方法名来设置生命过程方法(最多指定一个初始化方法和销毁方法)。通过<bean>的scope指定Bean的作用范围。听过<bean>的lazy-init属性指定是否延迟初始化。
当Bean的实现类来源于第三方类库,比如DataSource、HibernateTemplate等,无法在类中标注注解信息,只能通过XML进行配置;而且命名空间的配置,比如aop、context等,也只能采用基于XML的配置。
<bean id=“loginUserDao” class=“com.chinalife.dao.impl.LoginUserDaoImpl” lazy-init=“true” init-method=“myInit” destroy-method=“myDestroy” scope=“prototype”> </bean>
![]()
8、Bean的生命周期和作用域
(1)bean定义
在配置文件里面用<bean></bean>来进行定义。
(2)bean初始化
有两种方式初始化:
A.在配置文件中通过指定init-method属性来完成
B.实现org.springframwork.beans.factory.InitializingBean接口
(3)bean调用
有三种方式可以得到bean实例,并进行调用
(4)bean销毁
销毁有两种方式
A.使用配置文件指定的destroy-method属性
B.实现org.springframwork.bean.factory.DisposeableBean接口
##作用域
singleton
当一个bean的作用域为singleton, 那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。
prototype
Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean() 方法)时都会创建一个新的bean实例。根据经验,对所有有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用 singleton作用域
request
在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例, 它们依据某个bean定义创建而成。该作用 域仅在基于web的Spring ApplicationContext情形下有效。
session
在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
global session
在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于 web的Spring ApplicationContext情形下有效。