spring概念

    技术2022-07-11  113

    概念

    Spring是什么?

    Spring是一种实现了IOC容器和非入侵轻量级框架,提供AOP实现方式,提供对持久层,事务的支持,旨在提高开发人员的开发效率以及系统的可维护性。

    Spring 框架由哪几部分组成?

    Spring 核心容器(Core)Spring AOPSpring ORMSpring DAOSpring WEBSpring上下文(Context)SpringMVC

    Spring 核心类有哪些,它们有什么作用?

    BeanFactory:产生一个新的实例,可以实现单例模式BeanWrapper:提供统一的get及set方法ApplicationContext:提供框架的实现,包括BeanFactory的所有功能

    对spring核心容器(应用上下文)模块的理解?

    提供spring 框架的基础功能,BeanFactory 是 任何以spring为基础的应用的核心。Spring 框架建立在此模块之上,它使Spring成为一个容器

    为什么说 Spring 是一个容器?

    只是一个称呼,一切bean都存储在spring容器中,管理着bean的实例化,获取,销毁等

    如何给 Spring 容器提供配置元数据?

    XML配置文件基于注解配置基于Java的配置

    Spring 框架中有哪些不同类型的事件?

    上下文更新事件(ContextRefreshedEvent):在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。上下文开始事件(ContextStartedEvent):当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。上下文停止事件(ContextStoppedEvent):当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。上下文关闭事件(ContextClosedEvent):当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。请求处理事件(RequestHandledEvent):在Web应用中,当一个http请求(request)结束触发该事件。

    Spring框架的优点有哪些?

    非侵入式设计方便解耦简化开发支持AOP支持声明式事务处理方便程序的测试方便集成各种框架降低Jave EE API的使用难度

    Spring IOC理解?

    IOC(控制反转) 是一种设计思想,将原本在程序中手动创建对象的控制权和对象之间的相互依赖关系交给IOC容器来管理,IOC容器完成对象的注入,创建一个对象的时候,只需要配置好配置文件/注解,完全不用考虑对象是如何被创 建出来的,简化应用开发,松耦合

    IOC的优点是什么?

    资源集中管理, 实现资源的可配置和易管理降低了使用资源双方的依赖程度,也就是我们说的耦合度。

    Spring DI 的理解?

    DI(依赖注入)主要分为:构造器注入,Setter注入,接口注入

    构造器注入:构造器注入能保证注入的组件不可变,确保需要的依赖不为空,构造器注入的依赖在返回组件代码时保证完全初始化状态,避免了循环依赖,提升了代码的可复用性

    Setter方法注入:

    接口注入:(具有侵入性,一般不用)HTTPServlet中的doPost()方法中的HttpSerletRequest参数使用了接口注入形式

    Spring 中循环注入的方式?

    循环注入指的是相互引用,而非相互调用

    注入方式:构造器循环依赖注入,setter方法循环注入(单例模式/非单例模式)

    解决办法:提前暴漏

    什么是基于注解的容器配置?

    通过在相应的类,方法或属性上使用注解的方式,直接组件类中进行配置,而不是使用xml表述bean的装配关系

    解释 AOP 模块

    AOP(面向切面编程) AOP是基于动态代理的,它集成了AspectJ,将与业务无关,但是业务模块所共同调用的逻辑或责任(例如事 务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可扩展性和可维护性

    AOP(动态代理): 如果要代理的对象实现了某个接口,那么Spring AOP就会使用JDK动态代理去创建代理对象;而对于没有实现接口的对象,就无法使用JDK动态代理,转而使用CGlib动态代理生成一个被代理对象的子类来作为代理。

    spring AOP 和 AspectJ AOP区别

    Spring AOP是属于运行时增强,而AspectJ是编译时增强。

    Spring AOP基于代理(Proxying),而AspectJ基于字节码操作(Bytecode Manipulation)。

    Spring AOP已经集成了AspectJ,AspectJ是Java生态系统中最完整的AOP框架了。AspectJ相比于Spring AOP功能更加强大,但是Spring AOP相对来说更简单。

    切面太多的话选择AspectJ,它比SpringAOP快很多。

    解释 Aspect 切面

    通常用于将必要的但和业务无关的逻辑和业务逻辑分离

    Spring 的通知类型有哪些,请简单介绍一下?

    环绕通知:目标方法执行之前执行/之后执行,可以实现对目标方法的控制前置通知:目标方法执行之前后置通知:目标方法执行之后异常通知:目标方法出现异常时执行最终通知(after):无论何时都要执行

    Spring 通知类型使用场景分别有哪些?

    记录日志权限…

    Spring AOP 中的织入你怎样理解?

    切面在目标对象的bean在完成初始实例化之后,bean工厂调用bean的后处理器将切面织入到目标对象中

    Spring AOP中关注点和横切关注的区别是什么?

    关注点是应用中一个模块的行为,一个关注点可能会被定义成一个想实现的功能。

    横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。

    Spring Beans 的理解?

    Spring beans 是形成Spring应用的主干的java对象它们被Spring IOC容器初始化,装配,和管理这些beans通过容器中配置的元数据创建

    Spring框架中Bean的生命周期

    bean生命周期: Instantiation(实例化) Populate(属性赋值) Initialization(初始化) Destruction(销毁)

    哪些是重要的 Bean 生命周期方法? 你能重载它们吗?

    第一个是setup,它是在容器加载bean的时候被调用。

    第二个方法是teardown它是在容器卸载类的时候被调用。

    使用bean标签中的属性(init-method和destroy-method)自定义初始化和注销方法

    或者使用注解@PostConstruct和@PreDestroy

    什么是 Spring 的内部 Bean?

    当一个bean仅被用作另一个bean的属性时,它能被声明为一个内部bean,内部bean通常是匿名的,它们的Scope一般是prototype。

    Bean 注入属性有哪几种方式

    使用属性的setter方法注入,使用构造器注入,使用Filed注入(用于注解方式)

    Spring 配置 Bean 实例化有哪些方式?

    setter 方法构造函数静态工厂实例工厂

    什么是 Bean 装配?

    bean 装配是指在 Spring 容器中把 bean 组装到一起

    什么是 Bean 的自动装配?

    Spring 容器能够自动装配相互合作的bean,通过Bean工厂自动处理bean之间的协作。

    自动装配有哪些局限性 ?

    不能自动装配简单的属性,自动装配不如显式装配精确

    自动装配有几种方式?

    byName:把与Bean的属性具有相同名字(或者ID)的其他Bean自动装配到Bean的对应属性中。byType:把与Bean的属性具有相同类型的其他Bean自动装配到Bean的对应属性中。constructor:把与Bean的构造器入参具有相同类型的其他Bean自动装配到Bean的对应属性中。autodetect:首先使用costructor进行自动装配。如果失败,再尝试使用byType进行自动装配。

    Spring支持的几种Bean的作用域

    bean作用域:

    singleton(无状态的bean):在spring IOC容器仅存在一个Bean实例,Bean以单例方式存在,bean作用域范围的默认值。

    prototype(有状态的bean):每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean()。

    request(请求作用域):每次HTTP请求都会创建一个新的Bean,(仅在当前HTTP Request有效)

    session(会话作用域):同一个HTTP Session共享一个Bean,不同Session使用不同的Bean(仅在当前HTTP Session有效)

    application(全局作用域):限定一个Bean的作用域为ServletContext的生命周期。该作用域仅适用于web的Spring WebApplicationContext环境。

    (自定义作用域)

    Spring框架中的单例Bean是线程安全的么?

    单例bean不是线程安全的

    解决办法:在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在ThreadLocal中来解决

    Spring中如何注入一个Java集合?

    list类型用于注入一列值,允许有相同的值。set类型用于注入一组值,不允许有相同的值。map类型用于注入一组键值对,键和值都可以为任意类型。props类型用于注入一组键值对,键和值都只能为String类型。

    Spring中注入一个null和一个空字符串?

    使用 xxxBean.setXXX(null) xxxBean.setXXX("")

    Spring事务?

    spring事务分为编程式事务和声明式事务

    编程式事务(一般不用):

    声明式事务:在配置文件中配置,基于xml或者注解

    Spring事务隔离级别

    在TransactionDefinition接口中定义了五个表示隔离级别的常量:

    ISOLATION_DEFAULT:使用后端数据库默认的隔离级别,Mysql默认采用的REPEATABLE_READ隔离级别;Oracle默认采用的READ_COMMITTED隔离级别。

    ISOLATION_READ_UNCOMMITTED:最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。

    ISOLATION_READ_COMMITTED:允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生

    ISOLATION_REPEATABLE_READ:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

    ISOLATION_SERIALIZABLE:最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读,但是这将严重影响程序的性能。通常情况下也不会用到该级别。

    Spring事务传播行为

    在TransactionDefinition接口中定义了八个表示事务传播行为的常量。

    支持当前事务的情况:

    PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:强制性)。

    不支持当前事务的情况:

    PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。

    其他情况:

    PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于PROPAGATION_REQUIRED。

    Spring事务的实现方式?

    使用 TransactionTemplate 事务模板对象使用 事务管理器 PlatformTransactionManager 对象基于Aspectj AOP开启事务基于注解的 @Transactional 的声明式事务管理

    Spring框架的事务管理有哪些优点

    它为不同的事务 API 如 JTA,JDBC,Hibernate,JPA 和 JDO,提供一个不变的编程模式。它为编程式事务管理提供了一套简单的API,如:它支持声明式事务管理。它和Spring各种数据访问抽象层很好得集成。

    更倾向用哪种事务管理类型?

    声明式事务对应用代码的影响最小,符合无侵入的轻量级容器思想编程式事务灵活

    Spring 配置文件?

    Spring配置文件是用于指导Spring工厂进行Bean生产、依赖关系注入(装配)及Bean实例分发

    Spring如何处理线程并发问题?

    ThreadLocal和线程同步机制

    同步机制采用了“时间换空间”的方式,仅提供一份变量,不同的线程在访问前需要获取锁,没获得锁的线程则需要排队。

    ThreadLocal采用了“空间换时间”的方式。为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。

    ThreadLocal提供了线程安全的共享对象,在一般情况下,无状态的Bean可以在多线程环境下共享,Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理

    设计模式在Spring框架中的使用?

    工厂模式创建bean对象bean设计为单例模式代理模式实现AOPJDBCTemplate等模板方法模式适配器模式Controller。。。

    Spring中的Web模块

    提供了Servlet监听器的Context和Web应用的上下文,对现有的Web框架提供了集成

    Spring对DAO的支持

    SpringJDBC 只需要执行:声明SQL,处理结果集 简单,简洁,使用spring事务管理,提供一致的非检查异常体系

    Spring中如何更高效的使用JDBC?

    使用Spring框架提供的模板类JdbcTemplete

    使用连接池,合理配置数据连接池参数,选择合适的事务等级,及时关闭连接,优化statement

    简述JdbcTemplate类的作用

    对数据库的操作在jdbc封装,处理了资源的建立和释放(不需要管理连接),只需要提供SQL语句,提取结果,查询时候可以直接返回对应的实体类。

    什么是基于Java的Spring注解配置? 给一些注解的例子

    @Configuration@Autowired。。。

    Spring中如何实现时间处理?

    factory-bean@DateTimeFormat@JsonFormat…

    BeanFactory 接口和 ApplicationContext 接口不同点是什么?

    BeanFactory是Spring最低层的接口,提供了最简单的容器的功能,只提供了实例化对象和拿对象的功能,在启动的时候不会去实例化Bean,只有从容器中拿Bean的时候才会去实例化

    ApplicationContext应用上下文,继承BeanFactory接口,它是Spring的一各更高级的容器,提供了更多的有用的功能,在启动的时候就把所有的Bean全部实例化了(可以设置延迟)

    谈谈你对 BeanFactory的理解,BeanFactory 实现举例

    通过配置文件+反射+工厂的设计模式创建Bean解耦易于扩展

    Spring 和 Struts 的区别?

    struts只是一个MVC框架,侧重点在controller,提供View定制标签,不涉及到Model,类级别拦截器(springMVC是方法级别拦截器)

    spring是个轻量级容器

    Spring如何整合Hibernate

    新建实体类配置映射文件(jdbc,hibernate核心配置,持久类映射,事务声明)

    Spring如何整合Struts2 ?

    struts2配置actionspring生成bean
    Processed: 0.013, SQL: 9