Spring-注解开发

一、引子

我们在前面向读者介绍了Spring的配置文件,可以在配置文件中声明Bean,把对象的创建权交给Spring容器,并且实际演示了如何配置一个经典的Bean——数据源的配置。经过实际的上手我们会发现:xml的配置显得有些繁重,于是更便捷的配置方式便应运而生了——注解开发。

二、快速使用
(1)在类上添加注解

Spring框架有4个原生注解用于声明需要放至于IoC容器中,分别是@Controller,@Service,@Repository,@Component。他们没有实际的区别,仅在于后续划分代码结构时,各个分层上一般使用不同的注解。

import com.bylearning.spring.dao.UserDao;
import org.springframework.stereotype.Repository;@Repository
public class UserDaoImpl implements UserDao {@Overridepublic void saveUser() {System.out.println("save successfully");}
}
(2)如何DI?

Spring框架也提供了3个原生注解:@Autowired,@Resource,@Qualifier。@Autowired是用于按照类型(byType)装配依赖对象。默认情况下,它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果想要使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。@Resource注解默认按照名称进行装配。名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。@Qualifier注解用于解决歧义性问题,当有多个相同类型的Bean时,可以使用该注解指定要注入的Bean。

总结来说,@Autowired主要用于按照类型装配依赖对象,可以结合@Qualifier注解使用;@Resource默认按照名称装配依赖对象,可以指定name属性进行配置;@Qualifier用于解决歧义性问题,指定要注入的Bean。

import com.bylearning.spring.dao.UserDao;
import com.bylearning.spring.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl implements UserService {@Autowired@Qualifier(value = "userDaoImpl")private UserDao userDao;@Overridepublic void saveUser() {userDao.saveUser();}
}
(3)配置包扫描路径
<?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:context="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"><context:component-scan base-package="com.bylearning.spring" />
</beans>
三、思考

 我们拥有了上面的3个注解后,似乎可以将大部分的xml配置转化为注解了,但是请读者思考有哪些情景依靠这3个注解无法注解化呢?下面给出了场景与对应的解决办法:

  • xml配置文件还保留着 -- @Configuration
  • 我们在引子中提到的数据源Bean注册 -- @Bean
  • 组件扫描  -- @ComponentScan
  • 数据源中引用的properties文件 -- @PropertySource
  • 导入的其它配置类 -- @Import

在以下例子中,主配置文件借助@Configuration注解将类声明为配置类,并用@ComponentScan注解对包进行扫描,将该包下的类(含有@Component等声明为Spring组件的注解)添加进IoC容器,借助@Import注解引入了另一个配置文件——数据源配置文件,在数据源配置文件中,利用@PropertySource注解引入了一个Properties文件,利用@Bean注解注册了一个Druid数据源。

主配置文件:
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;@Configuration
@ComponentScan("com.bylearning.spring")
@Import({DataSourceConfiguration.class})
public class SpringConfiguration {}
数据源配置文件:
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;import javax.sql.DataSource;@PropertySource("classpath:jdbc.properties")
public class DataSourceConfiguration {@Value("${jdbc.driver}")private String driver;@Value("${jdbc.url}")private String url;@Value("${jdbc.username}")private String username;@Value("${jdbc.password}")private String password;@Beanpublic DataSource getDataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName(driver);dataSource.setUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}}

掌握了这些注解后,可以大大减轻xml配置的繁重工作了。我们可以再回顾一下在引子中提到的Spring的配置开发(附链接),对比一下将更能发现注解开发的便捷性。

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

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

相关文章

redis-发布缓存

一.redis的发布订阅 什么 是发布和订阅 Redis 发布订阅 (pub/sub) 是一种消息通信模式&#xff1a;发送者 (pub) 发送消息&#xff0c;订阅者 (sub) 接收消息。 Redis 客户端可以订阅任意数量的频道。 Redis的发布和订阅 客户端订阅频道发布的消息 频道发布消息 订阅者就可…

研究性学习:社会关注的热点问题研究

1. 课题名称 社会关注的热点问题研究 2. 起止时间 起始时间:2024年1月25日 结束时间:2024年2月20日 3. 项目组成员 组长:刘明组员:赵丽、陈鑫校内指导教师:王老师校外指导教师:社会工作者李教授4. 组员分工情况 搜集整理资料: 刘明:负责搜集西安市健康上网问题的资…

第四篇【传奇开心果短博文系列】Python的OpenCV库技术点案例示例:机器学习

传奇开心短博文系列 系列短博文目录Python的OpenCV库技术点案例示例系列短博文 短博文目录一、项目目标二、OpenCV机器学习介绍三、OpenCV支持向量机示例代码四、OpenCV支持向量机示例代码扩展五、OpenCVK均值聚类示例代码六、OpenCVK均值聚类示例代码扩展七、OpenCV决策树示例…

编译PCL Qt程序

使用PCL的qt程序时&#xff0c;提示不是用QVTK编译的&#xff0c;所以需要在编译VTK时打开Qt的编译选项&#xff08;由于CMakeList比较复杂&#xff0c;使用CMakeGui进行配置&#xff0c;PCL同理&#xff09;&#xff0c;编译VTK完成后&#xff0c;编译PCL也需要配置Qt支持&…

异构计算/高性能计算算子库与软件栈

上交超算平台 openblas Armadillo LAPACK 清华大学翟季冬 http://pacman.cs.tsinghua.edu.cn/~zjd/ 澎峰科技 湖南大学李肯立

【前端web入门第一天】02 HTML图片标签 超链接标签

