java面试 框架

spring IOC和AOP的理解

spring的优点?
1、降低了组建之间的耦合性,实现了软件各层之间的解耦
2、可以使用容易提供的众多服务,如事务管理,消息服务等
3、容器提供单例模式支持
4、容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能
5、容器提供了众多的辅助类,能加快应用的开发
6、spring对于主流的应用框架提供了集成支持,如hibernate、JPA、Struts
7、spring属于低侵入式,代码的污染极低
8、独立于各种应用服务器
9、spring的DI机制降低了业务对象替换的复杂性
10、spring的高度开放性,并不强制应用完全依赖于spring,
	开发者可以自由选择spring的部分或全部

什么是DI机制
依赖注入(DI)和控制反转(IOC)是同一个概念,具体的讲:当某个角色需要另外一个角色协助的时候,
在传统的程序设计过程中,通常由调用者来创建被调用者的实例。
但在spring中创建被调用者的工作不再由调用者来完成,因此称为控制反转。
创建被调者的工作由spring来完成,然后注入调用者,因此也称为依赖注入。

有哪些方式进行依赖注入?
构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,
	该类有一系列参数,每个参数代表一个对其他类的依赖
setter方法注入:Setter方法注入是容器通过调用无参构造或无static工厂实例化bean之后,
	调用该bean的setter方法,即实现了基于setter的依赖注入

spring以动态灵活的方式来管理对象,注入的两种方式,设置注入和构造注入
设置注入的优点:直观、自然
构造注入的优点:可以在构造器中决定依赖关系的顺序

什么是AOP?
面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring主要表现为两个方面
1、面向切面编程提供声明式事务管理
2、spring支持用户自定义的切面

面向切面编程(AOP)是对面向对象编程的(OOP)的补充,
面向对象编程将程序分解成各个层次的对象。
面向切面编程将程序运行过程分解成各个切面
AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,
oop是静态的抽象,aop是动态的抽象,是对应用执行过程中的步骤进行抽象,从未获得步骤之间的逻辑划分

aop框架具有的两个特征:
1、各个步骤之间的良好隔离性
2、源代码无关性

spring的事务管理机制实现的原理,就是通过这样一个动态代理对所有需要事务管理的bean进行加载
并根据配置在invoke方法中对当前调用的方法名进行判定,
并在method.invoke方法前后为其加上合适的事物管理代码,这样就实现了spring式的事物管理
spring的AOP实现更为复杂和灵活

Spring的注入方式有几种

三种:
1、构造器注入,通过构造函数注入
2、set方法注入,通过set方法注入
3、接口注入:注入的bean必须实现对应的接口

@Autowired @Resource @Qualifier 三个注解有什么区别?

@Autowired	是Spring提供的注解,只能按照类型注入,可以设置require是否允许为null
@Resource	是JDK提供的注解,默认按照名称(name)注入,
			还有指定类型(type)注入,如果指定了则必须匹配才能注入
@Qualifier	是Spring提供的注解,按照名称注入,不可单独使用,
			单独使用无法注入会报空指针异常,需要@Autowired配合使用

Spring事务的传播性有哪些?

七种:
[propagation_requires_new]
1、表示当前方法必须运行在事务中。
	如果当前事务存在,方法将会在该事务中运行。否则,会启动一个新的事务

[propagation_supports]
2、表示当前方法不需要事务上下文,但是如果存在当前事务的话,那么该方法会在这个事务中运行

[propagation_mandatory]
3、表示该方法必须在事务中运行,如果当前事务不存在,则会抛出异常

[propagation_requires_new]
4、表示当前方法必须运行在它自己的事务中。一个新的事务将被启动。
	如果存在当前事务,在该方法执行期间,当前事务会被挂起

[propagation_not_supported]
5、表示该方法不应该运行在事务中,如果存在当前事务,
	在该方法运行期间,当前事务将被挂起

[propagation_never]
6、表示当前方法不应该运行在是事务上下文中。
	如果当前正有一个事务在运行,则会抛出异常

[propagation_nested]
7、表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。
	嵌套的事务可以独立于当前事务进行独立地提交或回滚。
	如果当前事务部存在,那么其行为与1一样

在 Spring 中如何配置 Bean ?

Bean 的配置方式: 
通过全类名(反射)、通过工厂方法(静态工厂方法 & 实例工厂方法)、FactoryBean

IOC 容器对 Bean 的生命周期:

