Spring IOC AOP MVC面试

spring IOC 是 控制反转模式的一种实现,那么到底是什么反转了,IOC 容器帮我们管理对象和自己创建对象 并管理有什么好处?

控制反转指的是对象的获得方式反转了,之前我们需要将需要的对象都需要自己创建并耦合进自己的对象中,现在只是将获得依赖对象的方式由自己交给了IOC容器,从而实现解耦合。

Spring IOC容器 的启动流程?

Spring IOC容器 到底是什么?简单来说就是可以存放对像并且可以管理bean的生命周期,同时实现对象获得的控制反转。对于对象的管理BeanFactory 接口规定了一个最基本的ioc容器应该具有的功能。我们比较常用的IOC容器有DefaultListableBeanFactory,ClassPathXmlApplication等。正常IOC 容器 启动包括三个过程:BeanDefinition的Resource定位、
载入和注册。

创建BeanFactory 
DefaultListableBeanFactory f actory = new DefaultListableBeanFactory();
创建读入器 比如XmlBeanDefinitionReader参数为factory
XMLBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
创建待读资源
ClassPathResource res = new ClassPathResource("beans.xml);
reader.loadBeanDefinitions(res);

web容器(tomcat)spring 容器 spring mvc容器 有什么区别?

web容器比如tomcat是web应用的生存之地,可以创建接收请求 和返回响应的功能,创建该功能所依赖的所有环境(ServletContext),而spring mvc容器的核心是DistpathcherServlet 是用来组装各种组件,比如

HandlerMapping,HaderAdapter、ViewResolver

使他们能够很好地工作,spring mvc 容器还负责存储controller层的各种组件bean,而spring 容器负责存储dao层和service的组件bean。

spring ioc 有什么优势?相比于业务对象自己管理依赖对象的引用关系?

spring ioc 是控制反转的意思,一般来说相对复杂的业务场景,业务对象都需要其他对象的合作即依赖其他对象才能完成业务,使用业务对象自己来管理这种依赖关系,加大了程序的耦合性,增加了程序的测试的复杂性。使用框架或者IOC容器完成依赖对象的创建与引用赋值 ,把应用从复杂的对象依赖管理中解放出来。不仅能避免重复创建对象,解耦合而且提高了程序的可测试性。

你对Spring IOC有什么理解?

当我们应用启动的时候,会创建一个根容器ApplicationContext,这里面包含了应用的核心bean,比如 dao 和service 相关的bean.而当我们的DispatcherServlet创建的时候,会根据servletName.xml 来生成一个WebApplicationContext, 注意该容器会以根容器作为父容器 从而可以使用父容器提供的核心逻辑。正是这种context层次结构可以使得我们以使用service/dao 来处理不同客户端的不同协议的调用(RMI as well as http etc)。
另外 我们web程序内的ApplicationConext 其实就是一个springIOC容器,不过除了提供getBean 功能外,还有处理国际化消息的功能(MessageSource)、从不同位置加载资源的能力(ResourceLoader)、发布事件的能力这些事件和bean的生命周期结合为bean的管理提供了便利(ApplicationEventPulisher)等等。

spring 是如何解决循环依赖的?

spring 中 如果组件A 依赖组件B 组件B依赖组件A,使用siglentonObjects 、earlySingletonObjects、siglentonFactoies 三级缓存来避免。当创建A实例后,将A的实例放入了第三级缓存,依赖注入B,创建B实例 放入三级缓存 依赖注入A,A放入二级缓存 初始化B 放入一级缓存。初始化A 放入一级缓存。
那为什么需要三级缓存呢?
spring的良好设计,如果组件是被aop代理的,那么通过将创建的实例放入三级缓存 拿出来的时候才生成返回代理对象,二级缓存可以保存未初始化完成的对象,一级缓存可以保存初始化完全的对象。

spring Aop 怎么理解?流程是什么?

advice 是具体对目标对象方法的增强 有MethodBeforeAdvice AfterReturningAdvice ThrowsAdvice 等等
PointCut 是表明对哪个类哪个方法 进行 增强 (利用pointcut 来定义需要增强的方法的集合)
Advisor 是对Pointcut 和 advice 的一个组合 记录了哪个advice 应该在哪个pointcut 使用

流程:在ProxyFactoryBean 中 getObject 方法 中 首先 需要初始化AdvisorChain,即拦截器链或者说通知器链,根据interceptorNames 的一个个interceptorName 来初始化,主要是从IOC容器汇总拿到Advice,然后将Advice 转化为DefaultPointcutAdvisor 直到整个advisor链初始化完成。然后根据代理的是接口还是对象 生成代理对象JdkDynamicAopProxy或者CglibAopProxy。那么对于目标对象的代理增强是在哪里进行执行增强方法的呢?对于JdkDynamicAopProxy 是在invoke里面实现回调各种advisor 对应的InterceptorAndDynamicMethodMatcher的。那么advisor 如何转换为InterceptorAndDynamicMethodMatcher?可以通过一个AdvisedSupport的getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);方法来找到增强目标的方法的advisor并进行转化。

