Spring高频面试题
(一些来源于GitCode AI)
-
什么是Spring框架? Spring是一个开源的Java平台,它简化了企业级应用的开发。它提供了IOC(Inversion of Control)/DI(Dependency Injection)容器,AOP(Aspect-Oriented Programming)支持,数据访问,事务管理,MVC(Model-View-Controller)框架等功能。
-
解释一下Spring的IOC(Inversion of Control)和DI(Dependency Injection)? IOC是指将对象的控制权交由容器来管理,而不是对象自身。DI则是IOC的一个具体实现,通过外部配置文件或注解方式,将依赖的对象传入,而不是由对象自己创建,从而解耦合。
-
Spring的AOP是什么? AOP(Aspect-Oriented Programming)面向切面编程,允许程序员定义“横切关注点”,并将它们模块化为单独的称为“切面”的代码单元,可以跨多个对象进行拦截操作,例如日志记录、事务管理等。
-
Spring MVC工作原理是什么? Spring MVC模式包括 DispatcherServlet、Controller、Model、View 和 HandlerMapping 等部分。请求到达 DispatcherServlet,它根据HandlerMapping找到合适的Controller处理,Controller处理完业务逻辑后,返回ModelAndView,最后由DispatcherServlet根据ViewResolvers解析出具体的视图。
-
Spring JDBC模板怎么使用? Spring JDBC提供了一个JdbcTemplate类,可以帮助开发者避免编写大量的样板代码,用于执行SQL查询和更新。它可以处理连接的打开和关闭,结果集的映射,异常处理等工作。
SpringBoot启动流程详解
Spring Boot的启动流程主要分为以下几个步骤:
-
主类执行: 主类通常包含
@SpringBootApplication
注解,该注解是@Configuration
,@EnableAutoConfiguration
,@ComponentScan
三个注解的组合体。 -
组件扫描: Spring会扫描主类所在的包以及子包下的所有@Component类型的注解,如@Service, @Repository, @Controller等,并将这些组件注册到IoC容器中。
-
自动配置:
@EnableAutoConfiguration
开启自动配置功能,Spring Boot会根据已引入的依赖自动配置相关的bean。比如,如果项目中有Web开发相关的依赖,Spring Boot就会自动配置一些与Web相关的bean,如Tomcat服务器,DispatcherServlet等。 -
配置加载: Spring Boot读取应用的配置文件(默认是application.properties或application.yml),并将配置属性注入到对应的bean中。
-
SpringApplication.run: 当调用
SpringApplication.run()
方法时,Spring Boot开始初始化并启动ApplicationContext,创建bean实例。 -
监听器初始化: 包含web环境的话,初始化ServletContext,并注册各种监听器,如HttpSessionListener、ContextLoaderListener等。
-
Spring容器初始化Bean: 根据扫描到的@Component以及自动配置的@Bean定义,初始化所有的bean并进行依赖注入。
-
应用启动完成: 所有bean初始化完成后,Spring Boot打印Banner信息,并调用
ApplicationRunner
或CommandLineRunner
接口的run方法(如果有实现)。
什么是Spring Boot,并对比Spring框架有何优势?
Spring Boot概述: Spring Boot是由Pivotal团队提供的全新框架,主要用于简化Spring应用的初始搭建以及开发过程。它集成了大量常用的第三方库配置,如 JDBC、MongoDB、Quartz 等,极大地提高了设置和运行应用的效率。Spring Boot的核心特性包括自动配置、起步依赖和内嵌服务器等。
与Spring框架相比的优势:
-
快速启动和运行:Spring Boot项目不需要复杂的XML配置,启动速度更快,且内置了Tomcat或Jetty等服务器,可以直接运行主类启动应用。
-
自动配置:基于条件注解的自动配置功能使得开发者无需手动配置大部分Bean,只需要添加相应的starter即可。
-
简化Maven配置:通过“起步依赖”(Starter POMs),开发者可以轻松地导入需要的库和功能,而不需要显式地指定版本号。
-
健康检查和监控:Spring Boot Actuator 提供了一组端点,可以用来监控和管理应用的状态,包括内存、线程、日志、配置等信息。
-
开箱即用:Spring Boot集成了许多常用组件,如数据源、缓存、消息队列等,减少了额外的集成工作。
Spring Boot自动配置是如何识别并加载相关的配置类的?
Spring Boot的自动配置通过@EnableAutoConfiguration
注解启动,通常在主应用类上使用。这个注解会触发Spring Boot的自动配置过程,下面是具体步骤:
-
找到所有的
@Configuration
注解的类:Spring Boot会扫描包路径下所有带有@Configuration
注解的类。 -
查找
META-INF/spring.factories
文件:每一个Spring Boot的模块都会在它的jar包中包含一个名为META-INF/spring.factories
的文件。这个文件列出了一系列可以被Spring Boot自动配置的类,键值对的形式,键是org.springframework.boot.autoconfigure.EnableAutoConfiguration
,值是一系列类名。 -
加载
@EnableAutoConfiguration
指定的配置:主应用类上的@EnableAutoConfiguration
注解可以通过value
或exclude
属性来指定要启用或排除的自动配置类。 -
确定是否启用自动配置:对于每个类,Spring Boot会检查当前环境条件,如果满足条件,就会将这个类作为配置导入到Bean定义中。环境条件通常是通过
@Conditional
注解指定的,例如@ConditionalOnClass
表示只有当特定类存在时才启用配置,@ConditionalOnProperty
则是基于特定属性值。 -
注册Bean:符合条件的自动配置类会被处理成Spring的Bean,然后这些Bean会参与到Spring容器的依赖注入中。
Spring Boot自动配置与传统XML配置相比有哪些优势?
Spring Boot自动配置相比于传统的XML配置有以下优势:
-
简化配置:Spring Boot自动配置可以基于当前项目中的类和jar依赖,自动为应用程序提供相关的bean配置,减少了手动编写大量XML配置的工作量。
-
约定优于配置:Spring Boot遵循一些默认的规范,如数据源、日志框架等,开发者不需要额外的配置,就可以按预期工作。如果需要自定义,也可以轻松覆盖默认设置。
-
内嵌服务器:Spring Boot可直接内嵌Tomcat、Jetty等服务器,无需部署war包到外部服务器,简化了开发和部署流程。
-
快速起步:通过
spring-boot-starter
模块,可以快速引入所需功能,如web、data、security等,避免了繁琐的依赖管理和版本冲突。 -
健康检查和Actuator:Spring Boot提供了Actuator组件,方便进行系统监控和健康检查,比如查看应用指标、内存状态等。
-
更好的测试支持:Spring Boot提供了易于使用的测试框架,能够快速构建和运行集成测试,且支持Spring Boot应用的独立测试。
-
增强的环境感知:通过
spring.profiles.active
属性,可以在不同环境中切换不同的配置,实现环境之间的差异化配置。
Spring框架作为Java领域的重要组成部分,其面试题涵盖了许多方面。这里列举一些常见的Spring面试题目,并提供简短的回答:
-
什么是Spring框架? Spring是一个开源的Java/Java EE全功能栈的应用框架,它主要由IoC/DI(控制反转/依赖注入)、AOP(面向切面编程)和MVC(模型-视图-控制器)等核心特性组成。
-
解释一下Spring框架中的IOC/DI概念。 IOC(Inversion of Control)即控制反转,意味着对象的创建和管理交给了容器。DI(Dependency Injection)是IOC的一种实现方式,通过容器将对象的依赖关系以参数的形式注入到目标对象中,降低了对象间的耦合性。
-
Spring AOP是什么,有哪些使用场景? AOP(Aspect Oriented Programming)面向切面编程,用于处理系统级关注点,如日志、事务管理等,与业务逻辑解耦。通常应用于跨层的方法拦截。
-
Spring MVC的工作原理是怎样的? Spring MVC模式接收请求,分发到Controller,Controller调用Service层方法,Service层处理业务逻辑并返回Model数据,然后View Resolver解析视图,最后响应给客户端。
-
谈谈Spring Boot的特点和优点。 参见上文的回答,强调了简化配置、内嵌服务器、快速起步等优点。
-
Spring中是如何实现事务管理的? Spring提供了编程式和声明式两种事务管理方式。声明式事务管理基于@Transactional注解,简单易用;编程式事务管理则通过TransactionTemplate或者PlatformTransactionManager接口进行手动控制。
-
Spring Security是什么,主要负责什么? Spring Security是一个强大的安全框架,用于保护Web应用免受常见的攻击,包括身份验证、授权、CSRF防护等功能。
-
Spring Cloud是做什么的? Spring Cloud是基于Spring Boot实现的一系列微服务开发工具集,包括服务注册与发现、负载均衡、熔断器、配置中心等组件。
-
Spring Data JPA与MyBatis的区别是什么? Spring Data JPA是Spring对JPA规范的封装,提供了ORM操作,适合ORM映射较复杂的情况;MyBatis则是轻量级的持久化框架,更接近SQL,适用于自由度较高的查询需求。
-
如何在Spring Boot中配置日志? Spring Boot默认支持Logback和Log4j2,可以通过application.properties或yml文件配置日志级别、路径等相关属性。
Spring框架中有哪些重要的注解?
在Spring框架中,有许多重要的注解,它们用于不同的目的,包括依赖注入、组件扫描、配置、AOP等方面。以下是部分常用的Spring注解:
-
@Component
: 声明一个bean组件的基础注解,可以被@Component的派生注解@Service、@Repository和@Controller替换,以表示特定类型的组件。 -
@Service
: 通常用于业务逻辑层,是@Component的一个特殊形式,添加更多的语义。 -
@Repository
: 用于数据访问层,例如DAO类,同样也是@Component的扩展。 -
@Controller
: 用于表示Web层的控制器。 -
@Autowired
: 实现依赖注入,自动将Bean实例注入到需要的地方。 -
@Qualifier
: 当有多个相同类型的Bean时,通过此注解指定要注入的特定Bean。 -
@Value
: 用于注入基本类型值或从properties文件中读取值。 -
@Scope
: 控制Bean的作用域,如singleton(单例)或prototype(原型)。 -
@Configuration
: 表示这是一个配置类,可以替代XML配置。 -
@Bean
: 在@Configuration类中定义Bean的方法上使用,告诉Spring该方法会返回一个应注册为Bean的对象。 -
@EnableAutoConfiguration
: 启用Spring Boot的自动配置。 -
@RequestMapping
,@GetMapping
,@PostMapping
: Web层的路由注解,用于映射HTTP请求。 -
@Transactional
: 用于标记事务边界,实现声明式事务管理。 -
@Aspect
: 面向切面编程(AOP)中的注解,定义一个切面。 -
@After
,@Before
,@Around
: AOP中的通知注解,分别表示后置、前置和环绕通知。
@Autowired`注入失败时会有哪些可能的原因?
@Autowired
注入失败通常有以下几个常见原因:
-
缺失匹配的 Bean: 要注入的类型没有在 Spring 容器中找到对应的 Bean。确保已创建并正确配置了所需类型的 Bean。
-
类型不匹配: 声明的注入类型与 Spring 容器中存在的 Bean 类型不一致。检查类型是否正确,或者是否有 @Qualifier 或其他方式来指定正确的 Bean。
-
未启用自动装配: 在 Spring XML 配置或 Spring Boot 中,需要启用自动装配 (
@ EnableAutoConfiguration
) 来让@Autowired
工作。 -
注解位置不当:
@Autowired
应用在字段、setter 方法或构造函数上。如果放在了其他地方,可能会导致注入失败。 -
默认唯一性要求: 默认情况下,Spring 需要找到一个且仅一个符合类型的 Bean 进行注入。如果有多个相同类型的 Bean,需要使用
@Qualifier
或@Primary
解决。 -
非 Singleton:对于 prototype 或其他作用域的 Bean,Spring 不会在每个请求时都注入同一个实例,可能导致意外的行为。
-
延迟初始化: 如果配置了 Bean 的 lazy-init 属性,那么只有在真正被使用时才会初始化,可能导致
@Autowired
失败。 -
静态字段:
@Autowired
不能用于静态字段,因为静态字段在类加载时初始化,而那时 Spring 容器还没有准备好。
什么是 Spring 中的 `@Primary` 注解,并如何使用?
@Primary
是 Spring 提供的一个注解,用于在存在多个相同类型的候选 Bean 时,默认选择其中一个进行自动装配。当 Spring 遇到多个符合条件的 Bean 实例并且没有明确的 @Qualifier
指示时,会优先选择标注了 @Primary
的 Bean。
如何使用:
- 将
@Primary
注解添加到你想作为默认 Bean 的类上的@Component
、@Service
、@Repository
或@Controller
等 Spring 组件注解之上。 - 或者,将
@Primary
添加到 Bean 的配置方法上(如果使用的是基于 Java 的配置)。
例子:
// 使用 @Primary 注解
@Service
@Primary // 这是关键,声明这个实现为默认首选
public class PrimaryServiceImpl implements MyService {// ...
}@Service
public class SecondaryServiceImpl implements MyService {// ...
}
在这个例子中,如果我们有一个依赖于 MyService
类型的字段,Spring 将默认注入 PrimaryServiceImpl
,即使还有 SecondaryServiceImpl
存在。
Spring 框架是非常广泛使用的 Java 应用开发框架,其面试中常见的问题涵盖了很多方面。这里列出一些基础和进阶的 Spring 面试题:
-
简述Spring框架的核心组件。
- Spring的主要组件包括IoC容器(控制反转)、AOP(面向切面编程)、MVC(模型-视图-控制器)、数据访问/集成、事务管理等。
-
什么是IoC(Inversion of Control),它在Spring中的作用是什么?
- IoC是将对象创建和对象间的依赖关系交由外部容器控制,而不是类内部。Spring通过IoC实现组件的松耦合。
-
解释一下Spring的AOP。
- AOP允许在程序执行期间,在不修改源代码的情况下添加新的行为(如日志记录、权限检查)。Spring支持面向切面编程,提供动态代理和通知(advises)机制。
-
Spring的Bean生命周期包括哪些阶段?
- 包括实例化、属性注入、初始化回调、正常使用、销毁回调以及销毁。
-
Spring MVC工作原理是什么?
- 用户请求到达DispatcherServlet,DispatcherServlet将请求分发给相应的Controller,Controller处理业务逻辑后返回ModelAndView,ViewResolver解析视图,最后渲染结果。
-
Spring有哪几种事务管理方式?
- 基于编程式的事务管理(手动调用begin/commit/rollback);基于声明式事务管理(使用@Transactional注解)。
-
Spring Data JPA如何简化数据库操作?
- 它提供了方便的DAO层接口生成和查询构造器,减少了手写SQL和JDBC代码的需求。
-
Spring Security能用来做什么?
- Spring Security是一个全面的安全框架,用于处理身份验证、授权、CSRF保护等安全问题。
-
如何在Spring Boot中启用和配置WebSocket?
- 可以通过引入spring-boot-starter-websocket依赖并在配置文件中设置WebSocket的相关配置。
-
Spring Cloud提供哪些微服务治理功能?
- 负载均衡(Ribbon)、服务发现(Eureka)、熔断(Hystrix)、配置中心(Config Server)、API网关(Zuul)等。
您正在准备哪种级别的Spring面试(初级、中级、高级)?
回答: 我可以帮助准备各级别的Spring面试,包括初级、中级和高级。具体取决于您的需求和所关注的Spring技术领域。对于不同级别的面试,通常会涉及以下内容:
初级面试:
- Spring基本概念理解,如IoC和AOP。
- Spring Bean的生命周期。
- Spring MVC的基本工作流程。
- 声明式事务管理的使用。
- 利用JdbcTemplate进行简单数据库操作。
中级面试:
- Spring Boot的特性与优点。
- 自动配置的工作原理。
- Spring Data JPA或MyBatis集成与使用。
- Spring Security的基础配置与认证原理。
- 微服务架构中的Spring Cloud组件。
高级面试:
- Spring AOP的自定义切面实现。
- Spring Boot Actuator监控与健康检查。
- Spring Cloud Stream与消息队列集成。
- 整合Docker、Kubernetes进行部署。
- Spring Profile的应用场景和配置。
Spring Security的基础配置与认证原理
Spring Security基础配置与认证原理
Spring Security是一个强大的安全框架,用于保护基于Spring的应用程序。以下是其基础配置和认证原理:
-
添加依赖: 首先,在Spring Boot项目中引入Spring Security的依赖,通常是通过Spring Boot的起步依赖
spring-boot-starter-security
来完成。 -
自动配置: Spring Boot会尝试自动配置Spring Security。默认情况下,所有HTTP请求都是受保护的,需要身份验证才能访问。
-
WebSecurityConfigurerAdapter配置: 创建一个类,继承
WebSecurityConfigurerAdapter
,覆盖configure(HttpSecurity http)
方法来自定义安全规则。例如,设置允许匿名访问的部分路径:@Override protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/public/**").permitAll() // 允许访问公共URL.anyRequest().authenticated(); // 其他所有请求都需要认证 }
-
身份验证配置: 在上面的配置中,我们指定了所有非公共请求需要认证。Spring Security提供了多种认证方式,例如基于表单的登录(Form Login)和基于JWT的认证等。
-
UserDetailsService: 实现
UserDetailsService
接口,提供用户详细信息的服务。例如:@Service public class CustomUserDetailsService implements UserDetailsService {@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {// 从数据库或其他来源获取用户信息} }
然后在
WebSecurityConfigurerAdapter
中注册这个服务。 -
密码编码器PasswordEncoder: 根据实际情况选择合适的密码编码器,例如
BCryptPasswordEncoder
,以加密存储的密码。 -
启用安全配置: 使用
@EnableWebSecurity
注解启用配置,如果在Spring Boot应用中,则不需要这个注解,因为已经默认启用。 -
登录和权限控制: 默认情况下,Spring Security创建了一个
/login
路径处理登录请求。可以自定义登录页面和逻辑。另外,可以使用hasRole
或hasAuthority
进行角色或权限控制。
怎么配置Spring Security以支持JWT认证?
要配置Spring Security支持JSON Web Token (JWT)认证,你需要遵循以下步骤:
-
添加依赖: 添加Spring Security和JWT库的依赖,如
spring-security-oauth2-jose
、jjwt
或nimbus-jose-jwt
。 -
创建JWT工具类: 创建一个工具类用于生成和解析JWT,例如:
public class JwtUtils {private static final String SECRET_KEY = "your_secret_key";private static final long EXPIRATION_TIME = 86400000L;public String generateToken(UserDetails userDetails) {// 生成JWT令牌}public boolean validateToken(String token) {// 验证JWT令牌}public UserPrincipal getUserFromToken(String token) {// 获取JWT令牌中的用户信息} }
-
实现UserDetailsService: 如之前所述,提供用户详细信息的服务,包括用户名和角色。
-
配置JWT Filter: 创建一个实现了
Filter
接口的类,比如JwtAuthenticationFilter
,它负责解析JWT,验证它,然后将用户信息放入SecurityContextHolder
。 -
重写configure(HttpSecurity): 在你的安全配置类中,替换默认的安全行为,设置过滤器链:
@Override protected void configure(HttpSecurity http) throws Exception {http.csrf().disable() // 因为JWT不使用CSRF token.authorizeRequests().antMatchers(HttpMethod.GET, "/api/public/**").permitAll().anyRequest().authenticated().and().addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class).sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); }
-
配置JWT资源服务器: 如果你有OAuth2资源服务器,可以配置
ResourceServerConfigurerAdapter
以支持JWT:@Configuration @EnableResourceServer public class ResourceServerConfig extends ResourceServerConfigurerAdapter {@Overridepublic void configure(ResourceServerSecurityConfigurer resources) {resources.resourceId("resource_id");}@Overridepublic void configure(HttpSecurity http) {http.authorizeRequests().anyRequest().authenticated();} }
-
创建JWT授权中心: 如果你需要在客户端发送JWT,还需要创建一个授权端点,生成JWT令牌。
自动配置的工作原理
自动配置是Spring Boot的一大特色,它通过@SpringBootApplication
注解启动。其工作原理大致分为以下几个步骤:
-
扫描组件: Spring Boot会扫描指定包及其子包下的所有类,包括@Configuration、@Component、@Service等标记的bean。
-
读取配置元数据: Spring Boot会查找
META-INF/spring.factories
文件,该文件包含了所有可用的自动配置类(@AutoConfigureBefore、@AutoConfigureAfter、@EnableAutoConfiguration等标注的类)。 -
条件化配置: 自动配置类中的@Bean方法并不是都会被调用。每个@Bean都有一个可选的
@Conditional
注解,这些注解决定了在什么条件下这个@Bean才会被实例化。例如,只有当某个特定的类存在或者环境变量满足某些条件时,对应的Bean才被创建。 -
自动配置 bean: 根据应用的类路径和属性配置,Spring Boot会选择合适的自动配置类,并创建它们声明的bean。这些bean通常是其他bean的依赖。
-
主配置的合并: 用户自定义的配置会和自动配置进行合并,用户的配置优先级更高。
-
启动应用: 完成所有bean的创建和依赖注入后,Spring Boot应用正式开始运行。
Spring AOP的自定义切面实现
回答:
在Spring AOP中,自定义切面通常需要创建一个带有注解@Aspect
的类,其中定义了切入点表达式(@Pointcut
)以及通知(前置、后置、环绕、异常、最终)。以下是实现步骤:
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Throw;
import org.aspectj.lang.annotation.After;
import org.springframework.stereotype.Component;@Aspect // 标记为切面
@Component // 将切面注册为Spring bean
public class CustomAspect {// 定义切入点表达式,匹配执行的方法@Pointcut("execution(* com.example.service.*.*(..))") // 匹配com.example.service包下所有方法public void businessMethods() {// 点切面不需要有实际逻辑,仅用于定义切入点}// 前置通知,在目标方法前执行@Before("businessMethods()")public void beforeAdvice() {System.out.println("前置通知:方法开始之前");}// 后置通知(返回通知),在目标方法成功返回后执行@AfterReturning(pointcut = "businessMethods()", returning = "result")public void afterReturningAdvice(Object result) {System.out.println("后置返回通知:方法结束后,返回值为:" + result);}// 异常通知,在目标方法抛出异常后执行@Throw(value = Exception.class)public void exceptionAdvice(Exception ex) {System.out.println("异常通知:捕获到的异常:" + ex.getMessage());}// 最终通知,在目标方法无论是正常执行还是抛出异常之后执行@After("businessMethods()")public void afterAdvice() {System.out.println("最终通知:无论是否抛出异常,方法结束后");}// 环绕通知,使用ProceedingJoinPoint参数控制方法的执行@Around("businessMethods()")public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {long startTime = System.currentTimeMillis();System.out.println("环绕通知:方法开始前");// 执行目标方法Object result = joinPoint.proceed();long endTime = System.currentTimeMillis();System.out.println("环绕通知:方法结束后,耗时:" + (endTime - startTime) + "ms");return result;}
}
相关文章:
Spring高频面试题
(一些来源于GitCode AI) 什么是Spring框架? Spring是一个开源的Java平台,它简化了企业级应用的开发。它提供了IOC(Inversion of Control)/DI(Dependency Injection)容器,…...
Qt篇——Qt无法翻译tr()里面的字符串
最近遇到使用Qt语言家翻译功能时,ui界面中的中文都能够翻译成英文,但是tr("测试")这种动态设置给控件的中文,无法翻译(lang_English.ts文件中的翻译已经正确添加了tr()字符串的翻译)。 上网搜了很多资料&am…...
农村分散式生活污水分质处理及循环利用技术指南
标准已完成意见征集: 本文件给出了农村分散式生活污水分质处理及循环利用的总则、污水收集、污水分质处理、资源化利用、利用模式、运维管理等的指导。 本文件适用于农村分散式生活污水分质处理及循环利用的设施新建、扩建和改建工程的设计、施工与运维。 注:本文件…...
深圳区块链交易所app系统开发,撮合交易系统开发
随着区块链技术的迅速发展和数字资产市场的蓬勃发展,区块链交易所成为了数字资产交易的核心场所之一。在这个快速发展的领域中,区块链交易所App系统的开发和撮合交易系统的建设至关重要。本文将探讨区块链交易所App系统开发及撮合交易系统的重要性&#…...
使用Shell脚本进行MySql权限修改
背景:原先数据配置文件中有bind-address127.0.0.1,注释掉此配置后,原数据库中默认带%root的权限,现在需要通过脚本实现白名单列表中的ip添加权限允许访问数据库,白名单之外的ip没有权限访问数据库。 以下是过程中记录的…...
项目中线程池的应用
1、首先我们需要在配置类中将线程池作为单例bean配置 Configuration public class ThreadPoolExecutorConfig {BeanExecutorService executorService(){return new ThreadPoolExecutor(2,3,0,TimeUnit.MICROSECONDS,new ArrayBlockingQueue<>(3),(r)->new Thread(r,&…...
前端 JS 压缩图片的思路(附源码)
前言 相信大家都做过图片上传相关的功能,在图片上传的过程中,不知道大家有没有考虑过文件体积的问题,如果我们直接将原图片上传,可以图片体积比较大,一是上传速度较慢,二是前端进行渲染时速度也比较慢,比较影响客户的体验感。所以在不影响清晰度的情况下,前端可以在上…...
C语言结合体和枚举的魅力展现
前言 ✨✨欢迎👍👍点赞☕️☕️收藏✍✍评论 个人主页:秋邱’博客 所属栏目:人工智能 (感谢您的光临,您的光临蓬荜生辉) 引言: 前面我们已经讲了结构体的声明,自引用,内存…...
基于STC12C5A60S2系列1T 8051单片机通过单个按键单击次数实现开关机应用
基于STC12C5A60S2系列1T 8051单片机通过单个按键单击次数实现开关机应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍基于STC12C5A60S2系列1T 8051单片机通过单个按…...
静态住宅IP优缺点,究竟要怎么选?
在进行海外 IP 代理时,了解动态住宅 IP 和静态住宅 IP 的区别以及如何选择合适的类型非常重要。本文将介绍精态住宅 IP 特点和,并提供选择建议,帮助您根据需求做出明智的决策。 静态住宅 IP 的特点 静态住宅 IP 是指 IP 地址在一段时间内保…...
day07-缓存商品、购物车
1. 缓存菜品 1.1 问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大。 结果: 系统响应慢、用户体验差 1.2 实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓…...
平台介绍-搭建赛事运营平台(3)
上文介绍了品牌隔离的基本原理,就是通过不同的前端和微服务来实现。但是确实很多功能是类似的,所以从编程角度还是有些管理手段的。 前端部分:前端部分没有什么特别手段,就是两个独立的项目工程,分别维护。相同的部分复…...
数值分析复习:逼近理论的应用——最小二乘问题、解超定、欠定方程组
文章目录 逼近理论的应用——最小二乘问题、解超定、欠定方程组离散平方逼近最小二乘解 本篇文章适合个人复习翻阅,不建议新手入门使用 本专栏:数值分析复习 的前置知识主要有:数学分析、高等代数、泛函分析 逼近理论的应用——最小二乘问题、…...
设计模式-设配器模式
目录 🎊1.适配器模式介绍 🎃2.适配器类型 🎏3.接口适配器 🎐4.类的适配器 🎎5.优缺点 1.适配器模式介绍 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设…...
BEVFormer v2论文阅读
摘要 本文工作 提出了一种具有透视监督(perspective supervision)的新型鸟瞰(BEV)检测器,该检测器收敛速度更快,更适合现代图像骨干。现有的最先进的BEV检测器通常与VovNet等特定深度预训练的主干相连,阻碍了蓬勃发展…...
FFMPEG C++封装(二)
4 详细设计 这章是FFMPEG C封装库的详细设计。 4.1 Init 该模块初始化FFMPEG库。 4.1.1 Init定义 namespace media { namespace sdk { void MEDIASDK_EXPORT Init(); } }函数说明: Init 初始化FFMPEG库,该函数可调用多次。 4.1.2 Init实现 name…...
使用unplugin-auto-import页面不引入api飘红
解决方案:. tsconfig.json文件夹加上 {"compilerOptions": {"target": "ES2020","useDefineForClassFields": true,"module": "ESNext","lib": ["ES2020", "DOM", &q…...
八大技术趋势案例(虚拟现实增强现实)
科技巨变,未来已来,八大技术趋势引领数字化时代。信息技术的迅猛发展,深刻改变了我们的生活、工作和生产方式。人工智能、物联网、云计算、大数据、虚拟现实、增强现实、区块链、量子计算等新兴技术在各行各业得到广泛应用,为各个领域带来了新的活力和变革。 为了更好地了解…...
Vue实现SQL语句关键字高亮显示?
SQL关键字高亮 要在Vue中实现SQL语句中关键字的高亮显示,你可以使用类似的方法,但是你需要根据SQL语法的特点来解析并高亮显示关键字。以下是一个示例代码,演示了如何在Vue中实现SQL语句关键字的高亮显示。 <template><div><…...
开始时间大于结束时间
1.dom中代码,监听所选日期值的变化,并把需要比较的时间字段作为参数传到监听方法中, <el-form-item label"起始日期" prop"startTime"><el-date-picker clearable size"small":disabled"isDisa…...
Java中 List 集合,通过 Stream 流进行排序总结
一、数据准备 public class OrderTest {private String channelCode;private BigDecimal rate;// 省略 getter、setter、toString()、constructor }List<OrderTest> orderTestList new ArrayList<>();OrderTest z09 new OrderTest("Z09", new BigDeci…...
1688中国站按关键字搜索工厂数据 API
公共参数 名称类型必须描述keyString是申请免费调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认y…...
YOLOV8逐步分解(2)_DetectionTrainer类初始化过程
接上篇文章yolov8逐步分解(1)--默认参数&超参配置文件加载继续讲解。 1. 默认配置文件加载完成后,创建对象trainer时,需要从默认配置中获取类DetectionTrainer初始化所需的参数args,如下所示 def train(cfgDEFAULT_CFG, use_pythonFalse…...
Java是用什么语言写的?PHP呢?
Java底层是C语言。 Sun公司研发人员根据嵌入式软件的要求,对C进行了改造,去除了留在C的一些不太实用及影响安全的成分,并结合嵌入式系统的实时性要求,开发了一种称为Oak的面向对象语言。而后,经过迭代更新,…...
SpringBoot Redis的使用
官方文档: 官方文档:Spring Data Redis :: Spring Data Redis 和jedis一样,SpringBoot Redis 也可以让我在Java代码中使用redis,同样也是通过引入maven依赖的形式。 加速访问github: 使用steam可以免费加速访问github Spring…...
数据仓库——维度表特性
企业信息化工厂 数据集市中的一致性,由于企业信息化工厂的数据集市是从集成仓库中获得信息的,因此至少从维度建模的角度来看,一致性维护的问题减少了。尽管合并不同数据源的问题依然在,但是负担主要在设计者身上。尽管压力降低了…...
从电荷角度理解开关电容中的电荷守恒
目录 一些铺垫电容的电荷量的解释电荷流入流出对节点电压的影响 从电荷角度理解开关电容加法器中的电荷守恒以开关电容积分器为例说明什么样的节点是电荷守恒 一些铺垫 电容的电荷量的解释 对于一个1F的电容,当它的压差为1V时,它所携带的电荷量是QCU1库…...
1.7.1 python 作业 15道
1、求出1 / 1 1 / 3 1 / 5……1 / 99的和 (1分之一1分之三1分支5....) sum0 for i in range(1,100,2): sum 1/i sum; print(sum) 2、用循环语句,计算2 - 10之间整数的循环相乘的值 (2*3*4*5....10) sum 1 for i in range(2,11): sum sum *…...
synchronized 和 ReentrantLock 的区别是什么
该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:synchronized 和 ReentrantLock 的区别是什么 1. 获取锁的方式 synchronized:synchronized的锁获取是隐式的。当线程进入synchronized修饰的代码…...
大话设计模式之迪米特法则
迪米特法则,也称为最少知识原则(Law of Demeter),是面向对象设计中的一个重要原则,其核心思想是降低耦合度、减少对象之间的依赖关系,从而使系统更加灵活、易于维护和扩展。 根据迪米特法则,一…...
系统开发策略主要有/衡阳seo排名
软件架构师在整个软件开发过程中都起着重要的作用,并随着开发进程的推进而其职责或关注点不断地变化,总结下面几点。在需求阶段,软件架构师主要负责理解和管理非功能性系统需求,比如软件的可维护性、性能、复用性、可靠性、有效性…...
北京手机网站制作/做百度推广的公司电话号码
问题描述 在使用CupertinoPageScaffold,在child添加ListView时会有20的top-padding(只有在设置navigationBar的backgroundColor时会出现)。 原因深究 ListView底层调用了SliverPadding,而SliverPadding的默认有20的padding /// By…...
wordpress古文主题/培训机构网站
JVM 内部原理(六)— Java 字节码基础之一 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者、架构师、CxO 还是智能手机的普通用户,Java 字节码都在你面前,它是 Java 虚拟机的基…...
中国做外贸的网站/免费建网站最新视频教程
大连益盛达智能科技有限公司 主要产品有1-26寸AOI粒子压痕检测机、1-26寸系列全自动COG邦定机(国家立项项目)、中大尺寸COG返修机、1-26寸系列全自动FOG热压机、1-21寸系列全自动背光组装机、IR镜座组装机、全自动清洗机、自动上料机、智能机器人、陶瓷…...
怎么注册公司支付宝账号/seo网站排名优化价格
现在的家庭多多少少都会选择购买一辆汽车,改革开放开始我国的城镇化建设已经得到了很大的加强,对于农村地区的建设我们也要有着很大的发展。而和家电下乡同样的就是汽车下乡了,明年开始新一轮的汽车下乡又要来了,农民买车补贴金额…...
搜狗搜索网页版/厦门seo优化
1 引言 说到前端编译方案,也就是如何打包项目,如何编译组件,可选方案有很多,比如: 通过 webpack / parcel / gulp 构建项目。通过 parcel / gulp / babel 构建组件。如果你喜欢零配置的 parcel,那么项目和组…...