当前位置: 首页 > news >正文

网站如何添加关键词百中搜优化软件

网站如何添加关键词,百中搜优化软件,岳阳网站建设收费标准,设计好的建设网站Spring Boot 注解是其“约定优于配置”的核心实现工具,通过注解简化了传统 Spring 应用的繁琐配置。以下从高频面试题出发,深度解析 Spring Boot 最常用注解的原理、作用及使用场景,覆盖启动类、配置、依赖注入、AOP、Web 开发等核心场景。 ​…

Spring Boot 注解是其“约定优于配置”的核心实现工具,通过注解简化了传统 Spring 应用的繁琐配置。以下从高频面试题出发,深度解析 Spring Boot 最常用注解的原理、作用及使用场景,覆盖启动类、配置、依赖注入、AOP、Web 开发等核心场景。


一、启动类与自动配置注解

1. @SpringBootApplication

面试高频问题​:

  • “@SpringBootApplication 由哪些注解组成?各自的作用是什么?”
  • “为什么说它是 Spring Boot 启动的核心注解?”

解析​:
@SpringBootApplication 是 Spring Boot 启动类的组合注解,默认包含 3 个核心注解:

  • @SpringBootConfiguration:标记当前类为 Spring Boot 配置类(本质是 @Configuration 的扩展,支持更友好的配置方式)。
  • @EnableAutoConfiguration:启用 Spring Boot 的自动配置机制​(核心功能,自动为应用加载预定义的 Bean)。
  • @ComponentScan:扫描当前包及子包下的组件(如 @Component@Service 等),将它们注册为 Spring Bean。

关键细节​:

  • 自动配置的原理:通过 META-INF/spring.factories 文件加载所有 EnableAutoConfiguration 类型的配置类,再结合 @Conditional 系列注解(如 @ConditionalOnClass@ConditionalOnMissingBean)判断是否生效。
  • 若需排除某些自动配置,可使用 exclude 参数(如 @SpringBootApplication(exclude = DataSourceAutoConfiguration.class))。
2. @Conditional 系列注解

面试高频问题​:

  • “@ConditionalOnClass 和 @ConditionalOnMissingBean 的区别是什么?”
  • “如何根据环境条件(如开发/生产)决定 Bean 是否生效?”

解析​:
@Conditional 是条件注解的元注解,Spring Boot 提供了一系列派生注解,用于控制 Bean 或配置类的生效条件:

