Spring: 通过注解获取Bean对象

news2025/7/7 12:21:48

目录

一, 属性注入

属性注入的优点:

属性注入的缺点

二. Setter注入

Setter注入的优点:

Setter注入的缺点:

三, 构造方法注入 (主流方式)

构造方法注入的优点

构造方法注入的缺点

四, @Autowired与@Resource区别


获取Bean对象也叫对象注入(对象装配), 指把对象取出来放到某个类中

实现对象注入有三种方法:

1.属性注入:                将对象注入到某个类的一个属性当中。

2.构造方法注入:        通过构造方法来将对象注入到类中。

3.Setter注入:             通过 SetXXX 系列方法将对象注入到类中。

对象注入的常用注解有两个: 一个是 @Autowired ,另外一个是 @Resource   

一, 属性注入

文章的实体类:

package Spring.demo;
import java.time.LocalDateTime;

public class Article {
    String author;
    String text;
    LocalDateTime createTime;

    public void setAuthor(String author) {
        this.author = author;
    }

    public void setText(String text) {
        this.text = text;
    }

    public void setCreateTime(LocalDateTime createTime) {
        this.createTime = createTime;
    }
    
    @Override
    public String toString() {
        return "Article{" +
                "author='" + author + '\'' +
                ", text='" + text + '\'' +
                ", createTime=" + createTime +
                '}';
    }
}

设置两个层,Service接收前端传递的数据, 通过属性注入到Controller中,最后再App调用Controller

ArticleService类:

package Spring.demo;

import org.springframework.stereotype.Service;

import java.time.LocalDateTime;


@Service
public class ArticleService {

    public Article getArticle(){

        // 伪代码,假装这是从前端获取到的数据,实际开发不会这样写
        Article article = new Article();
        article.setAuthor("李大牛");
        article.setText("锄禾日当午,飞流直下三千尺");
        article.setCreateTime(LocalDateTime.now());
        return article;
    }

}

ArticleController类:

package Spring.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Controller;

import java.time.LocalDateTime;


@Controller
public class ArticleController {

    //  通过属性注入
    @Autowired
    private ArticleService articleService;

    public Article getArticle(){
        return articleService.getArticle();
    }

}

启动类获取Bean:

import Spring.demo.Article;
import Spring.demo.ArticleController;
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-config.xml");

        ArticleController articleController = context.getBean(ArticleController.class);

        System.out.println(articleController.getArticle().toString());

    }
}

这就是属性注入

然后在启动类就可以直接通过 articleController调用到toString方法

属性注入的优点:

实现简单,使用简单.  只需要在使用的变量前加上一个注解@Autowired 就可以在不new对象的情况下,直接获得注入的对象

属性注入的缺点

1.功能性问题:        无法注入不可变的对象(fina修饰的对象)

2.通用性问题:        只适用于IoC容器

3.违背单一设计原则:        更容易违背单一设计原则

功能性问题:

在Java语法规范中,要求final修饰的对象要么直接赋值,要么在构造方法中赋值

因此 当我们用属性注入来注入final对象时,就会报错

通用性问题: 

使用属性注入的方式只适用于IoC框架,,如果将这段代码移植到其他框架上,这段代码就失效了

违背单一设计原则: 

单一设计原则: 一个类或接口,只对应一种功能

因为属性注入的方式简单,因此容易被滥用,导致一些不必要的对象被注入,更容易违背单一设计原则

但在日常开发中,有时往往需要在 单一设计原则 与 性能 之间做出取舍,比如在某些前后端交互频繁的场景,将多个接口整合成一个接口,一次性发送数据,一次性接收数据,这样就可以有效减少网络连接的TCP请求次数,显著提升了性能,但这样就违背了单一设计原则,在后期的维护与升级上就会比较麻烦.

二. Setter注入

package Spring.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Controller;

import java.time.LocalDateTime;


@Controller
public class ArticleController {

    private ArticleService articleService;
    //  通过Setter注入  (把ArticleService对象注入给ArticleController)
    @Autowired
    public void setArticleService(ArticleService articleService){
        this.articleService = articleService;
    }

    public Article getArticle(){
        return articleService.getArticle();
    }

}