1、通过构造器或工厂方法创建 Bean 实例
2、为 Bean 的属性设置值和对其他 Bean 的引用
3、将 Bean 实 例 传 递 给 Bean 后 置 处 理 器 的postProcessBeforeInitialization 方法
4、调用 Bean 的初始化方法(init-method)
5、将 Bean 实 例 传 递 给 Bean 后 置 处 理 器 的postProcessAfterInitializati  on 方法
6、Bean 可以使用了
7、 当容器关闭时, 调用 Bean 的销毁方法(destroy-metho

Spring如何整合Struts2

整合Struts2,即由IOC容器管理Struts2的Action:
1、安装Spring插件,把Struts2的jar包复制到当前WEB应用下的WEB-INF/lib目录下
2、在Spring的配置文件中配置Struts2的action实例
3、在struts配置文件中配置action,但其class属性不再指向该action的实现类,而指向Spring容器中action实例的id

Spring如何整合hibernate

整合hibernate,即由IOC容器生成sessionfactory对象,并使用spring声明事务
1、利用localsessionfactorybean工厂bean,声明一个使用XML映射文件的sessionfactory实例
2、利用HibernateTranscationManager配置hibernate的事务管理器

Spring MVC比较struts2

1、springmvc的入口是servlet,而struts2是filter
2、springmvc稍微比struts2快,springmvc基于方法设计,
	struts2基于类设计,每次发一个请求都会实例一个action
3、springmvc使用更加简洁,开发效率springmvc比struts2高,处理ajax的请求更方便
4、struts2的ognl表达式使页面的开发效率比springmvc更高

Spring MVC 的运行流程

 一 在整个 Spring MVC 框架中, 前端控制器 处于核心位置,
	负责协调和组织不同组件以完成请求处理并返回响应的工作
 二 SpringMVC 处理请求过程:
1、若一个请求匹配 前端控制器 的请求映射路径(在 web.xml 中指定),
 WEB 容器将该请求转交给 前端控制器 处理
2、前端控制器 接收到请求后, 将根据请求信息(包括 URL、HTTP 方法、请求头、请求参数、Cookie 等)
	及 HandlerMapping 的配置找到处理请求的处理器(Handler). 
	可将 HandlerMapping 看成路由控制器,将 Handler 看成目标主机。
3、 当 前端控制器 根据 HandlerMapping 得到对应当前请求的Handler 后,
	通过 HandlerAdapter 对 Handler 进行封装,再以统一的适配器接口调用 Handler。
4、 处 理 器 完 成 业 务 逻 辑 的 处 理 后 将 返 回 一 个 ModelAndView给DispatcherServlet, 
	ModelAndView 包含了视图逻辑名和模型数据信息
5、 前端控制器 借助 ViewResoler 完成逻辑视图名到真实视图对象的解析
6、 得到真实视图对象 View 后, 前端控制器 使用这个 View 
	对ModelAndView 中的模型数据进行视图渲染

iBatis和Hibernate有什么不同

相同点:屏蔽jdbc api的底层访问细节,不用与jdbc api打交道就可以访问数据
	jdbc api编程流程固定,还将sql语句与java代码混杂在一起,经常需要拼凑sql语句

ibatis好处:
屏蔽jdbc api的底层访问细节;
将sql语句与java代码进行分离
提供将结果集自动封装成实体对象和对象的集合的功能
提供了自动将实体对象的属性传递给sql语句的参数

Hibernate
全自动的orm映射工具,自动生成sql语句,ibatis需要自己在xml配置文件中写sql语句
hibernate自动生成语句,无法写特定的高效率的sql适合用于不太复杂的sql查询
对于复杂的查询ibatis是不错的选择

介绍一个hibernate的二级缓存

思路:什么是缓存
	 hibernate的session是一级缓 存,为什么还要二级缓存
	 如何配置hibernate的二级缓存

1、缓存是把以前从数据库查询出来和使用过的对象保存在内存中,
   这个数据结构类似hashmap,当以后要使用这个对象时,先查询缓存中是否有,
   有则使用缓冲中的对象,没有则将查询出来的对象放入缓存中
2、hibernate的session是一级缓存,当使用session从数据库中查询一个对象时,
   session也是先从自己内部查看是否存在这个对象,存在则直接返回,不存在才去访问数据库

	session代表一次会话过程,一个session与一个数据库连接相关联,
	所以session最好不要长时间打开,通常仅用于一个事务当中,在事务结束时就应关闭
	session是线程不安全,被多个线程共享时容易出现问题
	只有全局意义上的缓存才是真正的缓存,有较大的缓存价值。
	hibernate的二级缓存就是为hibernate配置一种全局缓存,
	让多个线程和多个事务可以共享这个缓存。
	一级缓存只能一个人使用,二级缓存可以多个人使用
3、二级缓存独立于hibernate的软件部分,属于第三方的产品,多个厂商和组织都提供有缓存产品
   例如:EHCache和OSCache。在hibernate使用二级缓存:
	首先在hibernate.cfg.xml配置文件中配置使用哪个厂家的缓存产品 
	接着需要配置该缓存产品自己的配置文件	
	最后要配置hibernate中的哪些实体对象要纳入到二级缓存的管理中

谈谈对spring的理解

1、spring是实现了工厂模式的工厂类,这个类名为BeanFactory(实际上是一个接口)
	spring相当于一个大的工厂类,
	在其配置文件中通过<bean>元素配置用于创建实例对象的类名和属性 
2、spring提供了对IOC的支持,IOC是一种编程实现和架构,利用这个思想也可以实现模块间的解耦
3、spring提供了对AOP技术的封装,
	就是系统中有很多不相干的类的方法,在众多方法中加入某种系统功能的代码
	例如:加入日志,权限判断、异常处理

	实现AOP功能采用代理技术
	客户端程序不再调用目标,而调用代理类,代理类与目标类对外具有相同的方法声明
	有两种方式可以实现相同的方法声明,一是实现相同的接口,而是作为目标的子类
	Proxy类产生动态代理的方式为某个接口生成实现类
	要为某个类生成子类,则可以用CGLI B

使用Spring框架的好处是什么?

轻量:Spring是轻量的,基本版本2M
控制反转:Spring通过控制反转实现松散耦合,对象们给出它们的依赖,而不是创建或查询依赖对象
AOP:Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开
容器:Spring包含并管理应用中对象的生命周期和配置
MVC:是WEB框架的替代品
事务管理:Spring提供一个持续的事务管理接口
异常处理:Spring提供方便的API把具体技术的异常转化为一致的unchecked异常

ApplicationContext通常的实现是什么?

FileSystemXmlApplicationContext:此容器从一个XML文件中加载beans的定义,
	XML Bean配置文件的全路径名必须提供给它的构造函数
ClassPathXmlApplicationContext:此容器也从一个XML文件中加载beans的定义,
	这里,你需要正确设置classpath因为这个容器将在classpath里找bean配置
WebXmlApplicationContext:此容器加载一个XML文件,此文件定义了WEB应用的所有bean 

@Autowired、@Resource、@Service

@Autowired是自动装配,作用为了消除代码里面的get set与bean属性中的property  一般都是接口或要被实现,被定义的类

SpringBoot实现自动配置的原理

当我们的项目开启了自动配置的注解@EnableAutoConfiguration后项目启动后自动扫描子项目,
拿到META-INF/spring.factories文件,找到对应的配置类,并进行相应配置

Spring IOC的实现原理

通过动态代理实现,动态代理的2中方式jdk 需要实现特定接口 cglib 无需实现任何接口

每次使用spring框架都要配置xml文件,这个xml配置了bean的id和class

spring中默认的bean为单例模式,通过bean的class引用反射机制可以创建这个实例
因此,spring框架通过反射替我们创建好了实例并且替我们维护他
A需要引用B类,spring框架就会通过xml把B实例的引用传给了A的成员变量

SpringMVC的工作流程

用户请求-DispatcheServlet(核心控制器)-HandlerMapping(处理器映射)-HandlerAdapter(处理器适配器)-
Handler(处理器)-ViewResovler(视图解析器)-视图渲染-响应用户

springmvc的核心

控制反转和面向切面

Mybatis缓存是怎么回事

Mybatis有2级缓存,一级缓存是sqlSession级别的,默认开启
二级缓存Mapper级别的,通过enableCache=true 开启
另外Mybatis缓存只要有DML操作就会晴空缓存

mybatis如何处理结果集

mybatis的结果集是通过反射来实现的。

Spring如何解决循环依赖问题?

构造器循环依赖,和Scope为prototype的bean,无法解决循环依赖问题,会抛出异常

单例类的bean在创建的时候先已无构造函数创建bean然后放入bean创建池中,
在去创建其他bean在创建之前先检测创建池中是否存在正在创建的bean,如果存在则拿出来装配

不要使用基于构造函数的依赖注入
解决方法
1、使用@Autowired注解,让Spring决定合适的时机注入
2、用基于setter方法的依赖注入

@PathVariable

从路径中取数据

controller和handler的关系

controller指的是类,handler指的是具体的方法

spring的配置

配置阶段:
web.xml				
DisapatcherServlet		spring Web开发入口
application.xml路径		配置spring所加载的bean
url-pattern				匹配用户在浏览器输入的地址

初始化阶段:
init()					Servlet初始化方法
加载application.xml		
初始化IOC容器				就是map<String,Object>
依赖注入					@Autowired
初始化HandlerMapping		就是map存储的@RequestMapping配置url

运行时阶段:
service(Request,Response)
request.getURI()
配置URL和其对应的Method
调用method
利用Response将调用结果输出到浏览器

事务几种实现方式

基于TransactionProxyFactoryBean的声明式事务管理
基于@Transactional的声明式事务管理 注解配置
基于Aspectj AOP配置事务	自定义AOP事务配置

spring中bean的作用域

singleton:
spring ioc容器只存在一个共享的bean实例。
prototype:
每次通过spring获取prototype定义的bean时,容器都会创建一个新的bean实例
request:
在一次http请求中,容器会返回该bean的实例。
不同的http请求会产生新的bean,该bean仅在当前httpRequest内有效
session:
在一次http session中,容器会返回bean的实例。不同的session请求会创建新的实例
global session
在一个全局的http session中,容器会返回bean的实例,仅在使用portlet context时有效

spring中bean的生命周期

1、实例化一个bean,
2、按照spring上下文对实例化的bean进行配置,IOC注入
3、如果bean实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,
此处传递的是spring配置文件中bean的ID
4、如果bean实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(),
传递的是spring工厂本身(可以用这个方法获取到其他bean)
5、如果ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,
传入spring上下文
6、如果bean关联BeanPostProcessor接口,会调用postProcessBeforeInitialization(Object obj,String s)方法,
BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用After方法,也可用于内存或缓存技术
7、如果Bean在Spring配置文件中配置init-method属性会调用其配置的初始化方法
8、如果bean关联BeanPostProcessor接口,会调用postProcessAfterInitialization(Object obj,String s)方法
9、当bean不再需要时,会调用destory()方法

Spring的依赖注入的两种方式

构造注入,设值注入
1、setter注入更明显直观
2、对于复杂的依赖关系,建议用setter注入
3、依赖关系无需变化的bean,使用构造注入

spring框架用到了哪些设计模式

代理模式:在AOP和remoting中被用的比较多
单例模式:在spring配置文件中定义的bean默认单例模式
模板方法模式:用来解决代码重复的问题
前端控制器模式:spring提供了DispatcherServlet来对请求进行分发
依赖注入模式:贯穿于BeanFactory/ApplicationContext接口的核心理念
工厂模式:BeanFactory用来创建对象的实例

BeanFactory和ApplicationContext的区别

BeanFactory和ApplicationContext都是接口,并且ApplicationContext是BeanFactory是BeanFactory的子接口

BeanFactory是Spring最底层的接口,只提供了实例化对象和拿对象的功能。
ApplicationContext是spring的高级容器,提供了更多的功能

ApplicationContext提供额外的功能:
消息发送、响应机制、统一加载资源的功能、强大的事件机制、对Web应用的支持等

加载方式的区别
BeanFactory采用的是延迟加载的形式来Bean
ApplicationContext则相反,它是在IOC启动时就一次性创建所有的Bean,
好处是可以马上发现spring配置文件中的错误,坏处是造成浪费

Spring的核心模块

spring Core:
核心容器提供了spring的基本功能。
核心功能是用IOC容器来管理类的依赖关系

spring AOP:
面向切面,纯java实现,采用基于代理的AOP实现方案
AOP代理由IOC容器负责生成、管理,依赖关系也一并由IOC容器管理

spring ORM 对象实体映射
提供了与多个第三方持久层框架的良好整合

spring Dao 持久层模块
spring进一步简化DAO开发步骤,能以一致的方式使用数据库访问技术,
用统一的方式调用事务管理,避免具体的实现侵入业务逻辑层的代码中

spring Context 应用上下文
它是一个配置文件,为spring提供上下文信息,提供了框架式的对象访问方法

spring Meb   WEB模块
提供了基础的针对Web开发的集成特性

spring MVC  MVC模块
提供了Web应用的MVC实现。
spring的MVC框架并不是仅仅提供一种传统的实现,它提供了一种清晰的分离模型 
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值