Spring纯注解开发

前言

Spring3.0引入了纯注解开发的模式,框架的诞生是为了简化开发,那注解开发就是简化再简化。Spring的特性在整合MyBatis方面体现的淋漓尽致哦

一.注解开发

以前跟老韩学习SE时他就说:
注解本质是一个继承了Annotation 的特殊接口,其具体实现类是Java 运行时生成的动态代理类。
在这里插入图片描述
而我们通过反射获取注解时,返回的是Java 运行时生成的动态代理对象$Proxy1。通过代理对象调用自定义注解(接口)的方法,会最终调用AnnotationInvocationHandler 的invoke 方法。该方法会从memberValues 这个Map 中索引出对应的值。而memberValues 的来源是Java 常量池。

二.注解定义Bean

注解开发前,配置Bean时是在xml里将class分别写在Bean标签里,然后起id,就像这样
<bean id="a" class="yu7daily.Dao.Daoimpl.A" />
注解开发后,配置Bean时首先将xml里的<Bean>标签删掉,然后在类上添加@Component注解即可

@Component("a")public class A implements AA {public void save() {System.out.println("book dao save ..." ); }}

在xml文件中来写一个扫描包的注解标签,对象就装进IOC容器里了
<context:component-scan base-package="yu7daily.Dao"/>
component-scan:component意为组件,scan意为扫描
包路径越多,扫描的范围越小速度越快·包路径越少,扫描的范围越大速度越慢
最后直接从容器获取对象

    public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");A aa = (A) ctx.getBean("a");bookService.save();}

这里要注意的是:由于接口无法创建对象,所以别把注解写在接口上!!
注解真是神奇啊,他和原先的xml里的Bean到底是什么关系呢?
在这里插入图片描述

三.衍生注解

对于@Component还有衍生的三个注解:
@Controller、@Service、@Repository
结合与MVC的模式分别起到了补充的作用,方便我们后期在编写类的时候能很好的区分出这个类是属于表现层、业务层还是数据层的类
在这里插入图片描述

四.纯注解开发模式(🏳️‍🌈)

顾名思义,纯注解的模式就是摒弃以前的配置操作,全部由注解来完成
@Configuration:类注解,设置该类为Spring配置类
@ComponentScan:类注解,设置Spring配置类扫描路径

1.写一个配置类,通过注解@Configuration来标注该类为配置类、@ComponentScan来配置包扫描
这样就替换掉了<context:component-scan base-package="yu7daily.Dao"/>

@Configuration
@ComponentScan("yu7daily")
public class Config {...}

然后类就被放进了Bean里,通过
ApplicationContext acct = new AnnotationConfigApplicationContext(Config.class);就可以得到Bean
一顿操作下来我们通过一个Java类替换掉了Spring的核心配置文件,完全告别了xml!
配置Bean作用域
我们知道,通过Bean造的对象默认都是单例的,如何造出非单例的Bean?
通过@Scope注解即可,属性值(默认singleton(单例),可选值prototype(非单例))

@Component("a")
@Scope("prototype")
public class A implements AA {public void save() {System.out.println("hello~");}
}

五.注解实现注入

Set注入的原理是通过set方法在容器内部将一个类设置到另一个类中,这也是比较常用的方法。那么在纯注解开发的模式下如何实现注入呢?

@Service
public class A implements AA { @Autowiredprivate B b;}

如上,通过在属性上添加注解@Autowired就实现了将B注入到A中

1.自动装配

在前面写配置文件的阶段autowire属性可以开启自动装配,通常使用按类型装配autowire="byType"
对于自动装配的理解在set注入的基础上配置文件写的更加简洁,因为在Service里写了set方法把Dao的对象搞到了Service里,所以在配置Bean的时候我们通过自动装配,在xml文件里实现了Service和Dao自动结合,不再需要去Service里通过property标签来指定相应的name-ref
自动装配基于反射设计创建对象并通过暴力反射为私有属性进行设值普通反射只能获取public修饰的内容,暴力反射除了获取public修饰的内容还可以获取private修改的内容,注解的模式就是体现形式的变式,自动装配本质还是没有变

