Spring IoC注解式开发

2023.11.11

        注解的存在主要是为了简化XML的配置。Spring6倡导全注解开发

        负责声明Bean的注解,常见的包括四个:

  • @Component
  • @Controller
  • @Service
  • @Repository

        通过源码可以发现,@Controller、@Service、@Repository这三个注解都是@Component注解的别名。也就是说:这四个注解的功能都一样。用哪个都可以。

只是为了增强程序的可读性,建议:

  • 控制器类上使用:Controller
  • service类上使用:Service
  • dao类上使用:Repository

他们都是只有一个value属性。value属性用来指定bean的id,也就是bean的名字。

Spring注解的简单使用

配好相关环境之后,在Bean类上使用注解:

package spring;

import org.springframework.stereotype.Component;

@Component(value = "userBean")
public class User {
}

编写测试程序:

package test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import spring.User;

public class IocAnnotationTest {
    @Test
    public void testBeanComponent(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        User userBean = applicationContext.getBean("userBean", User.class);
        System.out.println(userBean);
    }
}

运行结果:

ps:如果注解的属性名是value,那么value是可以省略的。

ps:如果把value属性彻底去掉,spring会被Bean自动取名,并且默认名字是:Bean类名首字母小写。

负责注入的注解

        @Component @Controller @Service @Repository 这四个注解是用来声明Bean的,声明后这些Bean将被实例化。接下来看看如何给Bean的属性赋值。给Bean属性赋值需要用到这些注解:

  • @Value
  • @Autowired
  • @Qualifier
  • @Resource

@Value:

当属性的类型是简单类型时,可以使用@Value注解进行注入。

使用@Value注解修改bean代码:

package spring;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component(value = "userBean")
public class User {
    @Value("jay")
    private String name;
    @Value("23")
    private int age;

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

运行测试程序,结果如下:

        通过以上代码可以发现,我们并没有给属性提供setter方法,但仍然可以完成属性赋值。如果提供setter方法,并且在setter方法上添加@Value注解,也可以完成注入,这里就不测试了。为了简化代码,以后我们一般不提供setter方法,直接在属性上使用@Value注解完成属性赋值。

@Autowired与@Qualifier:

        @Autowired注解可以用来注入非简单类型。单独使用@Autowired注解,默认根据类型装配。(默认是byType)。

        通过源码得知,该注解可以标注在:构造方法上、方法上、形参上、属性上、注解上。

        该注解还有一个required属性,默认值是true,表示在注入的时候要求被注入的Bean必须是存在的,如果不存在则报错。

        @Autowired注解默认根据类型注入。如果要根据名称注入的话,需要配合@Qualifier注解一起使用。

@Resource

@Resource注解也可以完成非简单类型注入,它和@Autowired注解有什么区别?

  • @Resource注解是JDK扩展包中的,也就是说属于JDK的一部分。所以该注解是标准注解,更加具有通用性。(JSR-250标准中制定的注解类型。JSR是Java规范提案。)
  • @Autowired注解是Spring框架自己的。
  • @Resource注解默认根据名称装配byName,未指定name时,使用属性名作为name。通过name找不到的话会自动启动通过类型byType装配。
  • @Autowired注解默认根据类型装配byType,如果想根据名称装配,需要配合@Qualifier注解一起用。
  • @Resource注解用在属性上、setter方法上。
  • @Autowired注解用在属性上、setter方法上、构造方法上、构造方法参数上。

下面使用代码简单使用一下这个注解:

编写接口:

package dao;

public interface UserDao {
    void insert();
}

实现该接口的类:

package dao.impl;

import dao.UserDao;
import org.springframework.stereotype.Repository;

@Repository("userDaoImplForMysql")
public class UserDaoImplForMysql implements UserDao {
    @Override
    public void insert() {
        System.out.println("Mysql数据库正在插入数据");
    }
}

service类:

package service;

import dao.UserDao;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;

@Service("userService") //纳入容器管理
public class UserService {
    @Resource(name = "userDaoImplForMysql")
    private UserDao userDao;

    public void save(){
        userDao.insert();
    }
}

测试程序:

    @Test
    public void testResource(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        UserService userService = applicationContext.getBean("userService", UserService.class);
        userService.save();
    }

运行结果:

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

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

相关文章

开发模型(瀑布、螺旋、scrum) 和 测试模型(V、W)、增量和迭代、敏捷(思想)及敏捷开发 scrum

🧸欢迎来到dream_ready的博客,📜相信您对这篇博客也感兴趣o (ˉ▽ˉ;) 震惊!测试人员对BUG的全方位解析,测试的执行和BUG管理! 原来测试人员遇到BUG是这样返回给开发的!什么是BUG&am…

文件管理技巧:按文件容量大小分类,自动移动至目标文件夹的方法

按文件容量大小分类可以帮助快速识别和筛选出不同大小的文件。这样做有很多好处。首先,可以轻松地查找和访问特定大小的文件,提高工作效率。其次,通过将不同大小的文件分类,可以更好地了解和掌控文件的使用情况,避免存…

从windows iso文件中提取install.wim

1、首先从微软官方下载需要的windows镜像 https://www.microsoft.com/zh-cn/software-download/windows10/ 2、在下载的iso文件右键,打开压缩包,在sources文件夹下,应该就可以看到install.wim了。但似乎在最新的win10版本,微软采…

redis: 记录一次线上redis内存占用过大问题解决过程

引言 记录一次线上redis占用过大的排查过程,供后续参考 问题背景 测试同事突然反馈测试环境的web系统无法登陆,同时发现其他子系统也存在各类使用问题 排查过程 1、因为首先反馈的是测试环境系统无法登陆,于是首先去查看了登陆功能的报错…

jupyter notebook添加markdown目录

jupyternotebook添加markdown目录 1. 安装python包2. 安装JavaScript和CSS文件3. 启用扩展4. 设置markdown选项 1. 安装python包 官方安装 使用pip pip install jupyter_contrib_nbextensions # 或者 pip install https://github.com/ipython-contrib/jupyter_contrib_nbext…

【Spring】SpringBoot日志

SpringBoot日志 日志概述日志使用打印日志获取日志对象使用日志对象打印日志日志框架介绍门面模式SLF4J框架介绍(simple logging facade for java) 日志格式说明日志级别日志级别的分类日志级别的使用 日志配置配置日志级别日志持久化配置日志文件的路径和文件名配置日志文件的…

若依如何进行页面路由跳转,路由跳转时如何携带参数(超详细图文教程)

我们经常会有这样需求,当我们在一个页面时,想要跳转到另一个页面,但是跳转的同时还需要携带参数。那么这种情况在若依系统中该如何做呢,下面我们来说一下。 文章目录 问题提出:一、创建目标页面的路由(也就是图2的路由…

到底是什么是Python?语言的核心是什么?

文章目录 前言一、为什么提出python编程的核心是什么?二、Python需要REPL?三、Python的哪些部分需要被视为“Python”?四、需要多少兼容性才能有用?Python技术资源分享1、Python所有方向的学习路线2、学习软件3、精品书籍4、入门学…

msvcp140.dll丢失的解决方法win7系统,全面详细解析

在Windows 7系统中,msvcp140.dll是一个非常重要的动态链接库文件,它负责许多应用程序和系统的正常运行。然而,由于各种原因,msvcp140.dll文件可能会丢失或损坏,导致系统出现错误提示、程序无法启动等问题。本文将详细介…

QT 布局管理综合实例

通过一个实例基本布局管理,演示QHBoxLayout类、QVBoxLayout类及QGridLayout类效果 本实例共用到四个布局管理器,分别是 LeftLayout、RightLayout、BottomLayout和MainLayout。 在源文件“dialog.cpp”具体代码如下: 运行效果: Se…

《Swin Transformer: Hierarchical Vision Transformer using Shifted Windows》阅读笔记

论文标题 《Swin Transformer: Hierarchical Vision Transformer using Shifted Windows》 Swin 这个词貌似来自后面的 Shifted WindowsShifted Windows:移动窗口Hierarchical:分层 作者 微软亚洲研究院出品 初读 摘要 提出 Swin Transformer 可以…

【Gradle-12】分析so文件和依赖的关系

1、前言 在包大小的占比中,so文件的占比往往是最高的,动辄几兆的大小多一个都会把包大小的指标打爆。 而在各厂商要求对手机CPU ARM架构进行分包适配的情况下,你更需要知道哪些依赖是没有适配v7a/v8a的,这将影响你的APP在应用市场…

基于SSM的智能物业管理网站的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

Scrum Master 如何更好的支持PO?

在过去几年中,和许多Scrum Master交流时,我遇到一个令人担忧的模式。虽然我们有Scrum指南和其他补充资源,许多Scrum Master,特别是刚起步的Scrum Master们,还在日复一日的为如何帮助Product Owner而挣扎着。 以下是我…

C语言--有3个候选人,每个选民只能投票选一人,要求编一个统计选票的程序,先后输入被选人的名字,最后输出各人得票结果。

一.解体思路 设一个结构体数组,数组中包含3个元素; 每个元素中的信息应包括候选人的姓名和得票数;输入被选人的姓名,然后与数组元素中的“姓名”成员比较,如果相同,就给这个元素中的“得票数”成 员的值加1;输出所有元素的信息。 …

C++ RBTree 理论

目录 这个性质可以总结为 红黑树的最短最长路径 红黑树的路径范围 code 结构 搞颜色 类 插入 插入逻辑 新插入节点 思考:2. 检测新节点插入后,红黑树的性质是否造到破坏? 解决方法 变色 旋转变色 第三种情况,如果根…

聊天机器人框架Rasa资源整理

Rasa是一个主流的构建对话机器人的开源框架,它的优点是几乎覆盖了对话系统的所有功能,并且每个模块都有很好的可扩展性。参考文献收集了一些Rasa相关的开源项目和优质文章。 一.Rasa介绍 1.Rasa本地安装 直接Rasa本地安装一个不好的地方就是容易把本地…

使用电脑时提示msvcp140.dll丢失的5个解决方法

“计算机中msvcp140.dll丢失的5个解决方法”。在我们日常使用电脑的过程中,有时会遇到一些错误提示,其中之一就是“msvcp140.dll丢失”。那么,什么是msvcp140.dll呢?它的作用是什么?丢失它会对电脑产生什么影响呢&…

Docker快速入门

Docker是一个用来快速构建、运行和管理应用的工具。 Docker技术能够避免对服务器环境的依赖,减少复杂的部署流程,有了Docker以后,可以实现一键部署,项目的部署如丝般顺滑,大大减少了运维工作量。 即使你对Linux不熟…

36 Gateway网关 快速入门

3.Gateway服务网关 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式…