一篇让你熟练掌握Spring注解(全网最全)

本文详尽解析了Spring框架中的关键注解,包括启动相关的@SpringBootApplication、@ComponentScan、@Configuration和@EnableAutoConfiguration,以及Spring Bean注解如@Autowired、@Resource等。深入探讨了它们的用途、区别和应用场景,涵盖了HTTP请求处理、配置信息读取、事务管理等多个方面,旨在帮助读者全面掌握Spring注解的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.启动相关

@SpringBootApplication

在这里插入图片描述
在这里插入图片描述

包含了 @ComponentScan@Configuration@EnableAutoConfiguration 注解。

@ComponentScan

其中 @ComponentScan 让 spring Boot 扫描被@Component (@Service,@Controller)注解的 bean到 Configuration 类并把它加入到程序上下文。

@Configuration(下面有详细版本)

@Configuration 等同于 spring 的 XML 配置文件;允许在 Spring 上下文中注册额外的 bean 或导入其他配置类。

@EnableAutoConfiguration

@EnableAutoConfiguration 启用 SpringBoot 的自动配置机制。

2.Spring Bean 相关

@Autowired

自动导入对象到类中,被注入进的类同样要被 Spring 容器管理比如:Service 类注入到 Controller 类中。

@Slf4j
@Service
public class ProjectServiceImpl  implements ProjectService {
}

@Autowired
private ProjectService projectService;
@PostMapping ("/application")
public ResultVo findProject(@RequestBody @Validated FindProjectRequest request) {
    return projectService.findProject(request);
}

@Resource

public class Hello {

    @Resource(name = "HappyClient")
    private HappyClient happyClient;
    
    @Resource(type = HappyPlayAno .class)
    private HappyPlayAno happyPlayAno;
}

@Resource的作用相当于@Autowired,均可标注在字段或属性的setter方法上。

这个地方注意一下 这里的区别???????????????????
a:提供方 @Autowired是Spring的注解,@Resource是javax.annotation注解,而是来自于JSR-250,J2EE提供,需要JDK1.6及以上。
b :注入方式 @Autowired只按照Type 注入;@Resource默认按Name自动注入,也提供按照Type 注入;
c:属性
@Autowired注解可用于为类的属性、构造器、方法进行注值。默认情况下,其依赖的对象必须存在(bean可用),如果需要改变这种默认方式,可以设置其required属性为false。
还有一个比较重要的点就是,@Autowired注解默认按照类型装配,如果容器中包含多个同一类型的Bean,那么启动容器时会报找不到指定类型bean的异常,解决办法是结合**@Qualifier**注解进行限定,指定注入的bean名称。
@Resource有两个中重要的属性:name和type。name属性指定byName,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。
需要注意的是,@Resource如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。

d:@Resource注解的使用性更为灵活,可指定名称,也可以指定类型 ;@Autowired注解进行装配容易抛出异常,特别是装配的bean类型有多个的时候,而解决的办法是需要在增加@Qualifier进行限定。

@RestController

@RestController 注解是 @Controller@ResponseBody 的合集, 表示这是个控制器 bean, 并且是将函数的返回值直接填入 HTTP 响应体中, 是 REST 风格的控制器

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    String value() default "";
}

@Repositor

标注一个DAO组件类。

@Service

标注一个业务逻辑组件类。

@Controller

@Controller:用于定义控制器类,在 spring 项目中由控制器负责将用户发来的 URL 请求转发到对应的服务接口(service 层)。一般这个注解在类中,通常方法需要配合注解 @RequestMapping使用。

@ResponseBody

@Controller
@RequestMapping("/test")
@Slf4j
public class TestController {

    @RequestMapping("/hello.json")
    @ResponseBody
    public JsonData hello() {
        log.info("hello");
        return JsonData.success("hello, permission");
    }

作用:将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给客户端

当方法上面没有写ResponseBody,底层会将方法的返回值封装为ModelAndView对象。在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。

  • 如果返回值是字符串,那么直接将字符串写到客户端;
  • 如果是一个对象,会将对象转化为json串,然后写到客户端。

如果返回对象,按utf-8编码。如果返回String,默认按iso8859-1编码,页面可能出现乱码。因此在注解中我们可以手动修改编码格式,例如

@RequestMapping(value="/cat/query",produces="text/html;charset=utf-8"),

前面是请求的路径,后面是编码格式。

原理

控制层方法的返回值是如何转化为json格式的字符串的?其实是通过HttpMessageConverter中的方法实现的,它本是一个接口,在其实现类完成转换。

  • 如果是bean对象,会调用对象的getXXX()方法获取属性值并且以键值对的形式进行封装,进而转化为json串。
  • 如果是map集合,采用get(key)方式获取value值,然后进行封装。

@Component、@Repository、@Service、@Controller实质上属于同一类注解,用法相同,功能相同,区别在于标识组件的类型。

@Component可以代替@Repository、@Service、@Controller,因为这三个注解是被@Component标注的。 如下代码

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
    String value() default "";
}

此处引用大神的文章https://blog.youkuaiyun.com/jiahao1186/article/details/91980316

@Scope

声明 Spring Bean 的作用域,使用方法:

@Bean
@Scope("singleton")
public Person personSingleton() {
    return new Person();
}

四种常见的 Spring Bean 的作用域:

  • singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
  • prototype : 每次请求都会创建一个新的 bean 实例。
  • request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
  • session : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。

@Configuration

一般用来声明配置类,可以使用 @Component注解替代,不过使用Configuration注解声明配置类更加语义化。

使用@Configuration 用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}

这和 Spring 的 XML 文件中的非常类似

<beans> 
	<bean id="myService" class="com.acme.services.MyServiceImpl"/> 
</beans>
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haikuotiankongdong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值