spring的面试题部分

###1.Springaop你怎样实现?

用动态代理和cglib实现,有接口的用动态代理,无接口的用cglib

Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。

如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。

 

###2.SpringSSH起什么作用

为大部分框架提供模版,常见的核心类提供初始化,并且整合三层框架

SSH框假中spring充当了管理容器的角色。我们都知道Hibernate用来做持久层,因为它将JDBC做了一个良好的封装,程序员在与数据库进行交互时可以不用书写大量的SQL语句。Struts是用来做应用层的,他它负责调用业务逻辑serivce层。所以SSH框架的流程大致是:Jsp页面----Struts------Service(业务逻辑处理类)---Hibernate(左到右)   struts负责控制Service(业务逻辑处理类),从而控制了Service的生命周期,这样层与层之间的依赖很强,属于耦合。这时,使用spring框架就起到了控制Action对象(Strus中的)和Service类的作用,两者之间的关系就松散了SpringIoc机制(控制反转和依赖注入)正是用在此处。 

###3.Spring容器内部怎么实现的

内部用Map实现,或者说HashMap

###4.怎么样理解IOCAOP

IOC是一种控制反转的思想,降低了对象的耦合度,AOP是面向切面编程,非侵入式编程,实现了非业务性编程(公共功能),譬如日志,权限,事务等等

AOP的作用

AOPAspect Oriented Programming——面向切面编程

AOP就是面向切面的编程。比如说你每做一次对数据库操作,都要生成一句日志。如果,你对数据库的操作有很多类,那你每一类中都要写关于日志的方法。但是如果你用AOP,那么你可以写一个方法,在这个方法中有关于数据库操作的方法,每一次调用这个方法的时候,就加上生成日志的操作。

例如:你要对所有方法以add开头的方法进行监听,决定是放行,还是拦截;可以用来对所有的增删改操作写入日志。

面向过程编程离我们已经有些遥远,面向对象编程正主宰着软件世界。当每个新的软件设计师都被要求掌握如何将需求功能转化成一个个类,并且定义它们的数据成员、行为,以及它们之间复杂的关系的时候,面向切面编程(Aspect-Oriented Programming,AOP)为我们带来了新的想法、新的思想、新的模式 如果说面向对象编程是关注将需求功能划分为不同的并且相对独立,封装良好的类,并让它们有着属于自己的行为,依靠继承和多态等来定义彼此的关系的话;那么面向切面编程则是希望能够将通用需求功能从不相关的类当中分离出来,能够使得很多类共享一个行为,一旦发生变化,不必修改很多类,而只需要修改这个行为即可。 面向切面编程是一个令人兴奋不已的新模式。就开发软件系统而言,它的影响力必将会和有着数十年应用历史的面向对象编程一样巨大。面向切面编程和面向对象编程不但不是互相竞争的技术而且彼此还是很好的互补。面向对象编程主要用于为同一对象层次的公用行为建模 它的弱点是将公共行为应用于多个无关对象模型之间。而这恰恰是面向切面编程适合的地方。有了 AOP,我们可以定义交叉的关系,并将这些关系应用于跨模块的、彼此不同的对象模型。AOP 同时还可以让我们层次化功能性而不是嵌入功能性,从而使得代码有更好的可读性和易于维护。它会和面向对象编程合作得很好。

面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节;这种思想是将数据作为第一位,而方法或者说是算法作为其次,这是对数据一种优化,操作起来更加的方便,简化了过程。面向对象有三大特征:封装性、继承性、多态性,其中封装性指的是隐藏了对象的属性和实现细节,仅对外提供公共的访问方式,这样就隔离了具体的变化,便于使用,提高了复用性和安全性。对于继承性,就是两种事物间存在着一定的所属关系,那么继承的类就可以从被继承的类中获得一些属性和方法;这就提高了代码的复用性。继承是作为多态的前提的。多态是说父类或接口的引用指向了子类对象,这就提高了程序的扩展性,也就是说只要实现或继承了同一个接口或类,那么就可以使用父类中相应的方法,提高程序扩展性,但是多态有一点不好之处在于:父类引用不能访问子类中的成员。

 

###5.Spring的事务,事务的作用。

Spring里面的事务分为编程式事务和声明式事务,一般用声明式事务,用来控制数据操作的完整性,一致性

###6.SpringIOCAOP你在项目中是怎么使用的?

IOC主要来解决对象之间的依赖问题,把所有的bean的依赖关系通过配置文件或者注解关联起来,降低了耦合度,AOP一般用来整合框架时候都可以用得到,

事务用的最多,还有个别日志,权限功能也可以用到

###7Spring主要使用了什么模式?

工厂模式-->每个Bean的创建通过方法

单例模式-->默认的每个Bean的作用域都是单例

代理模式-->关于AOP的实现是通过代理,体现代理模式

###8.Spring bean的作用域.

Scope作用域有4种,常见的有单例或者多例,默认是单例

