Spring 中存取 Bean 的相关注解

news2025/1/18 20:28:58

 

目录

 一、五大类注解

1、五大类注解存储Bean对象

1.1@Controller(控制器储存)

1.2@Service(服务存储)

1.3@Repository(仓库存储)

1.4@Component(组件存储)

1.5@Configuration(配置存储)

 2、五大类注解小结

2.1为什么要这么多类注解

2.2 五大类注解之间的关系 

二、方法注解

1.方法注解的存储

1.1 @Bean注解的使用

1.2 @Bean方法的重命名 

2.方法注解的获取

2.1 属性注入

2.2 Setter注入

2.3 构造方法注入

三、总结 

1.三种注⼊优缺点分析 

2.Resource和@Autowired的区别

 一、五大类注解

在Spring中,想要将Bean存储到Spring中,一共有两种注解类型可以实现:

一种是类注解,其包括@Controller,@Service,@Repository,@Component,@Configuration;

另一种则是方法注解,其仅有@Bean

1、五大类注解存储Bean对象

1.1@Controller(控制器储存)

使⽤ @Controller 存储 bean 的代码如下所示:

package com.java.demo;
import org.springframework.stereotype.Controller;

@Controller
public class User {
    public void sayHi(){
        System.out.println("hi User");
    }
}

我们再在启动类中,简单读取一下存入的对象

import com.java.demo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {

    public static void main(String[] args) {
        ApplicationContext context = new
                ClassPathXmlApplicationContext("srping-config.xml");
        User user = context.getBean("user", User.class);
        user.sayHi();
    }
}

运行结果如下: 

1.2@Service(服务存储)

使⽤ @Service 存储 Bean 的代码如下所示:

@Service
public class UserService {

    public int add(){
        System.out.println("hi UserService add");
    }
}

 读取 bean 的代码:

public class Test {

    public static void main(String[] args) {
        ApplicationContext context = new
                ClassPathXmlApplicationContext("spring-config.xml");
        UserService userService =
                context.getBean("userService", UserService.class);
        userService.add();
    }
}

 运行结果如下:

1.3@Repository(仓库存储)

使用@Repository存储Bean的代码如下:

@Repository
public class UserRepository {
    public void add(){
        System.out.println("hi UserRepository add");
    }
}

 读取Bean的代码:

public class Test {

    public static void main(String[] args) {
        ApplicationContext context = new
                ClassPathXmlApplicationContext("spring-config.xml");
        UserRepository userRepository =
                context.getBean("userRepository", UserRepository.class);
        userRepository.add();
    }
}

 运行结果如下:

1.4@Component(组件存储)

使用@Component组件存储Bean的代码如下:

@Component
public class UserComponent {
    public void add(){
        System.out.println("Hi UserComponent add");
    }
}

 读取Bean的代码:

public class Test {

    public static void main(String[] args) {
        ApplicationContext context = new
                ClassPathXmlApplicationContext("spring-config.xml");
        UserComponent userComponent =
                context.getBean("userComponent", UserComponent.class);
        userComponent.add();
    }
}

运行结果如下:

1.5@Configuration(配置存储)

使用@Configuration存储Bean的代码如下:

@Configurable
public class UserConfiguration {
    public void add(){
        System.out.println("Hi Configuration add");
    }
}

  读取Bean的代码:

public class Test {

    public static void main(String[] args) {
        ApplicationContext context = new
                ClassPathXmlApplicationContext("spring-config.xml");
        UserConfiguration userConfiguration =
                context.getBean("userConfiguration", UserConfiguration.class);
        userConfiguration.add();
    }
}

运行结果如下:

 2、五大类注解小结

2.1为什么要这么多类注解

让代码的可读性更高,让程序员能直观的判断当前类的用途

Spring框架中有很多类注解,每个注解都有其特定的作用。这些注解使得开发人员能够更加方便地配置和管理应用程序。以下是其中一些注解的用途:

- @Component:用于将某个类标记为组件,方便自动扫描和注册为Bean。

- @Controller:用于标记控制器类,处理HTTP请求,并返回相应结果。

- @Service:用于标记服务类,对业务逻辑进行封装,通常被Controller层调用。

- @Repository:用于标记仓库类,封装对数据的访问和操作,通常被Service层调用。

- @Configuration:表明该类是Spring配置类,在其中定义Bean的创建和配置规则。

