使用Spring的五大类注解读取和存储Bean

news2024/11/15 17:38:27

目录

1.存储Bean对象的注解

1.1 五大类注解

1.2 方法注解

1.3添加注解的依赖

2.注解的使用

2.1  controller注解

2. 2Service注解

 2.3.Resopsitory注解

2.4Component注解

2.5Configuration注解

2.6 注解之间的关系

3.方法注解

3.1 方法注解要配合类注解来使用。

3.2 重命名Bean

4.获取Bean对象(对象装配)

4.1属性注⼊(常用)

4.2构造⽅法注⼊(推荐使用)

4.3Setter 注⼊

4.4三种注⼊优缺点分析

4.5 @Resource:另⼀种注⼊关键字

4.6 @Autowired 和 @Resource 区别

4.7 解决同⼀类型多个 Bean 的报错:


1.存储Bean对象的注解

两种:五大类注解和方法注解

1.1 五大类注解

@Controller :(控制器:验证用户(广义用户包括前端)请求的数据正确性)(类似于安保系统)

@Service :(服务:服务层,用来编排和调度具体执行方法的,(客服中心))

@Repository: (持久层:和数据库的交互;执行者) ==DAO层(Date Accsess Object)数据访问层

@Component :(组件:(工具类))

@Configuration :(配置项:项目当中的一些配置,存储项目当中的一些注解)

1.2 方法注解

@Bean

1.3添加注解的依赖

Spring设计理念:约定大于配置,小驼峰的形式

 在resources文件夹下创建spring.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 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.java.demo"></content:component-scan>
</beans>

2.注解的使用

1.添加spring依赖(pom.xml)

<dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.13</version>
        </dependency>
    </dependencies>

2.添加启动类

 

2.1  controller注解

package com.java.demo.controller;

import org.springframework.stereotype.Controller;

@Controller //将当前类存储到spring中
public class StudentController {
    public void sayHi(){
        System.out.println("do studentController sayHi()");
    }
}
import com.java.demo.controller.StudentController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
    public static void main(String[] args) {
        //1.得到Spring对象
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        //2.得到bean对象
        StudentController studentController =
                context.getBean("studentController",StudentController.class);
        //3.使用bean
        studentController.sayHi();
    }
}

注意: 

默认情况:原类名首字母小写就能读取到Bean对象;

特例:原类名如果首字母和第二字母都是大写的情况下,那么bean名称就是原类名;

2. 2Service注解

package com.java.demo.service;
import org.springframework.stereotype.Service;
@Service
public class StudentService {
    public void sayHi(){
        System.out.println("StudentService sayHi()");
    }
}
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
StudentService studentService =
                context.getBean("studentService",StudentService.class);
studentService.sayHi();

 2.3.Resopsitory注解

import org.springframework.stereotype.Repository;
@Repository
public class StudentRepository {
    public void sayhi(){
        System.out.println("StudentRepository sayhi");
    }
}
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");

StudentRepository studentRepository =
                context.getBean("studentRepository",StudentRepository.class);
studentRepository.sayhi();

2.4Component注解

import org.springframework.stereotype.Component;
@Component
public class StudentComponent {
    public void sayhi(){
        System.out.println("StudentComponent sayhi");
    }
}
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
StudentComponent studentComponent =
                context.getBean("studentComponent",StudentComponent.class);
studentComponent.sayhi();

2.5Configuration注解

import org.springframework.context.annotation.Configuration;
@Configuration
public class StudentConfiguration {
    public void sayhi(){
        System.out.println("StudentConfiguration sayhi");
    }
}

ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
StudentConfiguration studentConfiguration =
                context.getBean("studentConfiguration",StudentConfiguration.class);
studentConfiguration.sayhi();

2.6 注解之间的关系

 @Controller / @Service / @Repository / @Configuration 等注解的源码,他们属于@Component 的“⼦类”。

3.方法注解

类注解是添加到某个类上的,⽽⽅法注解是放到某个⽅法上的。

3.1 方法注解要配合类注解来使用。

