Spring

Spring 在 ssm 中起什么作用?

Spring:轻量级框架
作用:Bean 工厂,用来管理 Bean 的生命周期和框架集成。
两大核心:
1、IOC/DI(控制反转/依赖注入) :把 dao 依赖注入到 service 层,service 层反转给 action
层,Spring 顶层容器为 BeanFactory。
2、AOP:面向切面编程

Spring 的配置文件中的内容

开启事务注解驱动
事务管理器
开启注解功能,并配置扫描包
配置数据库
配置 SQL 会话工厂,别名,映射文件
不用编写 Dao 层的实现类

Spring 主要使用了什么模式

工厂模式:每个 Bean 的创建通过方法
单例模式:默认的每个 Bean 的作用域都是单例
代理模式:关于 Aop 的实现通过代理模式

何为 Spring Bean 容器?Spring Bean 容器与 Spring IOC 容器 有什么不同吗?

用于创建 bean 对象,管理 bean 对象的那个容器
Spring IOC 容器本质上指的的就是 Spring Bean 容器,
Spring Bean 容器中最核心一个机制是 IOC 机制(
控制反转),所以有时候又将 springbean 容器称之为
Spring IOC 容器.

Spring IOC 如何理解

IOC 是 Spring 中提供一种控制反转机制,目的是将我们
项目中对象的依赖管理交给 Spring 实现,这样可以更好
实现对象关系的解耦,提高程序的可扩展性

Spring DI 如何理解

DI 是 Spring 中的依赖注入机制,IOC 的实现需要借助
这种机制.我们通常会这样理解,Spring Bean 容器中的
IOC 思想一种目标,DI 是实现这种思想的目标的手段

Spring 中基于注解如何配置对象作用域?以及如何配置延

迟加载机制?

@Scope(“singleton”)
@Scope(“prototype”)
@Lazy(value=true)

Spring 工厂底层构建 Bean 对象借助什么机制?当对象不

使用了要释放资源,目的是什么?何为内存泄漏?

借助反射机制,防止内存泄漏,对象已经不使用了但占用着内存,这种现 象称之
为内存泄漏,内存泄漏不是内存溢出,但是它是内存溢出的一个导火索. 内存溢出直接就
导致系统崩溃了.

Spring 中的事务处理方式及优缺点

优点在于:
1:能够实现全局事务的控制,通过 EJB CMT 进行事物的管理。
2:能够保证项目模块在系统中完成的功能是可控制的的操作(AOP)
缺点在于:
1:Spring 中的事物声明有编程式事物和声明式事物

BeanFactory 和 ApplicationContext 有什么区别

BeanFactory 可以理解为含有 bean 集合的工厂类。BeanFactory 包含了
种 bean 的定义,以便在接收到客户端请求时将对应的 bean 实例化。
BeanFactory 还能在实例化对象的时生成协作类之间的关系。此举将
bean 自身与 bean 客户端的配置中解放出来。BeanFactory 还包含了 bean 生命周期的控制,
调用客户端的初始化方法(initialization methods)和销毁方法(destruction methods)。
从表面上看,application context 如同 bean factory 一样具有 bean 定义、bean 关联关系
的设置,根据请求分发 bean 的功能。但 application context 在此基础上还提供了其他的
功能

Application contexts 提供一种方法处理文本消息,一个通常的做法是加载文件资源(比
如镜像),它们可以向注册为监听器的 bean 发布事件。另外,在容器或容器内的对象上执
行的那些不得不由 bean 工厂以程序化方式处理的操作,可以在 Application contexts 中以
声明的方式处理。Application contexts 实现了 MessageSource 接口,该接口的实现以可
插拔的方式提供获取本地化消息的方法

Spring Bean 的生命周期

Spring Bean 的生命周期简单易懂。在一个 bean 实例被初始化时,
需要执行一系列的初始化操作以达到可用的状态。同样的,当一个 bean 不在被调用时需要
进行相关的析构操作,并从 bean 容器中移除。
Spring bean factory 负责管理在 spring 容器中被创建的 bean
的生命周期。Bean 的生命周期由两组回调(call back)方法组成。
初始化之后调用的回调方法。
销毁之前调用的回调方法。

Spring 框架提供了以下四种方式来管理 bean 的生命周期事件:
InitializingBean 和 DisposableBean 回调接口
针对特殊行为的其他 Aware 接口
Bean 配置文件中的 Custom init()方法和 destroy()方法
@PostConstruct 和@PreDestroy 注解方式
使用 customInit()和 customDestroy()方法管理 bean 生命周期的代码

样例如下:

<beans>
<bean id="demoBean" class="com.howtodoinjava.task.DemoBean"
init-method="customInit" destroy-method="customDestroy"></bean>
</beans>
bean的生命周期

销毁方法只适用于singleton模式的bean
初始化方法只会执行一次。
销毁方法用于释放资源,只需要执行一次
容器如何管理bean的生命周期。在设计bean时,依据实际业务的需要,可以为bean提供相应的生命周期方法,比如在初始化方法当中完成资源加载等类似的逻辑,在销毁方法中释放资源。因此bean当中是否有生命周期相关的方法,完成取决于实际业务需要,并不是必须的

