java面试 框架

    xiaoxiao2022-07-05  164

    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框架并不是仅仅提供一种传统的实现,它提供了一种清晰的分离模型
    最新回复(0)