Spring面试题

您所在的位置:网站首页 hibernate的支持主要用到spring的哪个模块 Spring面试题

Spring面试题

2023-07-07 14:43| 来源: 网络整理| 查看: 265

Spring是什么

轻量级的IoC和AOP容器开源框架,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。

作用:Bean工厂,用来管理Bean的生命周期和框架集成。

优点:

方便解耦,简化开发;面向切面编程(AOP):可以将横切关注点(比如安全、日志、事务等)与业务逻辑代码分离;容器化:Spring提供容器,用于管理应用程序的对象和依赖关系,并提供了一些可重用的核心组件;声明式事务的支持:只需要通过配置就可以完成对事务的管理,而无需手动编程;方便集成各种优秀框架:提供了对各种优秀框架的直接支持(如:Struts、Hibernate、MyBatis等)。 Spring核心模块 Spring Context:Spring上下文,提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等);Spring Core:Spring 核心模块提供了 IOC(控制反转)和 DI(依赖注入)的支持,用于管理应用程序中的对象和依赖关系;Spring AOP:提供了 AOP(面向切面编程)的支持,用于解决应用程序中的横切关注点;Spring Web:提供了基本的面向Web的综合特性和工具,如 MVC(模型-视图-控制器)框架、RESTful Web 服务、WebSocket 和 Servlet 等;Spring MVC:提供面向Web应用的Model-View-Controller,即MVC实现。Spring JDBC:提供了 JDBC(Java 数据库连接)的支持,并且还提供了更高级别的抽象,使得开发者更容易地访问和操作数据库;Spring ORM:提供了对 ORM(对象关系映射)框架的支持,如 Mybatis、Hibernate、JPA(Java 持久化 API)等;Spring Test: 提供了对单元测试和集成测试的支持,如 JUnit 和 TestNG 等。 IOC和AOP

IOC:将创建对象的权利交给Spring容器处理,由 Spring 来负责控制对象的生命周期(比如创建、销毁),从而实现对象之间的解耦和灵活性。( IoC 的实现原理就是工厂模式加反射机制)

IOC/DI(控制反转/依赖注入) :把dao依赖注入到service层,service层反转给action层,Spring顶层容器为BeanFactory。

interface Fruit { public abstract void eat(); } class Apple implements Fruit { public void eat(){ System.out.println("Apple"); } } class Orange implements Fruit { public void eat(){ System.out.println("Orange"); } } class Factory { public static Fruit getInstance(String ClassName) { Fruit f=null; try { f=(Fruit)Class.forName(ClassName).newInstance(); } catch (Exception e) { e.printStackTrace(); } return f; } } class Client { public static void main(String[] a) { Fruit f=Factory.getInstance("io.github.dunwu.spring.Apple"); if(f!=null){ f.eat(); } } }

AOP:可以将应用程序中的横切关注点(如日志、事务、安全等)从业务逻辑中分离出来,并集中管理。使用动态代理实现。

动态代理的实现方式

动态代理主要有两种方式,JDK动态代理和CGLIB动态代理:

JDK动态代理只提供接口的代理,不支持类的代理,要求被代理类实现接口。核心InvocationHandler接口和Proxy类,InvocationHandler 通过invoke()方法反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一起;接着,Proxy利用 InvocationHandler动态创建一个符合某一接口的的实例, 生成目标类的代理对象。如果代理类没有实现 InvocationHandler 接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP。CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。 Spring DI 的三种方式 构造器注入setter方法注入接口注入 构造器注入和Setter方法注入的区别 构造器注入setter 注入没有部分注入有部分注入不会覆盖 setter 属性会覆盖 setter 属性任意修改都会创建一个新实例任意修改不会创建一个新实例适用于设置很多属性适用于设置少量属性 Spring常用注解

注册:@Controller @Service @Repository @Component

注入:@Autowired @Resource @Autowired:Spring提供的注解,默认按类型自动装配,通过byType的方式实现自动装配,如果容器中有多个类型匹配的bean,那么会抛出异常。依赖对象必须存在,如果要允许null值,可以设置它的required属性为false。也可以使用名称装配,配合@Qualifier注解使用。 @Autowired(required=false)

public class TestServiceImpl { @Autowired @Qualifier("userDao") private UserDao userDao; }

@Resource:JDK1.6支持的注解,默认按照名称来装配,它通过byName的方式实现自动装配,如果指定了name属性,那么会按照名称装配,如果没有指定name属性,那么会按照类型装配。

public class TestServiceImpl { // 下面两种@Resource只要使用一种即可 @Resource(name="userDao") private UserDao userDao; // 用于字段上 @Resource(name="userDao") public void setUserDao(UserDao userDao) { // 用于属性的setter方法上 this.userDao = userDao; } }

}

总结:一个类,俩个实现类,Autowired就不知道注入哪一个实现类,而Resource有name属性,可以区分。 Autowired可以用@Qualifier(“xxxImpl”)区分。

@Qualifier:与 @Autowired 注解配合使用,用于指定注入的 bean 的名称。当有多个同类型的 bean 时,可以使用该注解指定要注入的 bean 的名称。

请求地址:@RequestMapping

用于将请求映射到控制器处理方法。它可以用于类级别和方法级别,用于指定请求的 URL 地址、请求方法、请求参数、请求头等信息。

Spring常用设计模式 工厂模式:Spring 使用工厂模式来创建和管理 Bean 对象,即通过 BeanFactory 或 ApplicationContext 等容器来创建和管理 Bean 对象。单例模式:默认的每个Bean的作用域都是单例,即一个 Bean 对象只会被创建一次并在整个应用中共享。代理模式:Aop的实现通过代理模式,用到了JDK的动态代理和CGLIB字节码生成技术。 Spring的事务隔离级别

spring 有五大隔离级别,默认值为 ISOLATION_DEFAULT(使用数据库的设置),其他四个隔离 级别和数据库的隔离级别一致:

ISOLATION_DEFAULT:用底层数据库的设置隔离级别,数据库设置的是什么我就用什么;ISOLATION_READ_UNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可被其 他事务读取(会出现幻读、脏读、不可重复读);.ISOLATION_READ_COMMITTED:提交读,一个事务提交后才能被其他事务读取到(会造成 幻读、不可重复读),SQL server 的默认级别;ISOLATION_REPEATABLE_READ:可重复读,保证多次读取同一个数据时,其值都和事务开 始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读),MySQL 的默认级 别;ISOLATION_SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏 读、不可重复读、幻读。 脏读 :表示一个事务能够读取另一个事务中还未提交的数据。比如,某个事务尝试插入记录 A, 此时该事务还未提交,然后另一个事务尝试读取到了记录 A。不可重复读 :是指在一个事务内,多次读同一数据。幻读 :指同一个事务内多次查询返回的结果集不一样。


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3