<bean id="bar1" class="ioc.autowire.Bar" autowire="byName"/>

容器会采取自动装配的方式来建立依赖关系。
byName指定的是查找与属性名称一致的bean,调用set方法来完成注入。
autowire的值还可以是byType和constructor
容器可以依据属性名称或者类型来完成自动装配,如果值为byName,容器会查找与属性名称一致的bean,并调用对应的set方法来完成注入。 因为本题中bar1是bean的id,所以是唯一的,所以不可能找到多个符合要求的bean。

Spring Bean 的作用域之间有什么区别

Spring 容器中的 bean 可以分为 5 个范围。所有范围的名称都是自说明
的,但是为了避免混淆,还是让我们来解释一下:
singleton:这种 bean 范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只
有一个 bean 的实例,单例的模式由 bean factory 自身来维护。
prototype:原形范围与单例范围相反,为每一个 bean 请求提供一个实例。
request在请求 bean 范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以
后,bean 会失效并被垃圾回收器回收
该作用域仅在基于 web 的 Spring ApplicationContext 情形下有效
Session与请求范围类似,确保每个 session 中有一个 bean 的实例,在 session 过期后,
bean 会随之失效
该作用域仅在基于 web的 Spring ApplicationContext 情形下有效。
global-sessionglobal-session 和 Portlet 应用相关。当你的应用部署在 Portlet 容器
中工作时,它包含很多 portlet。如果你想要声明让所有的 portlet 共用全局的存储变量的
话,那么这全局变量需要存储在 global-session 中。该作用域仅在基于 web 的 Spring ApplicationContext 情形下有效
全局作用域与 Servlet 中的 session 作用域效果相同

<bean id="user" scope="singleton" class="com.tedu.spring.User"></bean>
<bean id="user" scope="prototype" class="com.tedu.spring.User"></bean>

在 Spring AOP 中,关注点和横切关注的区别是什么

关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。
横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日
志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。

使用 Spring 框架的好处是什么

轻量:Spring 是轻量的,基本的版本大约 2MB。 • 控制反转:Spring 通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创
建或查找依赖的对象们。
面向切面的编程(AOP):Spring 支持面向切面的编程,并且把应用业务逻辑和系统服务
分开。
容器:Spring 包含并管理应用中对象的生命周期和配置。
MVC 框架:Spring 的 WEB 框架是个精心设计的框架,是 Web 框架的一个很好的替代品。
事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全
局事务(JTA)。
异常处理:Spring 提供方便的 API 把具体技术相关的异常(比如由 JDBC,
Hibernate or JDO 抛出的)转化为一致的 unchecked 异常。

Spring 中用到了那些设计模式

• Spring 框架中使用到了大量的设计模式,下面列举了比较有代表性的:
• 代理模式—在 AOP 和 remoting 中被用的比较多。
• 单例模式—在 spring 配置文件中定义的 bean 默认为单例模式。
• 模板方法—用来解决代码重复的问题。比如. RestTemplate, JmsTemplate,
JpaTemplate。 • 工厂模式—BeanFactory 用来创建对象的实例。
• 适配器–spring aop
• 装饰器–spring data hashmapper
• 观察者– spring 时间驱动模型
• 回调–Spring ResourceLoaderAware 回调接口

Spring 如何保证 Controller 并发的安全

Spring 多线程请求过来调用的 Controller 对象都是一个,而不是一个请求过来就创建一个
Controller 对象。
并发的安全? 原因就在于 Controller 对象是单例的,那么如果不小心在类中定义了类变
量,那么这个类变量是被所有请求共享的,这可能会造成多个请求修改该变量的值,出现与
预期结果不符合的异常
那有没有办法让 Controller 不以单例而以每次请求都重新创建的形式存在呢?
答案是当然可以,只需要在类上添加注解@Scope(“prototype”)即可,这样每次请求调用
的类都是重新生成的(每次生成会影响效率)
虽然这样可以解决问题,但增加了时间成本,总让人不爽,还有其他方法么?答案是肯定的!
使用 ThreadLocal 来保存类变量,将类变量保存在线程的变量域中,让不同的请求隔离开来。

在 Spring 中如何注入一个 java 集合

list类型用于注入一列值,允许有相同的值。
set 类型用于注入一组值,不允许有相同的值
map 类型用于注入一组键值对,键和值都可以为任意类型。
props类型用于注入一组键值对,键和值都只能为 String 类型

Spring 支持的事务管理类型

Spring 支持如下两种方式的事务管理
编程式事务管理:这意味着你可以通过编程的方式管理事务,这种方式带来了很大的灵活性,
但很难维护。
声明式事务管理:这种方式意味着你可以将事务管理和业务代码分离。你只需要通过注解或
者 XML
配置管理事务。
一般选择声明式事务管理,因为这种方式和应用程序的关联较少。

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

事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,
如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。这样
可以防止出现脏数据,防止数据库数据出现问题。
开发中为了避免这种情况一般都会进行事务管理。Spring 中也有自己的事务管理机制,一
般是使用 TransactionMananger 进行管 理,可以通过 Spring 的注入来完成此功能

