Spring 面试题

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

肯定不是线程安全的,当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这时多个线程会并发执行该请求对应的业务逻辑。如果该处理逻辑中有对单例状态的修改(体现为该单例的成员属性),则必须考虑线程同步问题。Spring框架并没有对单例bean,进行任何多线程的封装处理。关于单例bean的线程安全和并发问题,需要开发者自行去搞定。但实际上,大部分的Spring bean并没有可变的状态(比如Service类和Dao类),所以在某种程度上说spring的单例bean是线程安全的。如果你的bean有多种状态的话,就需要自行保证线程安全。最浅显的解决办法就是将多态bean的作用域有”singleton“变更为”prototype“。


2、你用过哪些重要的Spring注解?
①@Controller:用于Spring MVC项目中的处理器类。
②@Service:用于服务类
③@RequestMapping:用于在控制器处理程序方法中配置URI映射。
④@ResponseBody:用于发送Object作为响应,通常用于发送XML或JSON数据作为响应。
⑤@PathVariable:用于将动态值从URI映射到处理程序方法参数。
⑥@Autowired:用于在spring bean中自动装配依赖项。通常类型来自动注入bean。
⑦@Qualifier:和@Autowired一块使用,在同一类型的bean有多个情况下可以实现根据name注入的需求。
⑧@Scope:用于配置spring bean的范围。
⑨@Configuration、@ComponentScan和@Bean:用于基于java的配置。
⑩@Aspect、@Before、@After、@Around、@Pointcut:用于切面编程。

3、Spring事物什么情况下会失效?
①数据库引擎不支持事物
    Mysql中的MyISAM引擎不支持事物事物,InnoDB引擎支持事物。
②bean没有被spring进行管理
③方法不是public的。
    @Transational只能用于public的方法上,否则事物不会生效。
④自身调用
⑤数据库没有配置事物管理器DataSourceTransationManager
⑥异常在方法内部通过try...catch处理掉了。
⑦异常类型错误
事务默认回滚RuntimeException类型异常,对Exception类型不回滚。如果需要回滚的话,配置以下,如:@Transational(rollbackFor = Exception.class)。

1、说说你对Spring的理解?

①Spring是一个开源框架,主要是为简化企业级应用开发而生,可以实现EJB可以实现的功能,Spring是一个IOC和AOP容器框架。

(1)控制反转(IOC):Spring容器使用了工厂模式为我们创建了所需要的对象,我们使用时不需要自己去创建,直接调用Spring为我们提供的对象即可,这就是控制反转的思想。

(2)依赖注入(DI):Spring使用Java Bean对象的Set方法或者带参数的构造方法为我们在创建所需对象时将其属性自动设置所需要的值的过程就是依赖注入的基本思想。

(3)面向切面编程(AOP):在面向对象编程(OOP)思想中,我们将事物纵向抽象成一个个的对象。而在面向切面编程中,我们将一个个对象某些类似的方面横向抽象成一个切面,对这个切面进行一些如权限验证、事物管理、记录日志等公用操作处理的过程就是面向切面编程的思想。

②在Spring中,所有管理的都是JavaBean对象,而BeanFactory和ApplicationContext就是Spring框架的那个IOC容器,现在一般使用ApplicationContext,其不但包括了BeanFactory的作用,同时还进行了更多的扩展。

  2、  BeanFactory和FactoryBean的区别?
   都是用来创建对象的。
   当使用BeanFactory的时候必须要遵循完整的创建过程,这个过程是由spring来管理控制的,
而使用FactoryBean只需要调用getObject就可以返回具体的对象,整个对象的创建过程是由用户自己来控制的,更加灵活。

1、Spring 框架中都用到了哪些设计模式?
①. 工厂模式:BeanFactory 就是简单工厂模式的体现,用来创建对象的实例。
②. 单例模式:Bean 默认为单例模式。
③. 代理模式:Spring 的 AOP 功能用到了 JDK 的动态代理和 CGLIB 字节码生成技术。
④. 模板方法:用来解决代码重复的问题。比如:RestTemplate。
⑤. 观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,
所有依赖于它的对象都会得到通知被制动更新,如 Spring 中 listener 的实现ApplicationListener。

2、Spring IoC 的实现机制?
Spring 中的 IoC 的实现原理就是工厂模式加反射机制

1、String和StringBuffer、StringBuilder的区别是什么?

①可变性

String使用final修饰字符数组保存字符串(private final char value[];),所有String对象是不可变的。StringBuilder和StringBuffer继承AbstractStringBuilder,AbstractStringBuilder使用不带final修饰字符数组(char[] value;),所以StringBuilder和StringBuffer对象是可变的。
②线程安全性
String类型的对象是不可变的,也就可以理解为常量,线程安全。
AbstractStringBuilder是StringBuffer和StringBuilder的父类,定义字符操作公共方法。StringBuffer对方法加了同步锁,线层安全。StringBuilder对方法没有加同步锁,线层不安全。
③性能
每次对String类型的对象进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String对象。StringBuffer和StringBuilder改变,都是对对象本身进行操作。相同情况下使用StringBuilder相比使用StringBuffer,仅能获得10%-15%左右的性能提升。
对三者使用总结:
操作少量数据用String,单线层操作字符串缓冲区下操作大量数据用StringBuilder,多线层操作字符串缓冲区下操作大量数据用StringBuffer。

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
spring 的优点? 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 5.容器提供了众多的辅助类,能加快应用的开发 6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等 7.spring属于低侵入式设计,代码的污染极低 8.独立于各种应用服务器 9.spring的DI机制降低了业务对象替换的复杂性 10.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring的部分或全部 什么是DI机制? 依赖注入(Dependecy Injection)和控制反转(Inversion of Control)是同一个概念,具体的讲:当某个角色 需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在spring中 创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者的工作由spring来完成,然后注入调用者 因此也称为依赖注入。 spring以动态灵活的方式来管理对象 , 注入的两种方式,设置注入和构造注入。 设置注入的优点:直观,自然 构造注入的优点:可以在构造器中决定依赖关系的顺序。 什么是AOP? 面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面 1.面向切面编程提供声明式事务管理 2.spring支持用户自定义的切面 面向切面编程(aop)是对面向对象编程(oop)的补充, 面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。 AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象, 是对应用执行过程中的步骤进行抽象,,从而获得步骤之间的逻辑划分。 aop框架具有的两个特征: 1.各个步骤之间的良好隔离性 2.源代码无关性 Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭SesstionFactory 为什么要用: 1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。 2. Hibernate是如何延迟加载? 1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection) 2. Hibernate3 提供了属性的延迟加载功能 当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。 3.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、 4. 说下Hibernate的缓存机制 1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存 2. 二级缓存: a) 应用及缓存 b) 分布式缓存 条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非 关键数据 c) 第三方缓存的实现 5. Hibernate的查询方式 Sql、Criteria,object comptosition Hql: 1、 属性查询 2、 参数查询、命名参数查询 3、 关联查询 4、 分页查询 5、 统计函数 6. 如何优化Hibernate? 1.使用双向一对多关联,不使用单向一对多 2.灵活使用单向一对多关联 3.不用一对一,用多对一取代 4.配置对象缓存,不使用集合缓存 5.一对多集合使用Bag,多对多集合使用Set 6. 继承类使用显式多态 7. 表字段要少,表关联不要

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值