注解作用典型场景
@ConditionalOnClass当类路径存在指定类时生效(如数据库驱动 com.mysql.cj.jdbc.Driver自动配置数据库连接池(如 HikariCP 依赖 HikariDataSource 类存在时生效)。
@ConditionalOnMissingBean当容器中不存在指定类型的 Bean 时生效(常用于覆盖默认配置)用户自定义 DataSource 时,自动配置的 HikariCP 不会覆盖用户定义的 Bean。
@ConditionalOnProperty当配置文件中指定属性满足条件时生效(如 spring.datasource.url 存在)根据配置决定是否启用某个功能(如 Redis 缓存开关)。
@ConditionalOnWebApplication当应用是 Web 应用时生效(如 Spring MVC 或 Spring WebFlux)仅在 Web 环境下生效的配置(如 DispatcherServlet 自动配置)。
@Profile当指定环境(如 devprod)激活时生效不同环境加载不同配置(如 @Profile("dev") 下加载开发环境数据源)。

二、依赖注入(DI)注解

3. @Autowired 与 @Resource

面试高频问题​:

  • “@Autowired 和 @Resource 的区别是什么?如何选择?”
  • “@Autowired 注入失败(NoSuchBeanDefinitionException)的可能原因有哪些?”

解析​:
两者均为 Spring 依赖注入的注解,但实现机制不同:

特性@Autowired@Resource
来源Spring 自定义注解(org.springframework.beans.factory.annotationJSR-250 规范注解(javax.annotation
注入方式按类型(Type)优先,配合 @Qualifier 按名称(Name)按名称(Name)优先,名称不匹配时按类型
必填性默认 required=true(注入失败抛异常)默认 required=true(可通过 @Resource(required=false) 关闭)

使用建议​:

  • 优先使用 @Autowired(Spring 生态更友好,支持 @Primary@Qualifier 等扩展)。
  • 若需按名称注入(如接口有多个实现类),配合 @Qualifier("beanName") 或使用 @Resource(name = "beanName")
4. @Primary 与 @Qualifier

面试高频问题​:

  • “@Primary 在自动配置中起什么作用?”
  • “当多个 Bean 满足注入条件时,如何指定注入哪一个?”

解析​:

  • @Primary:标记某个 Bean 为“首选”,当按类型注入时若存在多个同类型 Bean,优先选择被 @Primary 标记的。
    示例​:

    @Configuration
    public class DataSourceConfig {@Bean@Primary // 优先注入 HikariDataSourcepublic DataSource hikariDataSource() {return new HikariDataSource();}@Beanpublic DataSource tomcatDataSource() {return new TomcatDataSource();}
    }
  • @Qualifier:通过 Bean 的名称(或自定义限定符)精确指定注入的 Bean,解决多实现类的歧义问题。
    示例​:

    @Service
    public class UserService {@Autowired@Qualifier("mysqlUserDao") // 注入名称为 mysqlUserDao 的 UserDao 实现private UserDao userDao;
    }

三、AOP 相关注解

5. @Aspect 与 @Pointcut

面试高频问题​:

  • “AOP 的核心概念(切点、通知、切面)分别对应哪些注解?”
  • “@Pointcut 如何定义通用切点?有哪些常用表达式?”

解析​:
Spring AOP 通过动态代理实现,核心注解如下:

注解作用
@Aspect标记一个类为切面类(包含切点和通知逻辑)。
@Pointcut定义切点(匹配需要增强的方法),支持 SpEL 表达式。
@Before前置通知(方法执行前执行)。
@After后置通知(方法执行后执行,无论是否异常)。
@AfterReturning返回后通知(方法正常返回后执行,可获取返回值)。
@AfterThrowing异常通知(方法抛出异常后执行,可获取异常对象)。
@Around环绕通知(包裹目标方法,可控制是否执行目标方法)。

​@Pointcut 切点表达式示例​:

  • execution(* com.example.service.*.*(..)):匹配 service 包下所有类的所有方法。
  • @annotation(com.example.annotation.Log):匹配标注了 @Log 注解的方法。
  • within(com.example.controller..*):匹配 controller 包及其子包下的所有类。
6. @Around 通知的参数与控制

面试高频问题​:

  • “@Around 通知如何传递参数?如何控制目标方法是否执行?”

解析​:
@Around 是功能最强大的通知,通过 ProceedingJoinPoint 参数控制目标方法的执行:

@Around("logPointcut()") // 匹配自定义切点
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {long start = System.currentTimeMillis();Object result = joinPoint.proceed(); // 执行目标方法(必须调用,否则目标方法不执行)long cost = System.currentTimeMillis() - start;log.info("方法 {} 执行耗时:{}ms", joinPoint.getSignature().getName(), cost);return result; // 可修改返回值(需注意类型转换)
}

注意​:若不调用 joinPoint.proceed(),目标方法会被拦截,适用于事务回滚、权限校验等场景。


四、Web 开发相关注解

7. @RestController 与 @RequestMapping

面试高频问题​:

  • “@RestController 和 @Controller 的区别是什么?”
  • “@RequestMapping 的常用属性(如 method、consumes、produces)有什么作用?”

解析​:

  • @RestController:组合注解(@Controller + @ResponseBody),标记类为 RESTful 控制器,返回值自动序列化为 JSON/XML。
  • @Controller:标记类为 MVC 控制器,需配合 @ResponseBody 返回 JSON,或使用视图解析器返回页面。

@RequestMapping 常用属性:

属性作用示例
method限定 HTTP 请求方法(如 RequestMethod.GETPOST@RequestMapping(value = "/user", method = RequestMethod.POST)
consumes限定请求的 Content-Type(如 application/json@RequestMapping(consumes = "application/json")
produces限定响应的 Accept 类型(如 application/json@RequestMapping(produces = "application/json;charset=UTF-8")
8. @RequestBody 与 @ResponseBody

面试高频问题​:

  • “@RequestBody 如何将 JSON 转换为 Java 对象?”
  • “@ResponseBody 在什么情况下会失效?”

解析​:

  • @RequestBody:标记方法参数,将 HTTP 请求体(如 JSON、XML)通过 HttpMessageConverter 转换为 Java 对象(依赖 Jackson 或 Gson 等库)。
  • @ResponseBody:标记方法或类,将返回值通过 HttpMessageConverter 转换为响应体(如 JSON)。

失效场景​:

  • 返回值为 ModelAndView(视图解析器优先处理)。
  • 方法参数为 HttpServletRequestHttpServletResponse 等 Servlet API 类型。
9. @PathVariable 与 @RequestParam

面试高频问题​:

  • “@PathVariable 和 @RequestParam 的区别是什么?”
  • “如何处理路径变量中的特殊字符(如空格、中文)?”

解析​:

注解作用示例
@PathVariable从 URL 路径中获取变量(如 /user/{id} 中的 id@GetMapping("/user/{id}") public User getUser(@PathVariable Long id)
@RequestParam从请求参数中获取值(如 ?name=张三&age=20 中的 nameage@GetMapping("/user") public User getUser(@RequestParam String name)

特殊字符处理​:

  • URL 编码:前端需将特殊字符(如空格→%20,中文→%E4%B8%AD)编码,Spring Boot 自动解码。
  • 配置 spring.mvc.encode-uri-parameters=true(默认开启)可控制是否编码。

五、数据访问与事务注解

10. @Transactional

面试高频问题​:

  • “@Transactional 的常用属性(propagation、isolation、rollbackFor)有什么作用?”
  • “为什么 @Transactional 注解在 private 方法上会失效?”

解析​:
@Transactional 用于声明事务,核心属性如下:

属性作用示例
propagation事务传播行为(如 Propagation.REQUIRED:当前有事务则加入,无则新建)@Transactional(propagation = Propagation.REQUIRES_NEW)
isolation事务隔离级别(如 Isolation.READ_COMMITTED:读已提交)@Transactional(isolation = Isolation.SERIALIZABLE)
rollbackFor指定需要回滚的异常类(默认仅回滚 RuntimeExceptionError@Transactional(rollbackFor = Exception.class)
timeout事务超时时间(秒,默认 -1 表示不限制)@Transactional(timeout = 30)

失效场景​:

  • 方法修饰符为 privatestaticfinal(Spring AOP 基于动态代理,无法代理这些方法)。
  • 异常被 try-catch 捕获且未手动回滚(需在 catch 块中调用 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly())。

六、测试相关注解

11. @SpringBootTest 与 @WebMvcTest

面试高频问题​:

  • “@SpringBootTest 和 @ContextConfiguration 的区别是什么?”
  • “@WebMvcTest 如何模拟 Controller 的依赖?”

解析​:

  • @SpringBootTest:Spring Boot 提供的全局测试注解,加载完整的 Spring 上下文(适合集成测试)。
  • @WebMvcTest:专注于 MVC 层的测试,仅加载 Web 相关组件(如 @Controller@RestController),自动配置 MockMvc(适合单元测试)。

​@WebMvcTest 示例​:

@WebMvcTest(UserController.class) // 仅测试 UserController
public class UserControllerTest {@Autowiredprivate MockMvc mockMvc; // 模拟 HTTP 请求@MockBean // 替换真实 Bean 为 Mock 对象(如 UserService)private UserService userService;@Testpublic void getUserTest() throws Exception {// 模拟 userService.getUser(1L) 返回用户对象when(userService.getUser(1L)).thenReturn(new User(1L, "张三"));// 模拟 GET /user/1 请求,验证返回 JSONmockMvc.perform(get("/user/1")).andExpect(status().isOk()).andExpect(jsonPath("$.name").value("张三"));}
}

总结:Spring Boot 注解的核心逻辑

Spring Boot 注解的本质是通过元数据声明式配置,替代传统 XML 或 Java 代码配置。理解以下逻辑链可快速掌握注解的本质:

  1. 启动类注解​(@SpringBootApplication)→ 触发自动配置和组件扫描。
  2. 条件注解​(@Conditional 系列)→ 控制 Bean 是否生效(按类、属性、环境)。
  3. 依赖注入注解​(@Autowired@Resource)→ 解决对象间依赖关系。
  4. AOP 注解​(@Aspect@Pointcut)→ 实现横切逻辑(日志、事务、权限)。
  5. Web 注解​(@RestController@RequestMapping)→ 简化 HTTP 请求处理。
  6. 事务注解​(@Transactional)→ 声明式事务管理。

掌握这些注解的原理和使用场景,能显著提升 Spring Boot 开发的效率和代码质量。

http://www.khdw.cn/news/49203.html

相关文章:

  • 南通北京网站建设百度百科优化排名
  • 百度网站排名怎么做河南专业网站建设
  • 今天头条新闻武汉本地seo
  • 中信建设有限责任公司资阳分公司搜狗搜索引擎优化论文
  • 古尔邦节网站建设免费宣传网站
  • 网站域名到期怎么办北京百度推广代运营
  • 济宁网站建设神华科技网站安全
  • 房地产销售平台网站建设广州seo外包多少钱
  • 临清做网站seo怎么优化步骤
  • 自己做的网址危险网站手机免费建网站
  • 重庆网站推广转化率百度关键词挖掘工具爱站网
  • 做网站用什么配置的笔记本事件营销
  • 深圳市官网网站建设哪家好爱站seo综合查询
  • 做资金盘网站天津优化公司
  • 成都网站建设网站店面怎么做位置定位
  • 深圳中装建设集团有限公司seo优化一般包括哪些
  • 网站数据库空间大小六盘水seo
  • 网站制作百度资源国际军事新闻最新消息今天
  • 北京怎样做企业网站google官网入口手机版
  • 上海装修做网站的倒闭了今天重大新闻头条新闻军事
  • 福清市建设局网站多少网站网络推广优化
  • 个人网站设计成品下载关键词优化的软件
  • 网站框架设计揭阳市seo上词外包
  • 网站备案视频网站如何推广运营
  • 免费做网站凡科域名比价网
  • cpa做电影网站侵权吗搭建网站多少钱
  • 点样做网站百度关键词优化排名
  • 哈尔滨网站建设公司seo优化专员招聘
  • 营销策划方案内容windows7优化大师官方下载
  • 大名网站建设价格投放广告找什么平台