只需要修改这部分代码即可,在启动类运行,可以获取到Bean对象

Setter注入的优点:

通常Setter只set的一个属性,因此比较符合单一设计原则

Setter注入的缺点:

1.同样无法解决 final对象无法注入的问题

2.注入对象可被修改

Setter 注入提供了 setXXX 的方法,意味着你可以在任何时候、在任何地方,通过调用 setXXX 的方法来改变注入对象,所以 Setter 注入的问题是,被注入的对象可能随时被修改

三, 构造方法注入 (主流方式)

package Spring.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Controller;

import java.time.LocalDateTime;


@Controller
public class ArticleController {

    private ArticleService articleService;

    @Autowired
    public ArticleController(ArticleService articleService){
        this.articleService = articleService;
    }

    public Article getArticle(){
        return articleService.getArticle();
    }

}

这就是构造方法注入的写法,只改动了这一部分的代码

如果当前类中只存在一个构造方法时,@Autowired也可以省略

构造方法注入的优点

构造方法注入相比于前两种注入方法,它可以注入不可变对象,并且它只会执行一次,也不存在像 Setter 注入那样,被注入的对象随时被修改的情况,它的优点有以下 4 个:

  1. 可注入不可变对象;
  2. 注入对象不会被修改;
  3. 注入对象会被完全初始化;
  4. 通用性更好。

可注入不可变对象

注入对象不会被修改

构造方法注入不会像 Setter 注入那样,构造方法在对象创建时只会执行一次,因此它不存在注入对象被随时(调用)修改的情况。

注入对象会被完全初始化

因为依赖对象是在构造方法中执行的,而构造方法是在对象创建之初执行的,因此被注入的对象在使用之前,会被完全初始化,这也是构造方法注入的优点之一。

通用性更好

可以适用于任何环境,无论是 IoC框架 还是 非IoC框架

构造方法注入的缺点

1.没有属性注入简单

2.是构造方法注入,无法解决循环依赖的问题

四, @Autowired与@Resource区别

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

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

相关文章

阿里云starrocks监控告发至钉钉群

背景:新入职一家公司,现场没有对sr的进行监控,根据开发的需求编写了一个python脚本。 脚本逻辑:抓取sr的be/fe/routine load状态信息,判读是否触发告警,若满足告警条件,则发送告警信息到钉钉群…

