003Spring注解
一、spring中大量的注解作用是什么?怎么实现的?
Spring 中大量使用注解的主要目的是实现 IoC 和 AOP。
这些注解的作用主要有:
配置注解:替代 xml 配置方式,通过注解来定义 Bean、声明配置等。如:@Configuration、@Bean、@Component、@ComponentScan 等。
依赖注入注解:通过注解方式实现属性注入和setter方法注入。如:@Autowired、@Qualifier、@Resource、@Value 等。
AOP注解:实现面向切面编程。如:@Aspect、@Before、@After、@Around等。
事务注解:声明式事务管理。如:@Transactional。
其他注解:如MVC相关的@Controller、@RequestMapping等。
Spring 通过注解实现这些功能的原理主要是:
Spring 在初始化时会通过类路径扫描或者配置自动检测带有特定注解的类。
根据不同的注解做不同的处理,比如:@Component 和 @Configuration 会实例化和配置类,@Autowired会做依赖注入处理。
AOP相关注解会使用动态代理技术生成代理类并织入通知逻辑。
通过委托模式统一调用不同模块的注解处理器进行处理。
最后将扫描到的信息组装并生成一个完整的应用上下文。
所以 Spring 的注解是声明式的,通过注解告诉 Spring 要做的事,而具体的处理是通过 Spring 内部的注解处理器来完成的。这种设计使得 Spring 框架更清晰、便于扩展。
二、
@SpringBootApplication
public class VideoApplication {
} 的SpringBootApplication作用是啥,都包含哪些原注解并解释包含的原注解?
1 2 3 4 5 6 7 8 9 10 11 12 13 | @SpringBootApplication是一个组合注解,它结合了以下3个注解的功能: @SpringBootConfiguration 这个注解表示当前类是Spring Boot配置类,相当于使用@Configuration注解,将其标识为Spring配置类。 @EnableAutoConfiguration 这个注解借助@Import的支持,收集和注册beans定义,使Spring Boot应用能根据类路径和定义的beans自动配置Spring应用上下文。它会自动配置Spring的各种组件 beans。 @ComponentScan 这个注解用于启用组件扫描,相当于在xml中配置了:context:component-scan。Spring会自动扫描指定包及子包下所有标有@Component/@Service/@Repository等注解的类,并注册为beans。 所以@SpringBootApplication注解相当于同时使用了@Configuration、@EnableAutoConfiguration和@ComponentScan这3个注解,简化了Spring Boot应用的配置。 把它加在Spring Boot主类上,就可以扫描当前包及子包的组件了。 |
三、
1 2 3 4 5 6 7 | @SpringBootApplication @MapperScan ( "net.xdclass.dao" ) public class VideoApplication { public static void main(String[] args) { SpringApplication.run(VideoApplication. class , args); } } |
中的VideoApplication.class表示什么意思?
在这个示例代码中,VideoApplication是一个Spring Boot应用的启动类,包含了main方法和@SpringBootApplication注解。 VideoApplication.class表示的是VideoApplication类的类对象。 SpringApplication.run(VideoApplication.class, args);表示以VideoApplication这个类作为Spring Boot应用的主配置类来启动整个Spring Boot应用。 VideoApplication.class会被SpringApplication加载并解析,以获取 MAIN配置类上的@SpringBootApplication和@Configuration注解的信息,并启动扫描路径下的组件。 所以VideoApplication.class这里表示的就是主配置类VideoApplication的类对象,它会成为SpringApplication启动Spring Boot应用的基础。 把主配置类.class对象传递给SpringApplication.run是启动Spring Boot 应用的标准姿势。这行代码使SpringApplication以VideoApplication这个主配置类作为引导类,来启动整个Spring Boot应用。
四、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import net.xdclass.service.VideoService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping ( "api/v1/video" ) public class VideoController { static final Logger log = LoggerFactory.getLogger(VideoController. class ); @Autowired private VideoService videoService; @RequestMapping ( "find_by_id" ) public Object findById( @RequestParam int videoId){ // 打印日志 log.info( "videoId: {}" , videoId); return videoService.findById(videoId); } } |
(1)中@RestController和@RequestMapping的作用是啥,请详细解释?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 在Spring MVC中,@RestController和@RequestMapping注解用于定义RESTful接口。 @RestController注解: 它标注在类上,表示当前类是一个RESTful的控制器类。 @RestController注解相当于@Controller和@ResponseBody的结合,表示这个控制器中的所有方法都以JSON格式输出响应体。 使用@RestController代替@Controller可以不用在每个方法上添加@ResponseBody注解。 @RequestMapping注解: 它用来映射web请求(访问路径和参数)与控制器类或方法之间的对应关系。 可以注解在类和方法上。 在类上注解,表示类中的所有响应请求的方法都是以该地址作为父路径。 在方法上注解,表示该方法响应的具体请求路径。 示例代码中,请求路径 "api/v1/video" 都映射到VideoController这个控制器类。 所以,@RestController和@RequestMapping注解在一起使用,可以定义一个RESTful的控制器,指定它响应的请求路径,使请求映射到控制器类和方法上,从而实现REST接口。 |
(2)中@Autowired和@RequestParam作用?
@Autowired和@RequestParam在Spring MVC中的作用分别是:
@Autowired:用于依赖注入,将VideoService接口的实现类注入到VideoController中。
@RequestParam:用于获取请求参数,videoId是请求中的一个参数,通过@RequestParam可以将其映射到findById方法的参数中。
具体来说:
@Autowired
用于对类成员变量、方法及构造函数进行标注,完成自动装配的工作。
通过 @Autowired的使用来消除 set ,get方法。
@RequestParam
用在方法的参数前面,表示该参数的值将直接从请求参数中获取。
变量名和请求参数名一致时,可以不指定value。
required属性表示该参数是否必须,默认是true。
defaultValue属性可以设置默认值,如果没有获取到参数的值就使用默认值。
所以在这个例子中,@Autowired用于自动将VideoService注入到VideoController中,便于VideoController使用VideoService提供的方法;@RequestParam用于提取请求的参数videoId,并传递给findById方法。
五、
package net.xdclass.dao; import net.xdclass.domain.Video; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.springframework.stereotype.Repository; @Repository public interface VideoMapper { @Select("select * from video where id=#{videoId}") Video findById(@Param("videoId") int videoId); }
中@Repository/@Select和@Param作用并详细解释?
这个代码片段定义了一个MyBatis的映射接口VideoMapper,其中使用了以下注解: @Repository - 在接口类上使用该注解将其标识为Spring的数据访问组件Bean,可以直接注入到其他类中使用。 @Select - 在接口方法上使用该注解,指定了查询数据库的SQL语句。这里定义了根据视频id查询视频信息的SQL。 @Param - 方法参数上使用该注解,可以指定把哪个参数传给SQL语句中的哪个参数。 @Param("videoId") - 表示将方法的参数videoId传给SQL中#{videoId}这个位置的参数。 更多解释: @Repository注解将VideoMapper标识为一个数据访问组件Bean,会被Spring自动扫描并创建Bean实例。 @Select注解指定了查询视频的SQL语句,其中使用#{videoId}作为参数占位符。 @Param注解用于指定接口方法的参数videoId映射到SQL的参数#{videoId}上,相当于一个占位符对象。 在applicationContext中可以直接注入VideoMapper接口使用,不需要写实现类。 MyBatis框架会根据接口和注解生成SqlSession代理对象,从而实现接口方法。 所以这些注解可以省去MyBatis的xml配置,使数据库访问更简洁。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· 《HelloGitHub》第 108 期
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单
· Supergateway:MCP服务器的远程调试与集成工具