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配置,使数据库访问更简洁。
复制代码

 

posted @   arun_python  阅读(8)  评论(0编辑  收藏  举报
编辑推荐:
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
阅读排行:
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· 《HelloGitHub》第 108 期
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单
· Supergateway:MCP服务器的远程调试与集成工具
点击右上角即可分享
微信分享提示