**Java面试1000题突击班(抓住金九银十) 持续更新中(一)**
三、Spring
1.Spring原理、特点等
- 原理:它是一个全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层。但是Spring可以和其他框架无缝整合。
- 特点:轻量级、控制反转、面向、切面、容器(可以看我的SpringIOC详解文章和AOP)
2.Spring 常用模块
- 核心容器:核心容器提供Spring框架的基本功能,核心容器的主要组件是BeanFactory,它是工厂模式的实现,BeanFactory使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
- Spring上下文:Spring上下文是一个配置文件,向Spring框架提供上下文信息。比如国际化。
- Spring AOP:通过配置管理特性,Spring AOP模块直接将面向切面的编程功能集成到了Spring框架中。可以将一些通用任务,如安全、事务、日志等集中进行管理,提高了复用性和管理的便捷。
- Spring DAO:为JDBC DAO提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写地异常代码数量。(打开、关闭连接)
- Spring ORM:Spring插入了若干个ORM框架,从而提供了ORM的对象关系工具,JDO、Hibernate、iBatis SQL Map。所有这些都是从Spring的通用事务和DAO异常层次结构。
- Spring Web:web上下文模块建立在程序上下文之上,为基于Web的应用程序提供了上下文,所以,Spring框架支持与Struts的集成。Web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
- Spring MVC:MVC框架是一个全功能的构建Web应用程序的MVC实现,通过策略接口,MVC框架变成为高度可配置的,MVC容纳了大量试图技术,其中包括JSP、Velocity、Tiles、iText、POI。
3.Spring常用注解
@Controller、@RestController、@Component、@Repository、@Service
@ResponseBody、@RequestMapping、@Autowired、@PathVariable、@RequestParam、@Valid
4.spring和spring boot区别
二者主要区别是:
1、Spring Boot提供极其快速和简化的操作,让 Spring 开发者快速上手。
2、Spring Boot提供了 Spring 运行的默认配置。
3、Spring Boot为通用 Spring项目提供了很多非功能性特性。
5.Contended注解的作用
使用@Contended来保证被标识的字段或者类不与其他字段出现内存争用。
注意:如果想要@Contended注解起作用,需要在启动时添加JVM参数:
-XX:-RestrictContended
6.SpringMVC的工作流程
这篇文章介绍的挺全面的
7.Springboot-事务处理
@Transactional是用来声明一个事务的注解,表示该方法是事务性的,当方法发生异常时,将自动回滚。
- 7.1该注解有没有失效的时候(参考链接):
1.不要在接口上声明@Transactional ,而要在具体类的方法上使用 @Transactional 注解,否则注解可能无效。
2.不要图省事,将@Transactional放置在类级的声明中,放在类声明,会使得所有方法都有事务。故@Transactional应该放在方法级别,不需要使用事务的方法,就不要放置事务,比如查询方法。否则对性能是有影响的。3.使用了@Transactional的方法,对同一个类里面的方法调用, @Transactional无效。比如有一个类Test,它的一个方法A,A再调用Test本类的方法B(不管B是否public还是private),但A没有声明注解事务,而B有。则外部调用A之后,B的事务是不会起作用的。(经常在这里出错)
4.使用了@Transactional的方法,只能是public,@Transactional注解的方法都是被外部其他类调用才有效,故只能是public。道理和上面的有关联。故在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错,但事务无效。
5.spring的事务在抛异常的时候会回滚,如果是catch捕获了,事务无效。可以在catch里面加上throw new RuntimeException();
6.最后有个关键的一点:和锁同时使用需要注意:由于Spring事务是通过AOP实现的,所以在方法执行之前会有开启事务,之后会有提交事务逻辑。而synchronized代码块执行是在事务之内执行的,可以推断在synchronized代码块执行完时,事务还未提交,其他线程进入synchronized代码块后,读取的数据不是最新的。
分布式事务
同样在面试中,也多数据源事务问题@Primary注解
8.自动装配机制
自动装配就是去吧第三方组件的Bean装载到IOC组件中。@SpringBootApplication可以实现自动装配,但该注解是一个复合注解,其中主要是@EnableAutoConfiguration。主要依靠三个核心关键技术。
- 引入Starter,启动依赖组件的时候,组件内必须包含一个@Configuration配置类,而这个配置类里边,我们需要通过@Bean注解去声明需要装配到IOC容器里面的Bean对象
- 这个配置类是放在第三方的jar包里面,然后通过springboot中约定优于配置的这样一个理念,把这个类的全路径放在spring.factories文件内,springboot就可以知道第三方jar包的位置,这个主要是用到了SpringFactoriesLoader来完成的
- springboot拿到第三方jar包声明的这个配置类以后,再通过spring提供的ImportSelector这样一个接口来实现对这些类的动态加载。
9.约定大于配置
是一种软件范式,是减少软件开发人员对配置项的维护,从而让开发人员更加聚焦在业务逻辑上。
比如:springboot Starter启动依赖项(管理jar包的版本);springboot会自动内置Tomcat容器来运行web应用;springboot的自动装配;自动加载spring.fatories。
10.SpringCloud常用组件
- 注册中心组件:Eureka、nacos、Zookeeper等
- 负载均衡组件:Ribbon
- 远程调用组件:OpenFeign
- 网关:Gateway、Zuul
- 服务保护:Hystrix、Sentinel
- 服务配置管理组件:SpringCloudConfig、Nacos
11.Nacos的服务注册表结构是怎么样的
需要从两个方面入手:
- Nacos的分级存储模型
- Nacos的服务端源码
12.Nginx和Gateway
gateway是前端工程到后台服务器之间的一个对内网关
nginx是用户到前端工程的网关对外网关
13.Mybatis中涉及到了哪些模式
构建者模式:sqlSessionFactoryBuilder
工厂模式:sqlSessionFactory
代理模式:jdk动态代理 mapper接口 代理对象
单例模式
责任链模式:
模板模式:excutor接口
14.spring中经常用到的设计模式
1.单例模式(Singleton Pattern):
某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例
Spring 的默认 bean 作用域就是单例模式,保证每个 bean 只有一个实例。
2.工厂模式(Factory Pattern):
Spring 提供了多种工厂模式,如 BeanFactory 和 ApplicationContext 等,通过这些工厂可以创建和管理对象的实例。
3.代理模式(Proxy Pattern):
Spring AOP 就是基于代理模式实现的,通过代理对象来对目标对象的方法进行增强。
4.观察者模式(Observer Pattern):
Spring 事件机制就是基于观察者模式实现的,通过事件源和监听器来实现对象之间的解耦。
5.适配器模式(Adapter Pattern):
Spring MVC 中的处理器适配器就是基于适配器模式实现的,将不同类型的处理器适配到统一的处理器接口上。
6.模板方法模式(Template Method Pattern):
Spring 的 JdbcTemplate 就是基于模板方法模式实现的,通过定义抽象的模板方法和具体的子类实现来实现数据访问的流程控制。
7.策略模式(Strategy Pattern):
Spring 的 BeanPostProcessor 就是基于策略模式实现的,通过在不同的时机调用不同的策略方法来实现对 bean 的后置处理。
8.装饰器模式(Decorator Pattern):
Spring 的 AOP 还可以通过装饰器模式来实现增强对象的功能,如通过动态代理和 AspectJ 实现的环绕通知就是一种装饰器模式。
综上所述,Spring 中运用了许多经典的设计模式,这些模式为 Spring 提供了良好的架构和扩展性,也为我们在实际开发中提供了更多的思路和方案。文章来源:https://www.toymoban.com/news/detail-480189.html
15. 如何解决跨域问题
这个是我在面试的时候经常被问到的一个问题,可以从下面去回答。
首先跨域产生的原因:因为一般的浏览器都有一个安全机制——同源策略限制(即,用户输入的URL中包含的协议、域名、端口都完全相同。如果有一项不同,浏览器会觉得有安全风险。)
为了支持跨域问题,浏览器设置了预检机制。也就是说在发出跨域请求时,浏览器会自动发出一个查询请求,称为预检请求,用来确认目标资源是否支持跨域。
如何解决:在后端服务添加CORS策略的配置就可以解决跨域问题。
Cross Origin Resource Sharing(跨域资源访问)
解决跨域问题具体有以下4种方式:文章来源地址https://www.toymoban.com/news/detail-480189.html
- 普通web项目,添加一个corssdomain.xml文件
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="master-only"/>
<!-- 允许example.com及其子域访问 -->
<allow-access-from domain="*.example.com"/>
<!-- 允许http://www.example.com访问 -->
<allow-access-from domain="www.example.com"/>
<allow-http-request-headers-from domain="*.csdn.net" headers="*"/>
</cross-domain-policy>
- Spring项目,添加处理跨域的过滤器或者拦截器
- SpringBoot项目,在支持跨域的方法上添加@CrossOrign注解
springboot项目实现过滤方法如本链接可参考 - Sptingboot项目更方便二点方式,实现WebMvcConfigurer接口
到了这里,关于Java面试1000题突击班(抓住金九银十) 持续更新中(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!