更方便Spring存储和读取对象,五大类注解、@Bean、@Autowired、@Resource

简介: 更方便Spring存储和读取对象,五大类注解、@Bean、@Autowired、@Resource
上一篇博客我们介绍了如何使用xml来引入bean对象,当项目多的时候,显然那样是比较麻烦的。现在我们只需要 个注解就可以替代了。注意:注解和xml可以同时使用

准备工作:配置扫描路径


我们需要配置 下存储对象的扫描包路径,只有被配置的包下的所有类,添加了注解才能被正确的识别并保存到 Spring 中。

6f574cb0c6fa4242b121edc2f78669f0.png

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <content:component-scan base-package="com.bit.service"></content:component-scan>
</beans>


更方便的存储到Spring


类注解:@Controller、@Service、@Repository、@Configuration、@Component 方法注解:@Bean属性注解:@Autowired、@Resource


五大类注解


@Configuration(配置):配置层,配置当前项目的一些信息

@Controller(控制器):控制层,主要负责前端参数校验,检查用户参数的有效性

@Service(服务):服务层,调用持久化类实现相应的功能(不直接和数据库交互,类似控制中心)

@Repository(仓库):持久层,直接和数据库进行交互,通常每个表都有一个对应的Repository

@Component(组件):公共工具类,提供某些公共方法,是其他四个注解的父亲。通常不属于上面四种情况的时候使用这个,可以理解为其他。


e460cee57c984c1eaf7e7130597e96da.png



Bean Name


这里的Bean Name 指的就是getBean方法中要传入的第一个参数 String s,注解里就相当于这个类id第二个参数是一个类


  • 第一个字母大写 第二个字母小写 -----> 第一个字母变为小写


86460a9fd0b14f2c8323206880e9c3de.png

直接看源码发掘类注解Bean Name的命名规则:

image.png

e16908e7845c41f3adcb94b5fc90e3e5.png



方法注解


配合类注解使用,否则就是无效的注解。因为不会扫描到这个类,自然就不会扫描到这个方法。

方法注解只支持ApplicaContext,不支持BeanFactory。BeanFactory无法扫描到Bean注解,猜测是因为bean这个功能更新的晚,BeanFactory也基本不用了所以就...

Bean Name

  • 默认情况 Bean name == 方法名
  • 可以自定义Bean name,但是注意自定义之后,默认的就失效了.

从下面的图我们可以看到,Bean Name如果自定义的话是一个String的数组,是可以有多个命名的。


c0561d44aceb4b1e8d857102d839eccf.png

定义命名的格式有下面几种


1. @Bean("name1")
2. @Bean(name = "name1")
3. @Bean(name = {"name1","name2"})


更方便的从Spring中获取


获取 bean 对象也叫做 对象装配,是把对象取出来放到某个类中,有时候也叫 对象注入。属性注入的三种方式都是使用 @AutoWired


属性注入


其实就是 简化了获取对象的流程,直接使用注解即可。如下面代码:

假设现在服务层有一个类
@Service
public class StudentService {
    @Bean("name1")
    public void sayHi(){
        System.out.println("Hi,Service");
    }
}
而在控制层需要调用这个sayHi方法。
@Controller
public class StudentController {
//新方法,直接使用@Autowired获取到studentService
    @Autowired
    StudentService studentService;
    public void sayHi() {
        studentService.sayHi();
    }
//老方法先获取一个ApplicationContext 在调用getBean方法相对来说比较麻烦
    public void sayHi2(){
        ApplicationContext context = new ClassPathXmlApplicationContext("Spring-config.xml");
        StudentService studentService= context.getBean("studentService",StudentService.class);
        studentService.sayHi();
    }
}

构造方法注入

@Controller
public class UserController2 {
// 注入方法2:构造方法注入
    private UserService userService;
    @Autowired
    public UserController2(UserService userService) {
        this.userService = userService;
    }
    public User getUser(Integer id) {
        return userService.getUser(id);
    }
}
  • 注意:只有一个构造方法的时候@Autowired可以省略,如下代码
@Controller
public class UserController2 {
// 注入方法2:构造方法注入
    private UserService userService;
    public UserController2(UserService userService) {
        this.userService = userService;
    }
    public User getUser(Integer id) {
        return userService.getUser(id);
    }
}
  • 注意:当有多个构造方法的时候必须有@Autowired 来明确指定到底使用哪个构造方法,否则会报错


0bf66c15cb7e4f6189ade1a8ef08a937.png


Setter注入


Setter 注入和属性的 Setter 方法实现类似,只不过在设置 set 方法的时候需要加上 @Autowired 注解,如下面代码


Setter注入
Setter 注入和属性的 Setter 方法实现类似,只不过在设置 set 方法的时候需要加上 @Autowired 注解,如下面代码

三种注入方法比较


属性注入的优点是简洁,使用方便;缺点是只能用于 IoC 容器,如果是非 IoC 容器不可用,并且只有在使用的时候才会出现 NPE(空指针异常)。


构造方法注入是 Spring 推荐的注入方式,它的缺点是如果有多个注入会显得比较臃肿,但出现这种情况,你应该考虑一下当前类是否符合程序的单一职责的设计模式了,它的优点是通用性,在使用之前一定能把保证注入的类不为空。


