Spring五大类注解和方法注解

news2025/2/12 3:45:44

  • 1.配置(重要)
  • 2.添加五大类注解
    • 2.1 @Controller(控制器存储)
    • 2.2 @Service(服务存储)
    • 2.3 @repository(仓库存储)
    • 2.4 @Component(组件存储)
    • 2.5 @Configuration(配置存储)
  • 3.为什么需要这么多注解呢?
  • 4.Bean命名规则
  • 5.方法注解 @Bean
    • 5.1 重命名Bean

1.配置(重要)

想要将对象成功的存储到Spring容器中,需要配置一下存储对象的扫描包路径,只有被配置的包下的所有类,添加了注解才能被正确的识别并存储到Spring容器中。

在配置文件中添加如下配置(spring-config.xml):

<?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 htt

p://www.springframework.org/schema/beans/spring-beans.xsd http://www.spring

framework.org/schema/context https://www.springframework.org/schema/contex

t/spring-context.xsd">

    <content:component-scan base-package="com.spring.demo"></content:component-scan>


</beans>

<content:component-scan base-package="com.spring.demo"></content:component-scan> 的base-package里填写的路径就是需要扫描的包路径。如果添加的注解不在这个扫描的包路径下,那么也是不能存储到spring中的。也就是说下面使用的五大类注解和方法注解只有在这个路径下才能正确使用

2.添加五大类注解

将对象存储到Spring容器中,共分为两种注解:

​ 1.五大类注解:

​ @Controller:表示的是业务逻辑层

​ @Service:服务层

​ @Repository:持久层

​ @Component:组件

​ @Configuration:配置层

​ 2.方法注解:@Bean(需要配合类注解一起使用)。

2.1 @Controller(控制器存储)

@Controller:用来验证用户请求的正确性。

使用@Controller存储Bean的代码如下所示:

@Controller // 将对象存储到Spring容器中
public class UserController {
    public void sayHi(){
        System.out.println("do UserController");
    }
}

此时我们在启动类中获取Bean对象

public class App {
    //1.得到Spring容器
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        //2.得到Bean对象
        UserController userController = context.getBean("userController",UserController.class);
       //3.使用Bean方法
        userController.sayHi();
    }
}

在这里插入图片描述

注意:之前名称写的bean标签里的id,此时使用注解方法将Bean存储到Spring中,那么在getBean时,填写名称分两种形式:

1.如果类名第一个字母是大写,bean名称为类名第一个字母小写,后面照抄;

2.类名第一个字母和第二个字母如果都是大写时,bean名称为原类名。

2.2 @Service(服务存储)

@Service:调度具体执行方法。

@Service 
public class UserService {
    public void sayHi(){
        System.out.println("do UserService");
    }
}

获取Bean代码

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

2.3 @repository(仓库存储)

@repository:数据持久层;直接和数据库进行交互的。一张表对应一个@repository。

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

获取Bean代码

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

2.4 @Component(组件存储)

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

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

获取Bean代码:

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

    }
    }

2.5 @Configuration(配置存储)

@Configuration:放项目中的一些配置

@Configuration
public class UserConfiguration {
    public void sayHi(){
        System.out.println("do UserConfiguration");
    }
}

获取Bean代码:

public class App {

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

3.为什么需要这么多注解呢?

​ 就是让程序猿在看见这些注解后能直接了解当前类的用途。程序的工程分层和调用流程如下:

在这里插入图片描述

JavaEE 标准分层:至少包含三层;

​ 1、 @Controller:控制层,验证前端参数是否合格,如果合格才会执行下面的代码。

2、@Service:服务层,服务的调度,调用接口,比如要调用几个Repository…

​ 3、@Repository:数据持久层/数据交互层。直接操作数据库的,一张表对应一个Repository。

4.Bean命名规则

通过上面示例,可以看出一般Bean使用的都是标准的大驼峰命名,而获取的时候类名首字母小写就可以得到bean。然而如果当我们首字母和第二个字母都是大写时,就不能正常读取bean了:

在这里插入图片描述

我们可以查询Spring关于Bean存储时命名的规则:

在Idea中搜索beanname关键字,找到如下
在这里插入图片描述
在这里插入图片描述

它使用的是JDK Introspector中的decapitalize方法,源码如下:

public static String decapitalize(String name) {
    if (name == null || name.length() == 0) {
        return name;
    }
    //如果第一个字母和第二个字母为大写,就是把原类名 作为bean名称
    if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&
                    Character.isUpperCase(name.charAt(0))){
        return name;
    }
    //否则就把首字母转为小写,作为bean名称
    char chars[] = name.toCharArray();
    chars[0] = Character.toLowerCase(chars[0]);
    return new String(chars);
}

所以对于上述报错代码,我们只要改为一下代码就可以成功运行了:
在这里插入图片描述

由于得出结论:

1.如果类名第一个字母是大写,bean名称为类名第一个字母小写,后面照抄;

2.类名第一个字母和第二个字母如果都是大写时,bean名称为原类名。

