spring相关面试

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/panhaigang123/article/details/79587566
什么是Spring框架?Spring框架有哪些主要模块?
        Spring是一个轻量级控制反转(IOC)和面向切面(AOP)的容器开源框架,他主要是为了解决企业应用开发的复杂性而诞生的
        spring core(核心容器)是spring的核心类库 spring的所有功能都依赖于该类库 core主要实现了IOC
        AOP:是spring的aop库,提供了aop的拦截器机制
        ORM:对常用的ORM框架的管理和辅助支持
        DAO:提供对jdbc进行封装 允许jdbc使用spring资源 并能统一管理jdbc
        WEB:对常见的框架支持 spring能管理这些框架并将资源注入给框架
        Context:提供框架式的Bean访问方式 程序通过context访问spring的bean资源
        MVC:spring提供了一套轻量级的MVC实现
        

                    

什么是控制反转(IOC)?什么是依赖注入?
        IOC:spring是bean的容器 负责的bean的创建和销毁  传统的编程模式由开发者通过编码来创建bean 管理bean  IOC通过容器的技术来控制bean的生命周期
        依赖注入:通过预先定义好的方式接受来之容器的资源注入
                可以通过构造器注入(传参)
                Setter方法注入 使用@AutoWired(先根据名字,在根据类型自动装配)  
                                                @Resource(和@Autowired装配顺序一样但是他可以指定名字装配==@Resource(value="b"))

什么是AOP,AOP的作用
        面前切面编程 能够动态的将代码切入到类的指定方法、指定位置上 他有切点 连接点 通知等概念
        切点:是一个模糊匹配表达式 用于匹配特定规则的方法 save* delete* update* 只是预先定义的
        连接点:通过切点匹配到具体的方法就是连接点
        通知:当连接点执行时 会发送通知 有前置通知 后置通知 异常通知 环绕通知
        AOP一般作用于Spring声明式事务中 ( 先说事务介绍在说事务配置在说传播属性 )       
        
spring事务的介绍
        对一系列的数据库的操作(增,删,改)进行统一的提交或回滚 防止数据库的数据出现混乱
        事务分为编程式事务和声明式事务
                编程式
                        比较灵活,代码量比较大,重复代码比较多 需要手动提交或回滚事务
                声明式
                        声明式比编程式更灵活 一般可以用配置文件和注解声明 而我们一般使用配置文件并使用PlatformTransactionMananger进行管理事务他是事务管理的基础接口 
                        像DataSourceTransactionManager就是实现了他
        当Service层的方法互相调用时,会产生事务的传播问题
                

PROPAGATION_REQUIRED:父方法中没有事务就创建一个事务 否则使用父方法中的事务

                REQUIRES_NEW:不管父方法中是否存在事务 都会创建一个事务
                SUPPORTS:父方法中存在事务使用当前事务 否则使用jdbc事务(自动提交)
                NOT_SUPPORTED:不管父方法中是否存在事务 都不会使用父方法中的事务(挂起事务)
                MANDATOPY:必须在事务环境中运行 父方法中没有事务 抛出异常
                NEVER:父方法中不能存在事务 否则抛出异常
                
如何配置事务
        配置过程:引入aop和tx的schema文件,声明事务管理器,将DataSource注入到事务管理器。
                定义通知(tx:advice),注入事务管理器,声明需要代理的方法,指定转播特性、是否只读等。
                最后定义切点(aop:config、aop:pointcut),将切点和通知关联到一起。
                DataSource连接池:DBCP c3p0 druid===》提供了sql监控功能

BeanFactory和ApplicationContext
        BeanFactory:是spring里面最底层的接口 提供了简单的容器功能 如==》bean的实例化 bean的生命周期的控制 装配bean的功能等
        ApplicationContext:继承了BeanFactory 提供了更多的功能 如:支持国际化的文本消息 统一的资源文件读取方式
                                                三种实现方式
                                                        从classPath下的xml配置文件读取上下文
                                                        从文件系统中xml配置文件读取上下文
                                                        从web应用的xml配置文件读取上下文
                                                        
Spring的配置方式
        基于xml的配置
                <beans>
                    <bean id="myService" class="com.howtodoinjava.services.MyServiceImpl"/>
                </beans>
        基于注解的配置
                在类上使用@Component  @Controller @Repository @Service
                然后引入该类实例 使用@AutoWired或@Resource
        基于Java的配置
                @Configuration
                public class AppConfig
                {
                    @Bean
                    public MyService myService() {
                        return new MyServiceImpl();
                    }
                }
                
spring bean的生命周期
        在一个bean实例被初始化时,需要执行一系列的初始化操作达到可用状态 
                当一个bean不再被调用时 从bean容器中移除
                初始化之后调用init-method 销毁之前调用destroy-method
                        <beans>
                            <bean id="demoBean" class="com.howtodoinjava.task.DemoBean" scope=”prototype”
                                  init-method="customInit" destroy-method="customDestroy"></bean>
                        </beans>
                        
Spring bean的作用域之间有什么区别
        singleton:单例(默认) 不管有多少请求 容器中只有一个bean的实例来处理
        prototype:多例  为每一个请求创建一个bean的实例
        request:同一次请求中创建一个bean的实例
        session:在同一次会话中创建一个bean的实例
        
Spring 框架中的单例bean是线程安全的吗?
        Spring框架并没有对单例bean进行任何多线程的封装处理 关于线程安全问题需要开发者自己去解决
        解决办法:可以将默认的单实例改为多实例(内存压力变大) 使用锁机制 使用局部变量
        
举例说明如何在Spring中注入一个Java Collection
        使用<list>标签 值可重复 中使用<value>
        使用<set>标签 值不可重复 中使用<value>
        使用<map>标签 键值对可以是任何类型的集合 中使用<entry>
        使用<props>标签 键值对都是字符串类型 中使用<prop>
        
解释Spring bean的自动装配
        spring可以通过BeanFactory中注入的方式自动搞定bean之间的依赖关系 自动装配可以设置在每个bean上或特定的bean上
        
解释自动装配模式的区别(autowire属性)
        no:默认的设置 自动装配是关闭的 需要使用ref手动引用需要的bean
        byName:根据名字自动装配
        byType:根据类型自动装配
        constructor:与byType类似 通过构造器自动装配
        
spring框架中用到了那些设计模式
        代理模式==在aop使用的比较多
        单例模式==在spring配置文件中定义的bean默认为单例模式
        模板模式==用来解决代码重复的问题  jdbcTemplate RestTemplate(微服务中使用)
        前端控制器==Spring提供了DispatcherServlet来对请求进行分发  收集所有的请求 然后由一个单一的处理程序处理
        工厂模式==BeanFactory用来创建对象的实例
        策略模式==对算法的包装  把算法的责任和本身分开
        

猜你喜欢

转载自blog.csdn.net/panhaigang123/article/details/79587566