文章目录: 1.HTML图片标签 1.1 图像标签-基本使用1.2 图像标签-属性1.3 路径 1.3.1 相对路径 1.3.2 绝对路径 2.超链接标签 3.音频标签 4.视频标签 1.HTML图片标签 1.1 图像标签-基本使用 作用:在网页中插入图片。 <img src"图片的URL">src用于指定图像…

Python + Selenium —— 网页元素定位之Xpath定位!

前面讲的定位方式&#xff0c;都能够很方便的定位到网页元素。但是这些属性并非所有的网页元素都具备&#xff0c;可以这么说&#xff0c;绝大部分情况下都很难保证元素具备这些属性。 也就是很多时候需要使用其他的方式来定位&#xff0c;在 WebDriver 中提供了 Xpath 和 Css…

二叉树堆的应用实例分析:堆排序 | TOP-K问题

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构冒险记 ✅C语言进阶之路 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 文章目录 前言一、堆排序1.1 排序思想1.2 堆排序过程&#xff08;图解&#xff09;1.3 堆排序代…

Linux CentOS安装Subversion(SVN)(svn常用命令)

1、确保您具有root权限或具有sudo特权 2、打开终端并运行以下命令以更新系统软件包&#xff1a; sudo yum update 3、使用以下命令安装Subversion软件包&#xff1a; sudo yum install subversion 安装过程中&#xff0c;系统会提示您确认安装&#xff0c;按下"y&quo…

linux下手动下载安装Docker Compose

没想到docker装好之后&#xff0c;还得额外安装docker compose才能通过脚本启动docker镜像。 那就装吧&#xff0c;按照各种百度的&#xff0c;先运行以下语句 curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-uname -s-uname -m -o /usr…

IP数据云:实战网络安全的得力利器

在当今数字化时代&#xff0c;企业和个人面临着日益复杂和频繁的网络安全威胁。为了应对这些挑战&#xff0c;IP数据云作为一项全面的网络安全解决方案&#xff0c;已经在多个实际案例中展现了其卓越的能力。 1、识别并隔离异常行为 挑战&#xff1a;一家大型金融机构发现其内…

【服务器】服务器的管理口和网口

服务器通常会有两种不同类型的网络接口&#xff0c;即管理口&#xff08;Management Port&#xff09;和网口&#xff08;Ethernet Port&#xff09;&#xff0c;它们的作用和用途不同。 一、管理口 管理口通常是用于服务器管理的网络接口&#xff0c;也被称为外带网卡或带外接…

NumPy必知必会50例 | 13. 更复杂的数组操作:成为 NumPy 数组的魔法师

文章目录 13. 更复杂的数组操作&#xff1a;成为 NumPy 数组的魔法师数组排序&#xff1a;给混乱的数据一个顺序示例&#xff1a;简单排序 数组搜索&#xff1a;寻找隐藏的宝藏查找最大值和最小值的位置 NumPy 数组操作&#xff1a;无限可能 13. 更复杂的数组操作&#xff1a;成…

Github 不能访问,提示:port 22: Connection timed out

问题描述 github clone 代码出现错误&#xff1a; $ git clone gitgithub.com:Atlan4/Fnirsi1013D.git Cloning into Fnirsi1013D... ssh: connect to host github.com port 22: Connection timed out fatal: Could not read from remote repository.Please make sure you ha…

Unity 外观模式(实例详解)

文章目录 示例1&#xff1a;初始化游戏场景中的多个子系统示例2&#xff1a;管理音频播放示例3&#xff1a;场景加载流程示例4&#xff1a;UI管理器示例5&#xff1a;网络服务通信 在Unity中使用外观模式&#xff08;Facade&#xff09;时&#xff0c;主要目的是为了简化复杂子…

Webpack5 基本使用 - 1

Webpack 是什么 webpack 的核心目的是打包&#xff0c;即把源代码一个一个的 js 文件&#xff0c;打包汇总为一个总文件 bundle.js。 基本配置包括mode指定打包模式&#xff0c;entry指定打包入口&#xff0c;output指定打包输出目录。 另外&#xff0c;由于 webpack默认只能打…

6轴机器人运动正解-逆解控制【1】——三种控制位姿的方式

概览&#xff1a; 通过运动学正解控制机器人运动通过运动学逆解控制机器人运动一个简单的物体搬运&#xff08;沿轨迹运动&#xff09; 后续会陆续更新&#xff08;本例仅供学习交流用&#xff09; 一、6轴机器人 二、运动正解控制 通过修改各个轴的角度&#xff0c;实现末…

宠物互联网医院系统:数字化呵护你爱宠的新时代

宠物互联网医院系统正在为宠物主人提供一种前所未有的数字化健康护理体验。通过结合创新技术&#xff0c;这一系统旨在让宠物医疗变得更加便捷、智能和个性化。让我们深入探讨宠物互联网医院系统的技术核心&#xff0c;以及如何应用代码为你的爱宠提供最佳关怀。 1. 远程医疗…

linux clickhouse 安装

1、官网下载clickhouse安装包 下载地址&#xff0c; clickhouse分lts和stable版本&#xff0c;lts是长期版本&#xff0c;一般选择安装lts版本。 其中clickhouse-server是clickhouse服务&#xff0c;就是用来访问数据存储数据&#xff0c;clickhouse-client是用来通过命令访问数…

Java中的HTTPS通信

在Java中实现HTTPS通信&#xff0c;主要涉及到SSL/TLS协议的使用&#xff0c;用于提供数据传输的安全性。下面我们将深入探讨如何使用Java进行HTTPS通信。 一、基本概念 HTTPS&#xff0c;全称为Hypertext Transfer Protocol Secure&#xff0c;是HTTP的安全版本。它使用SSL/…