Spring 中存取 Bean 的相关注解

 

目录

 一、五大类注解

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不能用于构造函数注入

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【App端】uni-app使用百度地图api和echarts省市地图下钻

目录 前言方案一:echarts百度地图获取百度地图AK安装echarts和引入百度地图api完整使用代码 方案二:echarts地图和柱状图变形动画实现思路完整使用代码 方案三:中国地图和各省市地图下钻实现思路完整使用代码 前言 近期的app项目中想加一个功…

常见路由跳转的几种方式

常见的路由跳转有以下四种&#xff1a; 1. <router-link to"跳转路径"> /* 不带参数 */ <router-link :to"{name:home}"> <router-link :to"{path:/home}"> // 更建议用name // router-link链接中&#xff0c;带/ 表示从根…

RT-Thread 原子操作

原子操作简介 原子操作&#xff08;Atomic operation&#xff09;是指一种不可分割的操作&#xff0c;要么完全执行成功&#xff0c;要么完全不执行。 原子操作的执行过程中不允许有任何中断&#xff0c;如果出现了中断&#xff0c;那么操作的结果就无法保证。 原子操作通常…

Docker从认识到实践再到底层原理(二-1)|容器技术发展史+虚拟化容器概念和简介

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

为什么要学习C++

操作系统历史 UINX操作系统诞生之初是用汇编语言编写的。随着UNIX的发展&#xff0c;汇编语言的开发效率成为一个瓶颈。寻找新的高效开发语言成为UNIX开发者需要解决的问题。当时BCPL语言成为了当时的选择之一。Ken Thomposn对BCPL进行简化得到了B语言。但是B语言不是直接生成…

无涯教程-Android - List fragments函数

框架的ListFragment的静态库支持版本&#xff0c;用于编写在Android 3.0之前的平台上运行的应用程序&#xff0c;在Android 3.0或更高版本上运行时,仍使用此实现。 List fragment 的基本实现是用于创建fragment中的项目列表 List in Fragments 示例 本示例将向您说明如何基于…

【GUI开发】用python爬YouTube博主信息,并开发成exe软件

文章目录 一、背景介绍二、代码讲解2.1 爬虫2.2 tkinter界面2.3 存日志 三、软件演示视频四、说明 一、背景介绍 你好&#xff0c;我是马哥python说&#xff0c;一名10年程序猿。 最近我用python开发了一个GUI桌面软件&#xff0c;目的是爬取相关YouTube博主的各种信息&#…

2.5 关系查询优化

这段话主要讨论了关系模型在数据库领域中的查询优化问题。以下是对这段文字的简要解释&#xff1a; 1. **关系模型的优缺点**&#xff1a;虽然关系模型有许多优点&#xff0c;但它也有一些缺点&#xff0c;最主要的缺点是查询效率。如果没有适当的优化&#xff0c;查询的速度可…

采用ROUANT 方法对 nex-gddp-cmip6 数据进行精度校正

专题一 CMIP6中的模式比较计划 1.1 GCM介绍全球气候模型&#xff08;Global Climate Model, GCM&#xff09;&#xff0c;也被称为全球环流模型或全球大气模型&#xff0c;是一种用于模拟地球的气候系统的数值模型。这种模型使用一系列的数学公式来描述气候系统的主要组成部分…

C++面试题(丝)-计算机网络部分(1)

目录 1计算机网络 53 简述epoll和select的区别&#xff0c;epoll为什么高效&#xff1f; 54 说说多路IO复用技术有哪些&#xff0c;区别是什么&#xff1f; 55 简述socket中select&#xff0c;epoll的使用场景和区别&#xff0c;epoll水平触发与边缘触发的区别&#xff1f;…

微服务--Gatway:网关

routes: - id:order_route(路由唯一 标识&#xff0c;路由到order) uri&#xff1a;http://localhost:8020 #需要转发的地址 #断言规则&#xff08;用于路由规则的匹配&#xff09; predicates: -path/order-serv/** -pathlb://order-service # lb: 使用nacos中的本地…

uni-app之android项目云打包

1&#xff0c;项目根目录&#xff0c;找到mainfest.json&#xff0c;如果appid是空的&#xff0c;需要生成一个appid 2&#xff0c;点击重新获取appid&#xff0c;这个时候需要登录&#xff0c;那就输入账号密码登录下 3&#xff0c;登陆后可以看到获取appid成功 4&#xff0c;…

python类

python是一种面向对象的变成语言。 python几乎所有的东西都是对象&#xff0c;包括对象和属性。 一.类的定义 python类的定义&#xff1a; class ClassName:pass: 实例&#xff1a; 注意&#xff1a; 类中的函数称为方法&#xff0c;有关于函数的一切适用于方法&…

(数字图像处理MATLAB+Python)第十一章图像描述与分析-第一节、二节:图像描述概述和特征点

文章目录 一&#xff1a;图像描述概述&#xff08;1&#xff09;图像描述&#xff08;2&#xff09;描述子 二&#xff1a;特征点&#xff08;1&#xff09;Moravec角点检测A&#xff1a;原理B&#xff1a;程序 &#xff08;2&#xff09;Harris角点检测A&#xff1a;原理B&…

Flutter小功能实现-咖啡店

1 导航栏实现 效果图&#xff1a; 1.Package google_nav_bar: ^5.0.6 使用文档&#xff1a; google_nav_bar | Flutter Package 2.Code //MyBottomNavBar class MyBottomNavBar extends StatelessWidget {void Function(int)? onTabChange;MyBottomNavBar({super.key, …

uniapp 支持图片放大

<view class"list" v-for"(item, index) in urls" :key"index"><image :src"item" click"viewImg(item, index)" disabled></image></view> js // 预览大图 viewImg(data, index) {uni.previewImag…

04. 函数和函数调用机制

1. 先学习/复习C语言的入门知识 1.1 C语言简介 C语言是一种通用的编程语言&#xff0c;于1972年由丹尼斯里奇&#xff08;Dennis Ritchie&#xff09;创建。C语言最初目的是为了开发UNIX操作系统&#xff0c;但由于其简洁的语法、快速的执行速度和可移植性&#xff0c;自此成…

3D 碰撞检测

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

计算机毕业设计 校园二手交易平台 Vue+SpringBoot+MySQL

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发、系统定制、远程技术指导。CSDN学院、蓝桥云课认证讲师&#xff0c;全栈领域优质创作者。 项目内容…

【C++入门】命名空间、缺省参数、函数重载、引用、内联函数

​&#x1f47b;内容专栏&#xff1a; C/C编程 &#x1f428;本文概括&#xff1a; C入门学习必备语法 &#x1f43c;本文作者&#xff1a; 阿四啊 &#x1f438;发布时间&#xff1a;2023.9.3 前言 C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加…