C# GFPGAN 图像(人脸面部)修复

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms;namespace 图像修复 {pu…

小程序首页搭建

小程序首页搭建 1. Flex布局是什么?2. 容器的属性2.1 flex-direction属性2.2 flex-wrap属性2.3 flex-flow属性2.4 justify-content属性2.5 align-items属性2.6 align-content属性 二.首页布局搭建二.1moke模拟数据实现轮播图4.信息搭建 Flex弹性布局 1. Flex布局是…

iperf3交叉编译

简介 iperf3是一个用于执行网络吞吐量测量的命令行工具。它支持时序、缓冲区、协议(TCP,UDP,SCTP与IPv4和IPv6)有关的各种参数。对于每次测试,它都会详细的带宽报告,延迟抖动和数据包丢失。 如果是ubuntu系…

[ConvNet]卷积神经网络概念解析

在初步接触了深度学习以后,我们把目光投向对于一些图像的识别。 其实在d2l这本书中,我们接触过用深度神经网络去识别一个图像,并且对其进行一个分类操作,核心原理是将图像展开成一维tensor,然后作为特征进行检测。 其…

JAVA基础(JAVA SE)学习笔记(二)变量与运算符

前言 1. 学习视频: 尚硅谷Java零基础全套视频教程(宋红康2023版,java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 正文 第一阶段:Java基本语法 1. Java 语言概述 JAVA基础(JAVA SE)学习…

源码解析flink文件连接源TextInputFormat

背景: kafka的文件系统数据源可以支持精准一次的一致性,本文就从源码看下如何TextInputFormat如何支持状态的精准一致性 TextInputFormat源码解析 首先flink会把输入的文件进行切分,分成多个数据块的形式,每个数据源算子任务会被分配以读取…

【面试经典150 | 区间】插入区间

文章目录 Tag题目解读题目来源解题思路方法一:合并区间方法二:模拟 其他语言python3 写在最后 Tag 【模拟】【数组】 题目解读 给定一个含有多个无重叠区间的数组,并且数组已经按照区间开始值升序排序。在列表中插入一个新的区间&#xff0…

unity动画_UI动画案例 c#

首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 创建基础通用包 在场景上创建一个Cube 选中Cube 在Window下点击Animation拖拽至运行窗口 点击创建 保存后 这个操作是给Cube添加了一个组件 对Cube_添加一个Position动画 设置几个帧位置的坐标(x,y,z)值 点击运行测…

PHP 如何查看php函数源码

一、在git找到php对应的版本 找到对应的分支版本可以下载也可以在线直接查看 通过这个地址 https://github.com/php/php-src 二、下面已shuffle函数举例,版本为7.4 找到对应的版本进入 点击ext,这个文件夹里面是存放函数的目录 在文件夹里搜不到stu…

Linux使用rpm包安装mysql5.7

以前安装过mysql 前言:检查以前是否装有mysql rpm -qa|grep -i mysql安装了会显示:   bt-mysql57-5.7.31-1.el7.x86_64 停止mysql服务和删除之前安装的mysql rpm -e bt-mysql57-5.7.31-1.el7.x86_64查找并删除mysql相关目录 find / -name mysql/va…

react+ts手写cron表达式转换组件

前言 最近在写的一个分布式调度系统,后端同学需要让我传入cron表达式,给调度接口传参。我去了学习了解了cron表达式的用法,发现有3个通用的表达式刚好符合我们的需求: 需求 每天 xx 的时间: 0 11 20 * * ? 上面是…

jQuery+AJAX请求的统一封装

记录一下使用jQueryAJAX对http请求的统一封装 很久都没有使用jquery和ajax的组合了,这里记录一下jquery和ajax的组合简单封装 将来或许有机会重新启用这个组合 新建jquery.request.js;demo目录结构如下 const baseURL http://127.0.0.1:8116;// con…

4K壁纸小程序源码 全内容自动采集

全内容自动采集 4K壁纸小程序源码,带流量主。用的都是一个接口,不过这个不知是谁改的,成了LSP版,是真色啊,专搜小姐姐。 4K壁纸,静态壁纸,头像等都有保留,界面广告位很多&#xff0c…

List小练习,实现添加图书,并且有序遍历

SuppressWarnings({"all"})public static void main(String[] args) {List list new LinkedList(); // List list new Vector(); // List list new ArrayList();list.add(new Book1("红楼小梦",35.5,"曹雪芹"));list.add(new B…

算法-堆/归并排序-排序链表

算法-堆/归并排序-排序链表 1 题目概述 1.1 题目出处 https://leetcode.cn/problems/sort-list/description/?envTypestudy-plan-v2&envIdtop-interview-150 1.2 题目描述 2 优先级队列构建大顶堆 2.1 思路 优先级队列构建小顶堆链表所有元素放入小顶堆依次取出堆顶…

【Java 进阶篇】JavaScript BOM History 详解

当用户浏览网页时,可以使用JavaScript的BOM (Browser Object Model)中的History对象来访问浏览器的历史记录。这个对象允许您在不更改页面的情况下导航到不同的历史记录项,或者查看有关用户访问过的页面的信息。 在本篇博客中,我们将围绕Jav…

IIS7.0解析漏洞

IIS7.0解析漏洞 实验环境 windows server 2008 r2(x64) IIS 7 phpStudyIIS 2016版本 漏洞条件 1. php.ini里的cgi.cgi_pathinfo1 2. IIS7在Fast-CGI运行模式下 漏洞复现 先搭建IIS7 出现如下界面安装成功 安装phpstudy ,使用较老的版…

通过核密度分析工具建模,基于arcgis js api 4.27 加载gp服务

一、通过arcmap10.2建模,其中包含三个参数 注意input属性,选择数据类型为要素类: 二、建模之后,加载数据,执行模型,无错误的话,找到执行结果,进行发布gp服务 注意,发布g…

Vue3语法-双向绑定

点击加入精英计划可以加入 点击名字可以删除 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!-- vue.js --><script src"https://unpkg.com/vue3/dist/vue.glob…