2.按名称注入(🏳️‍🌈)

针对相同类型的Bean如果IOC中存在多个,那按照类型注入一定会出错,就像这样
在这里插入图片描述
我通过注解注入的方式,注入了两个AA的实现类到B中,然后通过B来调用AA接口下的save()方法讲道理应该输出“hello~A”,结果出现了NoUniqueBeanDefinitionException
在这里插入图片描述
可见按照类型注入还是存在弊端啊,如何解决?
我们可以通过按照名称注入的方式:
当根据类型在容器中找到多个bean,注入参数的属性名又和容器中bean的名称不一致,这个时候该如何解决,就需要使用到注解@Qualifier 来指定注入哪个名称的bean对象,在不修改其他条件下,就像这样

@Repository("b")
public class B implements BB {@Autowired@Qualifier("a") //注入指定的对象名称private AA aa;public void save() {aa.save();}
}

随着运行结果,输出了A的成员方法,说明注入成功!
在这里插入图片描述
值得注意的是:@Qualifier不能独立使用,必须和@Autowired一起使用!!!

3.简单数据注入

通过注解@value可以实现简单数据注入,以String类型数据为例

  @Repository("a")public class A implements AA {@Value("hello java")private String str;public void save() {
System.out.println(str); }}运行结果:hello

其实上述操作看起来有点多此一举,@value主要还是为了读取配置文件而服务的

4.读取properties配置文件

首先在配置类上写上注解@PropertySource用来指明读取目录下的哪个文件

@Configuration
@ComponentScan("yu7daily")
@PropertySource("test.properties")
public class SpringConfig { }

在相应的属性上配置@Value注解即可完成配置文件属性的读取
PS:配置文件内容——name=lanyangyang

  @Repository("a")public class A implements AA {@Value("${name}")private String str;public void save() {
System.out.println(str); }}运行结果:lanyangyang

其实读取配置文件连接数据库也是这套操作

六.Spring整合MyBatis

在配置好MyBatis的基础上(不熟悉的可以去看一下以前写的MyBatis文章),Spring的整合工作就变的非常简单,主要工作就是管理MyBatis中的SqlSessionFactory和Mapper接口的扫描
1.首先导入两个整合需要的的jar包:
<artifactId>spring-jdbc</artifactId>13<artifactId>mybatis-spring</artifactId>
2.配置数据源对象
在这里插入图片描述
2.创建主配置类

@Configuration
@ComponentScan("yu7daily")
@PropertySource("classpath:jdbc.properties")
4@Import({JdbcConfig.class,MybatisConfig.class})
public class SpringConfig {...}

3.创建MyBatis配置类并获得SqlSessionFactory对象
在这里插入图片描述
4.最后在主函数中得到对应的Bean即可进行对数据层的操作

        ApplicationContext ACC = new AnnotationConfigApplicationContext(SpringConfig.class);AccountService acc = ACC.getBean(AccountService.class);

这工作量比原来是不是简单多了,简直太哇塞了


---------------------
作者:懒羊羊.java
来源:CSDN
原文:https://blog.csdn.net/weixin_57535055/article/details/126011501
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

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

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

相关文章

Unity免费领7月开发者周冰雪世界着色器环境包180种冰材质544种预制变体冰天雪地环境效果限时免费领取20240719

7月19号的Unity开发者周限时免费资产更新啦&#xff0c;这次是冰雪材质和环境素材包&#xff0c;质量挺不错。 之前进过捆绑包&#xff0c; 结帐时输入NATUREMANUFACTURE2024优惠券代码即可免费获得。无需购买。 Unity免费领7月开发者周冰雪世界着色器环境包180种冰材质544种…

DevExpress WinForms自动表单布局,创建高度可定制用户体验(一)