5.方法注解 @Bean

类注解是添加到某个类上的,而方法注解是放到某个方法上的,@Bean要搭配类注解一起使用,才能将对象存储到Spring容器中, 否则会报错.正确代码如下:

@Controller
public class Users {
    //把方法的返回对象存储到Spring中
    @Bean
    public User user1(){
        User user = new User();
        user.setId(1);
        user.setName("ZhangSan");
        return user;
    }
}}
}

user1方法必须要有返回值,@Bean是把当前方法的返回值存储到Spring中!

获取bean时使用的名称要与 方法名一致.

public class App {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        User user =(User) context.getBean("user1");
        System.out.println(user.toString());
    }
    }

运行结果如下:

在这里插入图片描述

5.1 重命名Bean

可以通过@Bean自带的name属性给Bean对象进行重命名操作,如下代码所示:

在这里插入图片描述

说明:这个重命名name是一个数组,可以使一个bean设置多个名字。格式:@Bean(name = {"u1", "us1"}) 或者省略name:@Bean({"u1", "us1"})

@Controller
public class Users {
    //把方法的返回对象存储到Spring中
    @Bean(name = "u1")//重命名为 u1 
    public User user1(){
        User user = new User();
        user.setId(1);
        user.setName("ZhangSan");
        return user;
    }
}

把原先的user1重命名为u1后,在获取bean时使用的名称就只能是u1了,原名不能再使用了,否则会报错:

在这里插入图片描述

此时我们使用u1就可以正常获取到User对象了,如下代码:

public class App {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        User user =(User) context.getBean("u1");//使用重命名获取
        System.out.println(user.toString());
    }
    }

运行结果:

在这里插入图片描述

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

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

相关文章

【Python】基础内容

简介 面向对象&#xff0c;解释型的编程语言使用缩进作为逻辑层次 运行效率较低 单行注释&#xff1a;以#开头&#xff1a;#注释内容多行注释&#xff1a;以一对三个双引号引起来的内容&#xff1a; “”“注释内容”“” 数据类型 type(被查看类型的数据)&#xff1a;查看…

KETTLE Driver class ‘org.gjt.mm.mysql.Driver‘ could not be found

kettle链接mysql&#xff1a;抛出异常 Driver class org.gjt.mm.mysql.Driver could not be found 这是因为你没有下载对应的mysql驱动程序包&#xff08;DRIVER.jar&#xff09;到你的kettle下&#xff1a; 1 查看你的mysql版本 C:\Users\22077>mysql --version mysql …

快速拼接字符串的新类StringJoiner~

初识StringJoiner类&#xff1a; StringJoiner 是 Java 8 新增的一个类&#xff0c;它不仅提供了一种快速、方便地将多个字符串拼接成一个字符串的方法&#xff0c;并且在拼接之时还可以指定分隔符、前缀和后缀&#xff0c;以及添加多个字符串&#xff0c;最终输出拼接后的字符…

9-基于stm32的MAX31865铂电阻PT100测温全套资料(原理图+教程+程序)

编号: 009 本项目可以通过PT100测温&#xff0c;测温范围为: -200~420C&#xff0c;采用1.8寸OLED显示该资料已经过实物验证&#xff0c;实物中是通过触发GPIO来测量当前的温度&#xff0c;程序注释非常详细&#xff0c;容易上手 经过实验验证&#xff0c;切实可行!配备详细代码…

p5.js 到底怎么设置背景图?

theme: smartblue 本文简介 点赞 关注 收藏 学会了 在 《p5.js 光速入门》 里我们学过加载图片元素&#xff0c;学过过背景色的用法&#xff0c;但当时没提到背景图要怎么使用。 本文就把背景图这部分内容补充完整&#xff0c;并且会提到在 p5.js 里使用背景图的一些注意点。…

森泰克sumtak控制器维修伺服驱动器维修SQ-12

日本森泰克sumtak控制器维修全系列型号。 控制器常见维修故障&#xff1a;短路&#xff0c;模块损坏&#xff0c;带不动负载&#xff0c;主轴准备未绪&#xff0c;驱动器未使能&#xff0c;编码器故障&#xff0c;主轴驱动模块故障&#xff0c;输出电压低&#xff0c;红色灯亮…

Java创建线程的四种方式和线程的生命周期(面试题彻底搞懂)

方式一&#xff1a;继承Thread类的方式&#xff1a; 创建一个继承于Thread类的子类 重写Thread类的run() --> 将此线程执行的操作声明在run()中 创建Thread类的子类的对象 通过此对象调用start()&#xff1a;①启动当前线程 ② 调用当前线程的run() 说明两个问题&#…

百度CDN配置TLS

概述 为了保障您互联网通信的安全性和数据完整性&#xff0c;百度智能云CDN提供TLS版本控制功能。您可以根据不同域名的需求&#xff0c;灵活地配置TLS协议版本。 TLS&#xff08;Transport Layer Security&#xff09;即安全传输层协议&#xff0c;在两个通信应用程序之间提…

