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 = newClassPathXmlApplicationContext("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 = newClassPathXmlApplicationContext("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 = newClassPathXmlApplicationContext("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 = newClassPathXmlApplicationContext("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 = newClassPathXmlApplicationContext("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;@Overridepublic 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 = newClassPathXmlApplicationContext("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 {@Autowiredprivate UserService userService;public User getUser(){return userService.getUser();}
}
public class Test {public static void main(String[] args) {ApplicationContext context = newClassPathXmlApplicationContext("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;@Autowiredpublic 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;@Autowiredpublic 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.hqwc.cn/news/95583.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA打开一个项目时,idea左侧project模式下,不显示项目工程目录的解决方法

在IDEA打开一个一个已有的项目chapter3时,idea左侧project模式下,左侧也没有project按钮,如下问题截图:(ps:项目结构可以显示,但是src等目录不见) 在网上查了一些方法: 1、解决办法…

蓝队追踪者工具TrackAttacker,以及免杀马生成工具

蓝队追踪者工具TrackAttacker,以及免杀马生成工具。 做过防守的都知道大HW时的攻击IP量,那么对于这些攻击IP若一个个去溯源则显得效率低下,如果有个工具可以对这些IP做批量初筛是不是更好? 0x2 TrackAttacker获取 https://githu…

26 Linux高级篇-Linux面试题

26 Linux高级篇-Linux面试题 文章目录 26 Linux高级篇-Linux面试题1.分析日志t.txt(访问量),将各个ip地址截取,并统计出现次数,并按从大到小排序(腾讯)2.统计连接到服务器的各个ip情况,并按连接数从大到小排序(腾讯)3.如忘记了mys…

微服务之Nacos

1 版本说明 官网地址: https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E 1.1 2021.x 分支 适配 SpringBoot 2.4, Spring Cloud 2021.x 版本及以上的Spring Cloud Alibaba 版本如下表(最新版本用*标记&am…

PostgreSQL分区表

什么是分区表 数据库分区表将表数据分成更小的物理分片,以此提高性能、可用性、易管理性。分区表是关系型数据库中比较常见的对大表的优化方式,数据库管理系统一般都提供了分区管理,而业务可以直接访问分区表而不需要调整业务架构&#xff0c…

操作系统备考学习 day1 (1.1.1-1.3.1)

操作系统备考学习 day1 计算机系统概述操作系统的基本概念操作系统的概念、功能和目标操作系统的四个特征并发共享虚拟异步 操作系统的发展和分类操作系统的运行环境操作系统的运行机制 年初做了一个c的webserver 的项目,在学习过程中已经解除部分操作系统的知识&am…

list(介绍与实现)

目录 1. list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modififiers 1.2.6 list的迭代器失效 2. list的模拟实现 2.1 模拟实现list 2.2 list的反向迭代器 1.…

opencv的haarcascade_frontalface_default.xml等文件

文章目录 GitHub下载在安装好的OpenCV文件夹下寻找opencv-python中获取 GitHub下载 下载地址:https://github.com/opencv/opencv/tree/master/data/haarcascades 在安装好的OpenCV文件夹下寻找 路径如下: 你安装的opencv路径\OpenCV\opencv\build\et…

21.4 CSS 盒子模型

1. 边框样式 border-style属性: 指定元素的边框样式.常用属性值: - none: 无边框(默认值). - solid: 实线边框. - dotted: 点状边框. - dashed: 虚线边框. - double: 双线边框. - groove: 凹槽状边框. - ridge: 脊状边框. - inset: 内阴影边框. - outset: 外阴影边框.这些值可…

肖sir__linux详解__002(系统命令)

linux系统命令 1、df 查看磁盘使用情况 (1)df 查看磁盘使用情况(按kb单位显示) (2)df -h 按单位显示磁盘使用情况 2、top 实时查看动态进程 (1)top 详解: 第一行&…

27.CSS粒子特效

效果 源码 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Vanilla JS Particles</title><link rel="stylesheet" href="style.css"> </head> <body>…

Android studio实现水平进度条

原文 ProgressBar 用于显示某个耗时操作完成的百分比的组件称为进度条。ProgressBar默认产生圆形进度条。 实现效果图&#xff1a; MainActivity import android.os.Bundle; import android.view.View; import android.app.Activity; import android.widget.Button; import…