这些注解使得Spring框架变得更加灵活、可扩展、易用。开发人员可以根据需要选择合适的注解来达到自己的目的。

2.2 五大类注解之间的关系 

Spring框架中,常用注解可以归为五大类,分别是:

  1. @Component注解及其衍生注解:包括@Controller、@Service、@Repository等。这些注解用于在Spring容器中注册Bean。
  2. @Configuration注解及其衍生注解:包括@Bean注解。这些注解用于在Spring容器中声明和配置Bean。
  3. @Autowired注解及其衍生注解:包括@Qualifier、@Resource、@Inject等。这些注解用于进行Bean的自动注入。
  4. @Value注解及其衍生注解:包括@PropertySource、@ConfigurationProperties等。这些注解用于进行配置属性的注入和读取。
  5. @Transactional及其衍生注解:包括@Transactional、@TransactionalEventListener等。这些注解用于声明事务和监听事务事件。

这些注解之间的关系可以总结为:

  1. @Component及其衍生注解是用于定义Bean的注解,可通过自动扫描或手动配置的方式注册Bean。
  2. @Configuration及其衍生注解用于声明和配置Bean。
  3. @Autowired及其衍生注解用于进行Bean的自动注入,可以与@Component和@Configuration注解一起使用。
  4. @Value及其衍生注解用于进行配置属性的注入和读取。
  5.  @Transactional及其衍生注解用于声明事务和监听事务事件,通常用于@Service和@Repository注解的类。

 总的来说,这些注解是相互关联的,可以结合使用,达到更加灵活和高效的开发效果。 

二、方法注解

1.方法注解的存储

1.1 @Bean注解的使用

我们先创建一个用户类

public class User {

    public int Id;
    private String name;


    @Override
    public String toString() {
        return "User{" +
                "Id=" + Id +
                ", name='" + name + '\'' +
                '}';
    }

    public int getId() {
        return Id;
    }