使用DevExpress WinForms的表单布局组件可以创建高度可定制的应用程序用户体验&#xff0c;从自动安排UI控件到按比例调整大小&#xff0c;DevExpress布局和数据布局控件都可以让您消除与基于像素表单设计相关的麻烦。 P.S&#xff1a;DevExpress WinForms拥有180组件和UI库&a…

系统架构设计师教程 第3章 信息系统基础知识-3.7 企业资源规划(ERP)-解读

系统架构设计师教程 第3章 信息系统基础知识-3.7 企业资源规划&#xff08;ERP&#xff09; 3.7.1 企业资源规划的概念3.7.2 企业资源规划的结构3.7.2.1 生产预测3.7.2.2 销售管理&#xff08;计划&#xff09;3.7.2.3 经营计划&#xff08;生产计划大纲&#xff09;3.7.2.4 …

【人工智能大模型】文心一言介绍以及基本使用指令

目录 一、产品背景与技术基础 二、主要功能与特点 基本用法 指令的使用 注意事项 文心一言&#xff08;ERNIE Bot&#xff09;是百度基于其文心大模型技术推出的生成式AI产品。以下是对文心一言的详细介绍&#xff1a; 一、产品背景与技术基础 技术背景&#xff1a;百度…

初学Linux之常见指令(上)

初学Linux之常见指令&#xff08;上&#xff09; 文章目录 初学Linux之常见指令&#xff08;上&#xff09;1. Linux下的小技巧热键man 指令 2. ls 指令3. pwd 指令4. cd 指令5. tree 指令6. touch 指令7. mkdir 指令8. rmdir 和 rm 指令9. cp 指令10. mv 指令 1. Linux下的小技…

PolarisMesh源码系列--Polaris-Go注册发现流程

导语 北极星是腾讯开源的一款服务治理平台&#xff0c;用来解决分布式和微服务架构中的服务管理、流量管理、配置管理、故障容错和可观测性问题。在分布式和微服务架构的治理领域&#xff0c;目前国内比较流行的还包括 Spring Cloud&#xff0c;Apache Dubbo 等。在 Kubernete…

英文名字网/英文取名/英语起名网源码/带文章系统带采集PHP网站程序

英文名字网/英文取名/英语起名网源码/带文章系统带采集PHP网站程序 演示站&#xff1a; https://enname.wengu8.com/ 程序截图&#xff1a; 程序说明&#xff1a; 1、前端模板PC手机端自适应。 2、全部数据带25W名字数据&#xff0c;后台可编辑&#xff0c;包括json格式的…

【Docker】Docker-compose 单机容器集群编排工具

目录 一.Docker-compose 概述 1.容器编排管理与传统的容器管理的区别 2.docker-compose 作用 3.docker-compose 本质 4.docker-compose 的三大概念 二.YML文件格式及编写注意事项 1.yml文件是什么 2.yml问价使用注意事项 3.yml文件的基本数据结构 三.Docker-compose …

零基础入门鸿蒙开发 HarmonyOS NEXT星河版开发学习

今天开始带大家零基础入门鸿蒙开发&#xff0c;也就是你没有任何编程基础的情况下就可以跟着石头哥零基础学习鸿蒙开发。 目录 一&#xff0c;为什么要学习鸿蒙 1-1&#xff0c;鸿蒙介绍 1-2&#xff0c;为什么要学习鸿蒙 1-3&#xff0c;鸿蒙各个版本介绍 1-4&#xff0…

【用栈操作构建数组】python刷题记录

润到栈模块. class Solution:def buildArray(self, target: List[int], n: int) -> List[str]:#每一个缺失的数字填入pushpop&#xff0c;其他数字只需要填入push即可#再简化思路&#xff0c;读取到的数小于当前&#xff0c;pushpop,直到等于当前才pushans[]cur0for i in ta…

在VS Code上搭建Vue项目教程(Vue-cli 脚手架)

1.前期环境准备 搭建Vue项目使用的是Vue-cli 脚手架。前期环境需要准备Node.js环境&#xff0c;就像Java开发要依赖JDK环境一样。 1.1 Node.js环境配置 1&#xff09;具体安装步骤操作即可&#xff1a; npm 安装教程_如何安装npm-CSDN博客文章浏览阅读836次。本文主要在Win…