关于Dockerfile的优化

如今各个公有镜像仓库中已经包含了成千上万的镜像文件&#xff0c;但并不是所有的镜像都是精简高效的。很多初学者刚开始都习惯使用FROM centos然后RUN 一堆yum install&#xff0c;这样还停留在虚拟机层面的使用&#xff0c;这样创建出来的镜像往往体积比较大。其实我们可以参…

Vmware 设置固定ip地址--桥接模式

前言&#xff1a; 若虚拟机没有设置固定ip地址&#xff0c;每次关机重启后都会更新ip地址。导致连接工具得跟着一起修改&#xff0c;每次修改很烦。 之前使用NAT模式&#xff0c;因为使用此模式后&#xff0c;每次打开网页都会转几秒钟后才会显示网页。所以才使用桥接模式&…

DP学习第一篇之爬楼梯

DP学习之爬楼梯 剑指 Offer II 088. 爬楼梯的最少成本 - 力扣&#xff08;LeetCode&#xff09; 1. 题目分析 可以从第0或者第1作为起始台阶、每次可以选择跳1或2步、到楼顶结束 2. 解题 a.解法一 状态表示 tips: 经验题目要求。以i位置为结尾&#xff0c;。。。 dp[i] :…

Frida技术:App逆向开发屠龙刀

Frida是一种基于JavaScript的动态分析工具,可以用于逆向开发、应用程序的安全测试、反欺诈技术等领域。Frida主要用于在已安装的应用程序上运行自己的JavaScript代码,从而进行动态分析、调试、修改等操作,能够绕过应用程序的安全措施,可以助力于对应用程序进行逆向分析。 …

OpenShift Virtualization - 从集群外部访问集群中的 VM(附视频)

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.12 的环境中验证 文章目录 方法1&#xff1a;通过 Service 的 NodePort 访问 VM方法2&#xff1a;通过外部 IP 访问 VM确认 OpenShift 集群环境为 Worker 节点添加 Linux Bridge创建使用 Li…

大文件上传功能在标签服务的简单应用和代码实现

各位看官大家好&#xff0c;今天给大家分享的又是一篇实战文章&#xff0c;希望大家能够喜欢。 目前「袋鼠云客户数据洞察平台」标签服务的群组按种类划分&#xff0c;可以分为三大类&#xff0c;分别是实时群组、动态群组以及静态群组。如果按创建方式划分则有两种&#xff0…

6.11 有名管道和无名管道

目录 进程间通讯介绍 System V IPC 无名管道 无名管道特点 无名管道创建-pipe 无名管道通信 无名管道-示例 有名管道特点 有名管道创建-mkfifo 有名管道读写-示例 进程间通讯介绍 无名管道&#xff08;pipe&#xff09; 有名管道 &#xff08;fifo&#xff09; 信号…

制造业供应商合作该如何协调?SRM供应商管理系统的出现改变一切

制造业是使用SRM系统频率最高的行业了&#xff0c;因为该行业需要与大量供应商合作和协调&#xff0c;以便及时获得所需的原材料和零件。同时&#xff0c;该行业生产周期长&#xff0c;需求通常较为稳定&#xff0c;需要稳定的供应链管理来确保生产效率和质量。因此&#xff0c…

写一个vscode支持vue文件跳转到定义的插件,又可以愉快地摸鱼了

1. 背景 vscode自身是支持vue文件组件跳转到定义的&#xff0c;但是支持的力度是非常弱的。我们在vue-cli的配置的下&#xff0c;可以写很多灵活的用法&#xff0c;这样可以提升我们的生产效率。但是正是这些灵活的写法&#xff0c;导致了vscode自身提供的功能无法支持跳转到文…

MySQL数据库语言二:DML、DQL

&#x1f618;作者简介&#xff1a;正在努力的99年打工人。 &#x1f44a;宣言&#xff1a;人生就是B&#xff08;birth&#xff09;和D&#xff08;death&#xff09;之间的C&#xff08;choise&#xff09;&#xff0c;做好每一个选择。 &#x1f64f;创作不易&#xff0c;动…

Linux---网络传输命令(ping、wget、curl)

1. ping命令 执行 ping 指令会使用 ICMP 传输协议&#xff0c;发出要求回应的信息&#xff0c;若远端主机的网络功能没有问题&#xff0c; 就会回应该信息&#xff0c;因而得知该主机运作正常。 语法&#xff1a;ping [参数] IP名或主机名 参数包括&#xff1a; 注意&#…

Jmeter实现Dubbo接口测试

目录 前言&#xff1a; 一、准备 二、编写我们的测试工程 三、Jmeter来测试这个工程 前言&#xff1a; JMeter可以用来测试Dubbo接口的性能和负载。Dubbo是阿里巴巴的高性能RPC框架&#xff0c;常用于分布式服务的调用。为了测试Dubbo接口&#xff0c;需要使用JMeter提供的…