Setter 方式是 Spring 前期版本推荐的注入方式,但通用性不如构造方法,所有 Spring 现版本已经推荐使用构造方法注入的方式来进行类注入了。


@Resource:另一种注入关键字


@Autowired 和 @Resource 的区别:


出身不同:@Autowired 来自于 Spring,而 @Resource 来自于 JDK 的注解;


使用时设置的参数不同:相比于 @Autowired 来说,@Resource 支持更多的参数设置,例如name 设置,根据名称获取 Bean。


@Autowired 可用于 Setter 注入、构造函数注入和属性注入, @Resource 不能用于构造函数入


多个 Bean 报错处理


①使用更精准的Bean名称


@Controller
    public class UserController5 {
    // 注入
    @Autowired
    private User user1;
    public User getUser() {
        return user;
    }
}

① 使用 @Resource(name="XXX")

@Controller
class UserController4 {
    // 注入
    @Resource(name = "user1")
    private User user;
    public User getUser() {
        return user;
    }
}

② 使用 @Qualifier

@Controller
    public class UserController5 {
    // 注入
    @Autowired
    @Qualifier(value = "user2")
    private User user;
    public User getUser() {
        return user;
    }
}


总结


1. 将对象存储到 Spring 中:


使用类注解:@Controller、@Service、@Repository、@Configuration、@Component【它们之间的关系】


使用方法注解:@Bean【注意事项:必须配合类注解一起使用】


2. Bean 的命名规则:


首字母和第二个字母都非大写,首字母小写来获取 Bean,如果首字母和第二个字母都是大写,那么直接使用原 Bean 名来获取 Bean。


3. 从 Spring 中获取对象:


属性注入


Setter 注入


构造函数注入(推荐)


4. 注入的关键字有:


@Autowired


@Resource


5. @Autowired 和 @Resource 区别:


出身不同;


使用时设置参数不同


@Resource 支持更多的参数,比如 name。


6. 解决同一类型多个 Bean 的报错:


使用 @Resource(name="")


使用 @Qualifier("")

相关文章
|
5月前
|
缓存 监控 Java
SpringBoot @Scheduled 注解详解
使用`@Scheduled`注解实现方法周期性执行,支持固定间隔、延迟或Cron表达式触发,基于Spring Task,适用于日志清理、数据同步等定时任务场景。需启用`@EnableScheduling`,注意线程阻塞与分布式重复问题,推荐结合`@Async`异步处理,提升任务调度效率。
877 128
|
4月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
565 2
|
5月前
|
Java 测试技术 数据库
使用Spring的@Retryable注解进行自动重试
在现代软件开发中,容错性和弹性至关重要。Spring框架提供的`@Retryable`注解为处理瞬时故障提供了一种声明式、可配置的重试机制,使开发者能够以简洁的方式增强应用的自我恢复能力。本文深入解析了`@Retryable`的使用方法及其参数配置,并结合`@Recover`实现失败回退策略,帮助构建更健壮、可靠的应用程序。
693 1
使用Spring的@Retryable注解进行自动重试
|
5月前
|
XML Java 数据格式
常用SpringBoot注解汇总与用法说明
这些注解的使用和组合是Spring Boot快速开发和微服务实现的基础,通过它们,可以有效地指导Spring容器进行类发现、自动装配、配置、代理和管理等核心功能。开发者应当根据项目实际需求,运用这些注解来优化代码结构和服务逻辑。
424 12
|
5月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
305 0
探索Spring Boot的@Conditional注解的上下文配置
|
5月前
|
智能设计 Java 测试技术
Spring中最大化@Lazy注解,实现资源高效利用
本文深入探讨了 Spring 框架中的 `@Lazy` 注解,介绍了其在资源管理和性能优化中的作用。通过延迟初始化 Bean,`@Lazy` 可显著提升应用启动速度,合理利用系统资源,并增强对 Bean 生命周期的控制。文章还分析了 `@Lazy` 的工作机制、使用场景、最佳实践以及常见陷阱与解决方案,帮助开发者更高效地构建可扩展、高性能的 Spring 应用程序。
235 0
Spring中最大化@Lazy注解,实现资源高效利用
|
5月前
|
Java 测试技术 编译器
@GrpcService使用注解在 Spring Boot 中开始使用 gRPC
本文介绍了如何在Spring Boot应用中集成gRPC框架,使用`@GrpcService`注解实现高效、可扩展的服务间通信。内容涵盖gRPC与Protocol Buffers的原理、环境配置、服务定义与实现、测试方法等,帮助开发者快速构建高性能的微服务系统。
1105 0
|
7月前
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
1186 0
|
8月前
|
人工智能 Java 测试技术
Spring Boot 集成 JUnit 单元测试
本文介绍了在Spring Boot中使用JUnit 5进行单元测试的常用方法与技巧,包括添加依赖、编写测试类、使用@SpringBootTest参数、自动装配测试模块(如JSON、MVC、WebFlux、JDBC等),以及@MockBean和@SpyBean的应用。内容实用,适合Java开发者参考学习。
960 0
|
4月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
473 3

热门文章

最新文章