spring Aop 在事务管理方面的实际应用?

主要是对事务管理的配置、advice 的配置 、pointcut的配置、advisor的配置。

web容器和spring ioc 容器有什么区别?

web容器接收web请求 然后将请求转发给servlet容器,servlet容器作相应的业务处理,然后返回响应给web容器,包装响应后返回给客户端。web容器对每一个应用程序生成一个servlet context,该上下文可以保存全局对象,即应用程序各个servlet都可以访问。

spring ioc 容器是在serlvet context启动时候逐步建立起来的,主要是对bean 的实例化、依赖注入、初始化等的管理,比如在servlet 容器启动时也会创建xmlwebApplicationContext 放到 servletContext 中。

spring mvc 流程?

DispatcherServlet是一个前端控制器,来接收所有的请求,首先通过请求获取到对应的handlerExecutionChain,之后根据handlerExecutionChain中的interceptor链来来进行前置处理, 拿到handlerAdapter ha 然后ha.handle()进行真正的后台逻辑调用,返回ModeAndView. 之后在进行拦截器的后置处理,最后进行View 的渲染。

spring boot自动配置原理

相关注解:
@Import 导入组件类
@ConditionOnBean 在容器中有 某个Bean的时候加载
@ConfigurationProperties 将配置文件中的信息绑定到 组件中,可以与@Component 注解结合使用。
@EnableConfigurationProperties 启动配置文件绑定 并放入容器中。

springboot 注解其实做了很多关于自动绑定的事情,它由三个注解 构成springbootConfiguration component EnableAutoConfiguration。其中我们重点分析EnableAutoConfiguration. 它会将springbootApplication注解所在的主类所在的包及其子包进行扫描,从而将相关组件放入。另一方面会从各个jar包 的meta/inf/spring.factories 中加载自动配置项,之后经过条件装配则将组件加载在springIOC容器中。DispatcherServlet 就是这么被装配进来的。

通过阅读源码我们可以发现 springboot 底层有大量的ConditionalOnMissingBean,从而实现我们如果配置了某些组件,那么spring就不会帮我们配置同类型的默认组件。
比如HttpEncodingAutoConfiguration 通过该配置类 来配置web应用的字符过滤器,同时我们可以看到关于EnableConfigurationProperties 注解的使用,通过该注解将配置类与properties 文件绑定,从而可以在启动时将配置文件中的值与组件关联,生成自定义类型的而组件。xxxproperties 与application.properties 中固定的前缀配置中拿值(configuration(prefix =))。

所以 我们使用springboot的时候自定义组件1、直接通过配置类定义同一类型的Bean 那么默认的组件就在条件装配时不装配2、通过配置文件对组件进行定制 主要使用@ConfigurationProperties(prefix =) 和EnableConfigurationProperties。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值