    public void setId(int id) {
        Id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

与类注解不同,类注解是添加到某个类上的;而方法注解自然就是添加到某个方法上的

之后再创建一个方法类,我们要注意在定义方法Bean的时候也要定义五大类注解,因为@Bean要配合类注解才能将对象正常的存储到Spring容器中才能获取到

@Component
public class Users {

    @Bean()
    public User getUser(){
        User user = new User();
        user.setId(66);
        user.setName("竹筒子");
        return user;
    }
}
public class test {
    public static void main(String[] args) {
        ApplicationContext context = new
                ClassPathXmlApplicationContext("spring-config.xml");
        User user = (User) context.getBean("getUser");
        System.out.println(user.toString());
    }
}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

1.2 @Bean方法的重命名 

可以通过设置 name 属性给 Bean 对象进⾏重命名操作,如下图所示:

Bean命名规则,当没有设置name属性时,那么bean默认的名称就是方法名,当设置了name属性后,只能通过重命名的name属性对应的值获取,也就是说重命名后,再使用方法名就获取不到Bean对象了. 此外要注意Bean name是区分大小写的

2.方法注解的获取

在Spring中获取Bean对象也叫做对象装配或者对象注入

从Spring中获取Bean对象的实现方法有以下三种:

属性注入,Setter方法注入,以及构造方法注入

2.1 属性注入

属性注⼊是使⽤ @Autowired 实现的,将 Service 类注⼊到 Controller 类中。
Service 类的实现代码如下:


@Controller
public class UserController {

    @Autowired
    private UserService userService;
    public User getUser(){
        return userService.getUser();
    }
}
public class Test {

    public static void main(String[] args) {
        ApplicationContext context = new
                ClassPathXmlApplicationContext("spring-config.xml");
        UserController userController=
                context.getBean("userController", UserController.class);
        userController.Hi();
    }
}

属性注入的优缺点:

属性注入的优点在于,足够的简单以及简洁

缺点在于只能用于IOC容器同时无法注入被final修饰的对象,而且较容易违背单一性原则

2.2 Setter注入

Setter注入的实现也需要依赖@Autowired进行实现,不过其主要针对setter方法进行

@Controller
public class UserController {


    private UserService userService;
    
    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    public User getUser(){
        return userService.getUser();
    }
}

Setter注入的优缺点:

Setter注入的优点在于,其较不容易违背单一性原则

缺点在于,不如属性注入来的简介,同时无法注入被final修饰的对象

2.3 构造方法注入

与前面类似,构造方法注入从名字上看,其实就是在构造器上添加@Autowired注解

 
@Controller
public class StuController {
    private Stu stu;
 
    @Autowired
    public StuController(Stu stu) {
        this.stu = stu;
    }
 
    public void sayHi(){
        System.out.println(stu);
    }
}

由于构造器注入是比较后面出的,其实它也有一定的智能性:当我们只存在一个构造器的时候,我们可以选择不添加@Autowired,但是当有多个构造器的时候我们必须手动添加@Autowired来指定构造器来进行注入 

构造方法注入优缺点:

优点:构造器是Spring推荐的注入方式,同时构造器注入的通用性较强,能够注入被final修饰的对象

缺点在于不如属性注入来的简介及方便

三、总结 

1.三种注⼊优缺点分析 

  • 属性注⼊的优点是简洁,使⽤⽅便;缺点是只能⽤于 IoC 容器,如果是⾮ IoC 容器不可⽤,并且只有在使⽤的时候才会出现 NPE(空指针异常)
  • Setter ⽅式是 Spring 前期版本推荐的注⼊⽅式,但通⽤性不如构造⽅法,所有 Spring 现版本已经推荐使⽤构造⽅法注⼊的⽅式来进⾏类注⼊了
  • 构造⽅法注⼊是 Spring 推荐的注⼊⽅式,它的缺点是如果有多个注⼊会显得⽐较臃肿,但出现这种情况你应该考虑⼀下当前类是否符合程序的单⼀职责的设计模式了,它的优点是通⽤性,官方推荐,在使⽤之前⼀定能把保证注⼊的类不为空

2.Resource和@Autowired的区别

当我们在进行类注入的时候,除了使用@Autowired的时候,我们也可以使用@Resource进行注入

@Resource的用法与@Autowired相同

  1.  @Autowired来自Spring,而@Resource来自JDK的注解
  2. @Resource支持更多的参数设置,可以添加name设置来根据名称获取Bean
  3. @Resource不能用于构造函数注入

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/967244.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序编辑器代码格式缩进设置

第一步点击这个编辑器设置: 然后设置tab为空格,并且设置占几个空格,这里是4个空格。 这样就好了,文件保存就会自动设置好缩进格式了。

【Day-27慢就是快】代码随想录-二叉树-二叉树的最小深度

给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明: 叶子节点是指没有子节点的节点。 —————————————————————————————————— 1. 递归法 确定单层递归的逻辑: 与最…

3D 碰撞检测

推荐:使用 NSDT场景编辑器快速搭建3D应用场景 轴对齐边界框 与 2D 碰撞检测一样,轴对齐边界框 (AABB) 是确定两个游戏实体是否重叠的最快算法。这包括将游戏实体包装在一个非旋转(因此轴对齐)的框中&#…

可扩展的Blender插件开发汇总

成熟的 Blender 3D 插件是令人惊奇的事情。作为 Python 和 Blender 的新手,我经常发现自己被社区中的人们创造的强大的东西弄得目瞪口呆。坦率地说,其中一些包看起来有点神奇,当自我怀疑或冒名顶替综合症的唠叨声音被打破时,很容易想到“如果有人能做出可以做xxx的东西就好…

【数据分享】2012-2022年中国范围的逐年NPP/VIIRS夜间灯光数据(无需转发\免费获取)

在之前的文章中我们分享了2012-2022年全球范围逐年NPP/VIIRS夜间灯光数据(可查看之前的文章获悉详情)!很多小伙伴在拿到数据后,反映数据太大了,有413G,下载非常不方便!这个数据的范围是全球的&a…

七、Linux中一些符号的含义和宿主目录的介绍

1、Linux中一些符号的含义 在Linux命令行中,会看到如下一些符号,含义如下。 符号含义. 代表当前目录..代表上一层目录,当前目录的父目录-代表前一个目录,刚才从哪个目录cd过来~代表当前用户的宿主目录/代表根目录$普通用户的命…

已解决module ‘pip‘ has no attribute ‘pep425tags‘报错问题(如何正确查看pip版本、支持、32位、64位方法汇总)

本文摘要:本文已解决module ‘pip‘ has no attribute ‘pep425tags‘的相关报错问题,并总结提出了几种可用解决方案。同时结合人工智能GPT排除可能得隐患及错误。并且最后说明了如何正确查看pip版本、支持、32位、64位方法汇总 😎 作者介绍&…

elasticSearch+kibana+logstash+filebeat集群改成https认证

文章目录 一、生成相关证书二、配置elasticSearh三、配置kibana四、配置logstash五、配置filebeat六、连接https es的java api 一、生成相关证书 ps:主节点操作 切换用户:su es 进入目录:cd /home/es/elasticsearch-7.6.2 创建文件&#x…

【狂神】MyBatis(第一个Mybatis程序)

今天学了一点大概,但大概只是整个mybatis学习的1/10,我之所以想要重学一遍的原因是,我忘了。哈哈哈,但是以现在的角度去学习,我会更能够理解它的底层知识。希望这篇文章能够帮助你更好的入门。 趁着年轻多多投资自己的…

Android学习之路(12) setContentView详解

一、简介 setContentView我们在Activity中经常见到,它的作用就是把我们的布局文件放在Activity中显示,下面我们根据源码分析setContentView是如何做到的 二、源码分析 1.两种setContentView 注意Activity的setContentView和AppCompatActivity的setCo…

云端笔记系统-自动化测试

文章目录 1. 思维导图编写 Web 自动化测试用例2. 创建测试项目3. 根据思维导图设计【云端笔记】自动化测试用例3.1. 准备工具类3.2. 测试注册页面3.3. 测试登陆页面3.4. 测试添加博客页3.5. 测试我的博客列表页3.6. 测试修改博客页3.7. 测试博客列表页3.8. 测试博客详情页3.9. …

IIS perl python cbrother php脚本语言配置及简单测试样例程序

上篇笔记写了 IIS 配置 CGI, IIS CGI配置和CGI程序FreeBasic, VB6, VC 简单样例_Mongnewer的博客-CSDN博客 这篇在IIS上配置一些脚本语言。为了操作方便,每种语言在站点下分设文件夹。 1. IIS perl配置 Perl CGI方式是曾经流行的做法。先下载一个开源…

[管理与领导-65]:IT基层管理者 - 辅助技能 - 4- 职业发展规划 - 乌卡时代(VUCA )

前言: 大多数IT人,很勤奋,但都没有职业规划,被工作驱动着前行,然而,作为管理者,你就不能没有职业规划思维,因为你代表一个团队,你的思维决定了一个团队的思维。本文探讨…

【强化学习】贝尔曼公式 - bellman equation

return作用 还是用这个迷宫游戏说。 首先明确,不撞墙到终点比撞墙到终点好。路径越短到终点越好。 不撞墙到终点比撞墙到终点好。你可以把撞墙这个reward设置成负数,不撞墙设置成0。那么在最终return进行累加的时候,不撞墙的return就会大。路…

生信分析Python实战练习 4 | 视频22

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在:https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

打包个七夕exe玩玩

前段时间七夕 当别的哥们都在酒店不要不要的时候 身为程序员的我 还在单位群收到收到 正好后来看到大佬些的这个 https://www.52pojie.cn/thread-1823963-1-1.html 这个贱 我必须要犯,可是我也不能直接给他装个python吧 多麻烦 就这几个弹窗 好low 加上bgm 再打包成…

雪花算法生成id分析与实践

目录 1 什么是雪花算法? 结构 优点 缺点 2 在java中使用 使用注意: 测试代码 效果 1 什么是雪花算法? witter的雪花算法(Snowflake Algorithm)。雪花ID是一种分布式唯一ID生成算法,旨在解决分布式…

【C++历险记】面向对象|菱形继承及菱形虚拟继承

个人主页:兜里有颗棉花糖💪 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【C之路】💌 本专栏旨在记录C的学习路线,望对大家有所帮助🙇‍ 希望我们一起努力、成长&…

《多线程编程实战指南》总结

Java 并发和多线程编程推荐《Java 并发编程实战》和《多线程编程实战指南》,前者是外国非常受欢迎的书籍的翻译本,后者是国人写的书,符合国人的思维模式。 进程、线程与任务 在操作系统中会运行多个程序,一个运行中的程序就是一个…

msvcp120.dll丢失的解决方法?全面解决方法推荐

msvcp120.dll是Windows操作系统中的一个关键组件,如果丢失或损坏,可能会导致系统崩溃或无法正常运行。本文将介绍三种解决msvcp120.dll丢失问题的方法。 随着计算机应用的广泛普及,越来越多的人开始遇到各种电脑问题。其中,msvcp…