它为不同的事务 API(如 JTA, JDBC, Hibernate, JPA, 和 JDO)提供了统一的编程模型。
它为编程式事务管理提供了一个简单的 API 而非一系列复杂的事务 API(如 JTA).
它支持声明式事务管理。
它可以和 Spring 的多种数据访问技术很好的融合。

SSM 优缺点、使用场景

  1. Mybatis 和 hibernate 不同,它不完全是一个 ORM 框架,因为 MyBatis 需要程序员自己
    编写 Sql 语句,不过 mybatis 可以通过 XML 或注解方式灵活配置要运行的 sql 语句,并将
    java 对象和 sql 语句映射生成最终执行的 sql,最后将 sql 执行的结果再映射生成 java 对
    象。
  2. Mybatis 学习门槛低,简单易学,程序员直接编写原生态 sql,可严格控制 sql 执行性能,
    灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软
    件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是
    mybatis 无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套
    sql 映射文件,工作量大。
  3. Hibernate 对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如
    需求固定的定制化软件)如果用 hibernate 开发可以节省很多代码,提高效率。但是
    Hibernate 的学习门槛高,要精通门槛更高,而且怎么设计 O/R 映射,在性能和对象模型之
    间如何权衡,以及怎样用好 Hibernate 需要具有很强的经验和能力才行。
  4. 总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构
    都是好架构,所以框架只有适合才是最好。

什么是 bean 的自动装配

Spring 容器能够自动装配相互合作的 bean,这意味着容器不需要constructor-arg和
property配置,能通过 Bean 工厂自动处理 bean 之间的协作。

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

基于 Java 的配置,允许你在少量的 Java 注解的帮助下,进行你的大部分 Spring 配置而非
通过 XML 文件。
以@Configuration 注解为例,它用来标记类可以当做一个 bean 的定义,被 Spring IOC 容
器使用。另一个例子是@Bean 注解,它表示此方法将要返回一个对象,作为一个 bean 注册
进 Spring 应用上下文。

使用 Spring 通过什么方式访问 Hibernate?

在 Spring 中有两种方式访问 Hibernate:
控制反转 Hibernate Template 和 Callback。
继承 HibernateDAOSupport 提供一个 AOP 拦截器

如何通过 HibernateDaoSupport 将 Spring 和 Hibernate结合起来?

用 Spring 的 SessionFactory 调用 LocalSessionFactory。集成过程分三步:
配置 the Hibernate SessionFactory。
继承 HibernateDaoSupport 实现一个 DAO。
在 AOP 支持的事务中装配。

AOP作用是什么,底层如何实现在哪些地方会用到,分别简述切面,切入点和通知。

AOP:面向切面编程:将一个系统中共同的业务逻辑提取出来,进行单独的封装成一个组件(切 面),然后以配置的方式作用于系统中,实现程序的可插拔性,提高代码的复用性,提升系统的
灵活性和性能
底层实现:JDK 动态代理,只支持接口注入 CGLIB:可以支持普通类的注入
那些地方会用到:事物开启,日志记录,安全验证,权限验证
切面:系统中共通的业务提取出来,在某个时刻或者某个阶段共同调用
切入点:找到目标方法,给它追加共通的业务逻辑,在 spring 中提供了切入点表达式帮助我
们找到目标方法 execution
通知:什么时候调用这个共通的业务逻辑,用于指定切面方法作用到系统中的时机.前置通知,
后置通知,环绕通知,异常通知,最终通知。

Spring 中 AutoWired 和,Resource 之间区别是什么

AutoWried:按照类型进行匹配—spring 框架自带的,查看当前 Spring 容器中那个 bean 类型
和引用类型一致,就进行注入,如果有多个匹配类型就会报错.
Resource:默认按照名称进行注入,如果找不到对应的名称按照 bean 类型进行注入

web.xml文件中配置Spring框架

<context-param><param-name>contex;<param-value>/WEB-</context-param>

Bean在 Spring容器中有两种管理方式,原型模式和单例模式

init-method在依赖注入之后执行

spring中注入的bean默认被配置为单例模式,意味着对于同一个类而言,其所有的被注入对象其实都是同一个对象。但是对于对象中含有一些状态属性的情况,我们并不想要singleton。spring中提供了四种作用域就是原型 (Prototype) 会话 (session) 单例 (singleton) 请求 (request)

<context:component-scan 
              base-package="com.tarena"/> 

这是配置组件扫描。

容器会扫描com.tarena包及其子包下面的类。

组件扫描可以替代大量XML配置的定义。

Spring各模块之间可以单独存在

Spring的核心模块是必须的,其他模块是基于核心模块

容器如何管理bean的生命周期。在设计bean时,依据实际业务的需要,可以为bean提供相应的生命周期方法,比如在初始化方法当中完成资源加载等类似的逻辑,在销毁方法中释放资源。因此bean当中是否有生命周期相关的方法,完成取决于实际业务需要,并不是必须的,销毁方法用于释放资源,只需要执行一次

Spring中提供通过Web容器来启动Spring框架的类有ContextLoaderListener ContextLoaderServlet

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值