在 Spring 框架的设计中,⽅法注解 @Bean 要配合类注解才能将对象正常的存储到 Spring 容器中,如下代码所示:
 

@Component
public class Users {
@Bean
public User user1() {
User user = new User();
user.setId(1);
user.setName("Java");
return user;
}
}

3.2 重命名Bean

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

@Component
public class Users {
@Bean(name = {"u1"})
public User user1() {
User user = new User();
user.setId(1);
user.setName("Java");
return user;
}
}

 name 其实是⼀个数组,⼀个 bean 可以有多个名字:

@Bean(name = {"u1", "us1"})
public User user1() {
User user = new User();
user.setId(1);
user.setName("Java");
return user;
}

问题:当@Bean使用了重命名之后,那么默认的方法名是否还能获取对象?
答案:不能,当给@Bean对象重命名之后,默认的使用方法名获取对象的方式就不能使用了。

4.获取Bean对象(对象装配)

获取对象装配的方法:

1. 属性注⼊
2. 构造⽅法注⼊
3. Setter 注⼊

4.1属性注⼊(常用)

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

优点:简单

缺点:

1.没办法实现final修饰的变量注入

2.兼容性不好:只适用于IoC容器

3.风险点:因为写法简单,所以违背单一设计原则的概论更大。

4.2构造⽅法注⼊(推荐使用)

构造方法注入(Spring官方推荐的注入方式),可以不加@Autowired。

特点:如果当前类中只有一个构造方法的话,那么@Autowired注解可以省略;
优点:
1.可以注入一个不可变的对象(使用了final修饰的对象);
2.注入的对象不会被修改(构造方法只能执行一次);
3.构造方法注入可以保证注入对象完全被初始化;
4.构造方法的兼容性(通用性)更好;

4.3Setter 注⼊


Setter 注⼊和属性的 Setter ⽅法实现类似,只不过在设置 set ⽅法的时候需要加上 @Autowired 注

优点:Setter注入非常符合单一设计原则(每个方法只传递一个对象)。
缺点:
1.没办法实现final修饰的变量注入
2.使用setter注入的对象,对象可能会被修改

示例代码:

package com.java.demo.controller;

import com.java.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

@Controller
public class UserController {
    //1.属性注入
    @Autowired  //注入对象
      @Resource
      private UserService userService;

    //2.Setter注入
      private UserService userService;
     @Autowired
     @Resource
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    //3.构造方法注入
    private final UserService userService;
    @Autowired
    //@Resource //不能用在构造方法上
    public UserController(UserService userService) {
        this.userService = userService;
    }

    public void sayHi(){
        System.out.println("com.java.demo -> do UserController sayHi()");

        userService.sayHi();
        userService.age = 20;
        userService.sayHi();
    }
}

4.4三种注⼊优缺点分析

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

4.5 @Resource:另⼀种注⼊关键字

@Autowired 和 @Resource 的区别
1.出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解;
2.使⽤时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如
name 设置,根据名称获取 Bean。
3.@Autowired 可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊,⽽ @Resource 只能⽤于 Setter 注
⼊和属性注⼊,不能⽤于构造函数注⼊。

解决同⼀类型多个 Bean 的报错:
a. 使⽤ @Resource(name="")
b. 使⽤ @Qualifier("")

4.6 @Autowired 和 @Resource 区别

1.出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解;
2.使⽤时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如
name 设置,根据名称获取 Bean。
3.@Autowired 可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊,⽽ @Resource 只能⽤于 Setter 注⼊和属性注⼊,不能⽤于构造函数注⼊
4.拓展区别:
在Spring(容器)中找Bean有两种方式:
1.根据类型查找
2.根据名称查找
@Autowired先根据类型查找(byType),之后再根据名称查找(byname)
 @Resource先根据名称查找(byname),之后再根据类型查找(byType)

4.7 解决同⼀类型多个 Bean 的报错:

a. 使⽤ @Resource(name="")重命名

b. 使⽤ @Autowired和@Qualifier("")进行重命名

package com.java.demo.controller;

import com.java.demo.entity.User;
import com.java.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

