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 {@Testpublic 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;@Overridepublic 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 {@Overridepublic 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();}
}

测试程序:

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

运行结果:

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

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

相关文章

【pytorch深度学习】使用张量表征真实数据

使用张量表征真实数据 本文为书pytorch深度学习实战的一些学习笔记和扩展知识,涉及到的csv文件等在这里不会给出,但是我会尽量脱离这一些文件将书本想要表达的内容给展示出来。 文章目录 使用张量表征真实数据1. 加载图像文件2. 改变布局3. 加载目录下…

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

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

Vue3 + Naive-ui Data Table 分页页码显示不全

当使用naive-ui 表格并且使用分页组件的时候 需要增加 remote

C++使用线程池模拟异步事件处理机制

在C很多框架中都有异步事件处理机制,这导致我们在看源码时经常很疑惑,难以理解,而其中包含的编程套路可能是一些成熟的技术,只是我们不熟悉,比如WebRTC中类似于Qt的信号槽机制,线程事件处理, 或者使用系统异…

Sensor 点亮出图后,颜色偏红或者偏绿是为什么?

这是因为 sensor balck level 的值配置的不正确导致,black level 的值一般在效果参数的 calibration 参数里面。 在驱动调试阶段,我们一般都是复用其他已调试好的,sensor 的驱动文件及效果文件, 而不同 sensor 的 balck level 的…

【qemu逃逸】XCTF 华为高校挑战赛决赛-pipeline

前言 虚拟机用户名: root 无密码 设备逆向与漏洞分析 程序没有去符合, 还是比较简单. 实例结构体如下: 先总体说一下流程: encode 为 base64 编码函数, decode 为 base64 解码函数. 然后 encPipe 和 decPipe 分别存放编码数据和解码数据, 分别有四个: 其中 EncPipeLine 中…

网页推理游戏

目录 python challenge (0) (1) (2) The Riddle (1) (2) (3) (4) Nazo (1)…

【Spring】SpringBoot日志

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

【tgcalls】Instance接口的实例类的创建

tg 里有多个版本,因此设计了版本管理的map,每次可以选择一个版本进行实例创建这样,每个客户端就可以定制开发了。tg使用了c++20创建是要传递一个描述者,里面是上下文信息 G:\CDN\P2P-DEV\tdesktop-offical\Telegram\ThirdParty\tgcalls\tgcalls\Instance.cpp可以看到竟然是…

【数据结构】顺序表 | 详细讲解

在计算机中主要有两种基本的存储结构用于存放线性表:顺序存储结构和链式存储结构。本篇文章介绍采用顺序存储的结构实现线性表的存储。 顺序存储定义 线性表的顺序存储结构,指的是一段地址连续的存储单元依次存储链性表的数据元素。 线性表的&#xf…

单词规律问题

给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 示例1: 输入: pattern “abba”, s “dog cat cat d…

【Git】Git分支与标签掌握这些技巧让你成为合格的码农

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Git》。🎯🎯 &#x1f449…

vue Sts认证后直传图片到阿里云OSS

后端进行sts认证生成临时身份凭证,前端通过凭证直传图片等文件到OSS中 一 OSS配置 增加用户和角色,创建OSS bucket 1.1 添加用户 登录阿里云管理控制台,右侧头像,进入访问控制 点击左侧导航栏的身份管理的用户,点击…

MySQL的索引和复合索引

由于MySQL自动将主键加入到二级索引(自行建立的index)里,所以当select的是主键或二级索引就会很快,select *就会慢。因为有些列是没在索引里的 假设CA有1kw人咋整,那我这个索引只起了前一半作用。 所以用复合索引&am…

探索微信小程序框架的精华——高质量的优秀选择

目录 引言: 1. 框架性能 2. 开发者工具支持 3. 文档和社区支持 4. 扩展能力 5. 使用率和稳定性 结语: 引言: 微信小程序作为一种轻量级、高效便捷的应用形式,已经在移动应用领域占据了重要地位。而其中,选择一个…

【EI会议征稿】JPCS独立出版-第五届新材料与清洁能源国际学术会议(ICAMCE 2024)

JPCS独立出版-第五届新材料与清洁能源国际学术会议(ICAMCE 2024) 2024 5th International Conference on Advanced Material and Clean Energy 第五届新材料与清洁能源国际学术会议(ICAMCE 2024)将于2024年2月23-25日在中国▪长沙…

【论文阅读】多模态NeRF:Cross-Spectral Neural Radiance Fields

https://cvlab-unibo.github.io/xnerf-web intro 从不同的light spectrum sensitivity获取信息,同时需要obtain a unified Cross-Spectral scene representation – allowing for querying, for any single point, any of the information sensed across spectra。…

xcode SDK does not contain ‘libarclite‘

SDK does not contain libarclite at the path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a; try increasing the minimum deployment target解决方法 iOS13以上

macOS Sonoma 14.2beta2(23C5041e)发布(附黑白苹果镜像地址)

系统介绍 黑果魏叔11 月 10 日消息,今日向 Mac 电脑用户推送了 macOS 14.2 开发者预览版 Beta 2 更新(内部版本号:23C5041e),本次更新距离上次发布隔了 14 天。 macOS Sonoma 14.2 添加了 Music 收藏夹播放列表&…

“Git实践指南:深入探索开发测试上线、分支管理与标签“

文章目录 引言一、Git的分支的使用1.分支2.标签3.分支与标签的关系4. 分支在实际中的作用5. 四个环境以及各自的功能特点6. 分支策略分支应用场景 二、Git的标签3.1 标签的基本使用3.3 标签的共享与推送 总结 引言 在现代软件开发中,版本控制是一个关键的环节&…