###9.Spring的事务是如何配置的?

1.先配置事务管理器TransactionManager,不同的框架有不同属性

2.再配置事务通知和属性,通过tx:advice

3.配置<aop:config>,设置那些方法或者类需要加入事务

###10.Spring的配置文件最好使用什么文件?

xml,因为它是最简单,最流行的数据格式

###11.你使用过Spring中的哪些技术?

bean的管理,AOP技术,IOC技术 ,事务等

###12.为什么要用Spring

降低对象耦合度,让代码更加清晰,提供一些常见的模版

###13.说下Spring的注解

1.bean的标记注解

@Component 通用注解 @Repository 持久层注解 @Service 业务层注解 @Controller:表现层注解

2.bean的自动装配注解

@AutoWired 默认是按照类型装配,如果有多个类型实现可以用Qualifier来指定名

@Resource 默认是按照名称来装配,是JDK里面自带的注解,默认情况下用@AutoWired注解

###15.写过类似Spring AOP的操作吗?

简单的写过,譬如前置通知,后置通知的方法,环绕通知,事务就是典型的AOP的实现

###16.Spring中的AOP在你项目中是怎么使用的,用在哪里?

Struts2和hibernate整合时候都可以用得到, 事务用的最多,还有个别日志,权限功能也可以用到

###17.Spring的事务(传播属性,隔离级别)。

七大传播属性,四大隔离级别

###19.Spring DI的几种方式

1.  接口注入

2.  Setter方法注入

3.  构造方法注入

###20.依赖注入的原理

就是通过反射机制生成想要的对象注入

###21.说一下整合Spring的核心监听器。

这个是在SSH整合的时候使用,是整个WEB项目启动的时候初始化Spring的容器. 具体是在web.xml里面配置的ContextLoaderListener

Spring配置文件中的核心是个监听器,是用来初始化Spring的容器

###22.Spring你们为什么用配置文件而不使用注解?

配置文件耦合度低,容易维护,尤其是在切面或者事务的时候,只配置一次就可以让很多代码拥有事务,

###23.SpringHibernate的事务有什么区别?

Spring的事务提供了统一的事务处理机制,包含了JDBC,Hibernate,IBatis等事务实现,而Hibernate只处理自己事务

###24.Struts2Spring整合先启动那个容器。

先启动监听器,因为先要初始化容器,初始化容器了以后Action才能从容器里面获得

###26.让你写Spring的容器,你是怎样实现的?

我们可以写一个HashMap,如果并发考虑的话要写并发的Map,把bean的名字放在map的key,bean的实现map的value

###27.谈谈SpringIOCAOP,如果不用Spring,怎么去实现这两个技术。

ioc用反射实现 ,AOP用动态代理实现

###28.Spring事务和Hibernate事务的操作上面的区别?

hibernate的事务只能手动显示代码的方式控制创建事务与提交事务以及回滚。

Spring可以通过配置文件设定一类class事务的创建与提交以及回滚,也可以显示代码方式控制。

###29.讲下Spring的七大事务传播

有七个,常用有两个REQUIERD, REQUIRED_NEW,REQUIERD表示两个事务的方法调用的时候,前面的时候和后面的合并成一个事务,REQUIRED_NEW是重启一个事务,各干各的

###30.在同一进程里,有AB两个方法都对不同的表进行更新数据,假如A方法出异常了,若要B方法执行,怎样配置事务级别,若不要B方法执行,又该怎样配置?

前者用REQUIRED_NEW,后者用REQUIRED

###31.事务并发会引起什么问题,怎么解决

事务并发会引起脏读,幻读,不可重复读等问题,设定事务的隔离级别就可以解决

###32.事务的隔离级别

Spring定义有四种,但是常见的是READ_COMMIT,Oralce有两种实现,MySQL有四种

###33.SpringIOC容器与工厂类有什么区别?

IOC(Inversion of Control)对Bean的控制能力更强,能控制对象自动注入,还可以控制生命周期,而工厂类只是简单的创建一个对象,没有什么控制能力

###34.事务的安全问题:锁机制的实现原理及在项目中的使用

锁有悲观锁和乐观锁,悲观锁一般假设每个人都会修改数据,默认情况下把数据都锁住,影响性能,但安全性高.

乐观锁是假设每个人都只读下数据,不会修改数据,性能比较高,但是安全性较低,一般通过增加类似于版本控制里面版本号来解决问题

###35.讲下BeanFactoryApplicationContext的区别

BeanFactory是Spring容器顶级核心接口,比较早,但功能比较少,getBean就是BeanFactory定义的,

ApplicationContext是Spring里面的另外一个容器顶级接口,它继承于BeanFactory,但是提供的功能譬如校验,国际化,监听,

Bean的管理功能比较多,一般使用ApplicationContext

猜你喜欢

转载自blog.csdn.net/qq_41576459/article/details/80094169