zabbix“专家坐诊”第246期问答

问题一 Q&#xff1a;有哪位大哥知道这是啥情况&#xff0c;6.4主动检查接口显示未知&#xff1f; A&#xff1a;看看agent配置文件的主采集有没有填写正确IP。 Q&#xff1a;我刚刚客户端重新授权&#xff0c;发现可以预警了&#xff0c;但是还是灰色的&#xff0c;我尝试输…

直播平台优化方案:直播美颜SDK开发详解

本篇文章&#xff0c;笔者将详细介绍直播美颜SDK的开发过程&#xff0c;帮助开发者为其平台增添这一重要功能。 一、美颜SDK的基本概念 通过美颜SDK&#xff0c;用户在进行直播时可以轻松地美化自己的形象&#xff0c;提高观众的观看体验。 二、美颜SDK的核心功能 1.实时美颜…

人工智能算法工程师(高级)课程2-多类目标识别之RCNN系列模型与代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(高级)课程2-多类目标识别之RCNN系列模型与代码详解。本文全面解析了RCNN系列模型&#xff0c;包括R-CNN、Fast R-CNN、Faster R-CNN等&#xff0c;重点阐述了基于PyTorch框架实现多目标检测与识…

成为一位优秀的项目经理,这一点很重要

在管理工作中&#xff0c;我们可能会遇到这样的情况&#xff1a;有的人业务能力很强&#xff0c;堪称行业内的佼佼者&#xff0c;但当领导却仿佛失去了方向&#xff0c;管理起来显得力不从心&#xff0c;甚至一团糟。 业务能力和领导力是两个既相关又独立的概念。 业务能力是…

飞凌嵌入式RK3576开发板的MIPI-CSI调试——通路解析

MIPI-CSI是一种在嵌入式系统或移动设备中常见的摄像头接口&#xff0c;能够实现高速的图像数据传输。飞凌嵌入式最新推出的OK3576-C开发板拥有丰富的资源接口&#xff0c;其中支持5个CSI-2接口&#xff0c;意味着最多可同时支持5路摄像头的输入。 本篇内容就通过OK3576-C开发板…

2024年9月CCF GESP第七次认证开启报名 6547网

CCF GESP第七次认证时间为2024年9月7日&#xff0c;1-4级认证时间为上午9:30-11:30&#xff0c;5-8级认证时间为下午13:30-16:30。7月18日17:00开启9月认证报名通道&#xff0c;考生可登录GESP官网进行报名。GESP认证方式为全国各GESP考点上机考试&#xff0c;认证语言包括&…

Monaco 使用 FoldingRangeProvider

Monaco 中支持代码折叠功能&#xff0c;FolderRangeProvider 是一个通知功能&#xff0c;编辑文档会根据大括号的范围进行折叠&#xff0c;也就是可折叠区域都是以左大括号开始&#xff0c;右大括号结束&#xff0c;当折叠区域发生变更时&#xff0c;内部方法会被调用。 通过 …

数据结构——hash(hashmap源码探究)

hash是什么&#xff1f; hash也称为散列&#xff0c;就是把任意长度的输入&#xff0c;通过散列算法&#xff0c;变成固定长度的输出&#xff0c;这个输出值就是散列值。 举例来说明一下什么是hash&#xff1a; 假设我们要把1~12存入到一个大小是5的hash表中&#xff0c;我们…

数学基础【俗说矩阵】:矩阵相乘

矩阵乘法 矩阵乘法推导过程 一、两个线性方程复合代入 二、X1和X2合并同类项 三、复合后方程组结果 四、线性方程组矩阵表示 五、线性方程组矩阵映射表示 复合映射表示 六、矩阵乘法导出 矩阵乘法法则 1、规则一推导过程 左取行&#xff0c;右取列&#xff0c;对应相乘后…