@Controller
public class UserController2 {
    //@Resource(name = "user1")
    //1.属性注入方式
    @Autowired
    @Qualifier(value = "user1")
    private User user;

    public void sayHi(){
        System.out.println("com.java.demo -> do UserController sayHi()");
        System.out.println(user.getUsername());
    }
}

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

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

相关文章

【Python】ddddoc进行OCR识别和目标检测 ——识别验证码和滑块(安装部署+测试代码注释详细)

目录 安装部署gitee已经上传完整项目requiremen.txt插件作者更新地址 项目结构第一部分 OCR识别部分第二部分 目标检测部分总结 欢迎关注 『Python』 系列&#xff0c;持续更新中 欢迎关注 『Python』 系列&#xff0c;持续更新中 安装部署 gitee已经上传完整项目 requiremen.…

图片对象列表查询与展示(vue+springboot+elementUI)

本文描述场景为 展示&#xff1a;后端从数据库中查询图片对象列表&#xff0c;返回前端展示 多图片展示 先看一下后端表实体 import com.zpmc.common.domain.BaseEntity; import io.swagger.annotations.ApiModel; import lombok.*;import javax.persistence.*; import java.…

8086汇编之乘法指令MUL

2023年4月22日&#xff0c;周六晚上。 今天写汇编作业的时候&#xff0c;碰到了MUL指令&#xff0c;于是把学习到的MUL指令知识记录下来&#xff0c;也可以通过写这篇博客彻底理清MUL指令。 当被乘数和乘数都是8位时&#xff1a; 怎么判断被乘数和乘数是不是8位的&#xff1f…

操作系统之认识进程

目录 什么是进程 进程的状态和转换 进程控制 进程通信 什么是进程 在电脑的任务管理器中&#xff0c;能看到电脑当前运行着的所有进程 那到底什么是进程呢&#xff1f;和我们所看所写的那些程序有什么区别&#xff1f; 操作系统是如何区分这些进程的呢&#xff1f; 那就需要…

银河麒麟(桌面版和服务器版)之远程桌面安装

一、前言 在信创方案中经常介绍支持麒麟系统&#xff0c;实际上麒麟分为银河麒麟和中标麒麟&#xff0c;银河麒麟又分为服务器版和桌面版&#xff0c;服务器器版一般用于应用系统部署&#xff0c;桌面版一般用于日常办公。银河麒麟操作系统作为国产操作系统&#xff0c;是目前国…

java定时任务schedule

在 Java中&#xff0c;可以使用定时任务&#xff08;schedule&#xff09;来实现定时任务。这种定时任务能够根据用户的需求进行时间的控制&#xff0c;让用户可以自由设定每一个任务的开始时间和结束时间。 下面来介绍如何使用 java中的定时任务来实现定时任务。 首先需要在配…

# 将pg日志导入pg数据库的几种方法

将pg日志导入pg数据库的几种方法 文章目录 将pg日志导入pg数据库的几种方法1 方法1&#xff1a;官方方法&#xff08;fiel_fdw&#xff09;1.1 创建file_fdw数据源&#xff08;在此之前需要安装pg的file_fdw扩展&#xff09;1.2 创建外部表并导入数据 2 方法2&#xff1a;用csv…

会议论文与期刊论文的写作差异

AI领域的会议论文和期刊论文在撰写方法上存在一定的差异&#xff0c;读者需要理解这些差异&#xff0c;才能做到有的放矢&#xff0c;提高论文的命中率。如果按照会议论文的风格来写期刊论文&#xff0c;或者按照期刊论文的风格来写会议论文&#xff0c;论文命中的概率将大大降…

服务(第十三篇)lvs(负载均衡器)+nginx(反向代理)+tomcat(后端服务器)+nfs共享

准备6台机器&#xff1a; 192.168.169.10 lvs负载均衡器 192.168.169.20、192.168.169.30 nginx反向代理 192.168.169.40&#xff08;tomcat多实例&#xff09;192.168.169.50&#xff08;tomcat&#xff09; 19.168.169.60&#xff08;nfs共享&#xff09; 实验没啥好说的…

新建项目提交到git指定仓库

新建的项目如何上传到git远程仓库&#xff1a; 1&#xff1a;首先进入需要上传的文件夹&#xff0c;鼠标右键点击Git Bash Here 2&#xff1a;输入git init&#xff0c;初始化git相关配置文件 git init3&#xff1a;输入git remote add origin 你的远程仓库地址&#xff0c;…

收废品小程序的推广策略与实践

随着互联网和移动设备的普及&#xff0c;各种小程序逐渐成为了人们生活中不可或缺的一部分。在这样的背景下&#xff0c;开发一个收废品小程序是一个具有巨大潜力的创意。本文将介绍如何开发一个收废品小程序&#xff0c;并分享一些推广策略和实践经验。 开发一个收废品小程序…

推荐好用的数据库软件sql studio

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言免费功能强大支持数据导入和导出和navicat功能相同 一、sql studio是什么&#xff1f;二、使用步骤1.下载软件2. window版本3.linux 版本配置方式3.如何使用sql…

论文浅尝 | 基于交互模态融合的多模态知识图谱补全

笔记整理&#xff1a;张溢驰&#xff0c;浙江大学硕士&#xff0c;研究方向为多模态知识图谱 链接&#xff1a;https://arxiv.org/abs/2303.10816 动机 多模态知识图谱补全需要将多种模态的信息&#xff08;如图像和文本&#xff09;融入到实体的结构表示中&#xff0c;以此来实…

OpenAI ChatGPT 能取代多少程序员的工作?导致失业吗?

阅读原文&#xff1a;https://bysocket.com/openai-chatgpt-vs-developer/ ChatGPT 能取代多少程序员的工作&#xff1f;导致我们程序员失业吗&#xff1f;这是一个很好的话题&#xff0c;我这里分享下&#xff1a; 一、ChatGPT 是什么&#xff1f;有什么作用 ChatGPT是一种…

操作系统课堂笔记

第一章概述 操作系统&#xff08;Operating System, OS&#xff09;是计算机系统中最重要的系统软件&#xff0c;它统一管理计算机系统的硬件资源与信息资源&#xff0c;控制与调度上层软件的执行并为其提供易于使用的接口。 1.1计算机系统 操作系统在计算机系统中的地位&…

Java学习-MySQL-索引

Java学习-MySQL-索引 索引分类 索引&#xff08;Index&#xff09;是帮助MySQL高效获取数据的数据结构。 1.主键索引&#xff08;Primary Key&#xff09;&#xff0c;唯一标识&#xff0c;不可重复&#xff0c;并且只能有一个字段可以作为主键。 2.唯一索引&#xff08;Uniq…

地热井监测控制系统解决方案

概述 地热井监测控制系统主要是对地热井采水和回灌进行流量、温度、水位&#xff08;压力&#xff09;等参数的实时监测&#xff0c;对地热站现场环境进行实时视频监控。地热井现场和取水井、回灌井安装监测装置&#xff0c;通过无线传输设备将数据实时传输至自然资源局已建中…

【Leetcode -141.环形链表 -2.两数相加】

Leetcode Leetcode -141.环形链表Leetcode -2.两数相加 Leetcode -141.环形链表 题目&#xff1a;给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给…

第二届易派客工业品展圆满落幕 3天超7万人次观展

4月15日&#xff0c;第二届易派客工业品展览会在苏州国际博览中心成功闭幕&#xff0c;展会期间共7.4万人次观展。展会以“绿色•智造•融通•赋能”为主题&#xff0c;为参展企业衔接供需、共享商机、共促发展提供平台&#xff0c;推动工业企业数字化转型、致力供应链优化升级…

AntdesignVue 局部全屏后Message、Select 、Modal、Date等组件不显示问题解决方案(最终版)

1、对this.$message.....这种的消息提示组件解决方案如下 在main.js中全局配置消息提示 //单独引用需修改的元素 import { message } from ant-design-vue message.config({maxCount: 1,getContainer:() > document.getElementById(showBigModal) || document.body //父组件…