Spring纯注解开发模式让开发简化更简化

news2024/9/25 1:25:54

目录

  • 一.注解开发
  • 二.注解定义Bean
  • 三.衍生注解
  • 四.纯注解开发模式
  • 五.注解实现注入
    • 1.自动装配
    • 2.按名称注入
    • 3.简单数据注入
    • 4.读取properties配置文件
  • 六.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注解即可

1

2

3

4

5

6

@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意为扫描

包路径越多,扫描的范围越小速度越快·包路径越少,扫描的范围越大速度越慢

最后直接从容器获取对象

1

2

3

4

5

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"/>

1

2

3

@Configuration

@ComponentScan("yu7daily")

public class Config {...}

然后类就被放进了Bean里,通过

ApplicationContext acct = new AnnotationConfigApplicationContext(Config.class);就可以得到Bean

一顿操作下来我们通过一个Java类替换掉了Spring的核心配置文件,完全告别了xml!

配置Bean作用域

我们知道,通过Bean造的对象默认都是单例的,如何造出非单例的Bean?

通过@Scope注解即可,属性值(默认singleton(单例),可选值prototype(非单例))

1

2

3

4

5

6

7

@Component("a")

@Scope("prototype")

public class A implements AA {

    public void save() {

        System.out.println("hello~");

    }

}

五.注解实现注入

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

1

2

3

4

5

@Service

public class A implements AA {

    @Autowired

    private 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对象,在不修改其他条件下,就像这样

1

2

3

4

5

6

7

8

9

@Repository("b")

public class B implements BB {

    @Autowired

    @Qualifier("a") //注入指定的对象名称

    private AA aa;

    public void save() {

        aa.save();

    }

}

随着运行结果,输出了A的成员方法,说明注入成功!

值得注意的是:@Qualifier不能独立使用,必须和@Autowired一起使用!!!

3.简单数据注入

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

1

2

3

4

5

6

7

8

  @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用来指明读取目录下的哪个文件

1

2

3

4

5

@Configuration

@ComponentScan("yu7daily")

@PropertySource("test.properties")

public class SpringConfig {

  }

在相应的属性上配置@Value注解即可完成配置文件属性的读取

PS:配置文件内容——name=lanyangyang

1

2

3

4

5

6

7

8

  @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.创建主配置类

1

2

3

4

5

@Configuration

@ComponentScan("yu7daily")

@PropertySource("classpath:jdbc.properties")

4@Import({JdbcConfig.class,MybatisConfig.class})

public class SpringConfig {...}

3.创建MyBatis配置类并获得SqlSessionFactory对象

4.最后在主函数中得到对应的Bean即可进行对数据层的操作

1

2

ApplicationContext ACC = new AnnotationConfigApplicationContext(SpringConfig.class);

AccountService acc = ACC.getBean(AccountService.class);

 

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

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

相关文章

龙华商业中心片区旧改:总建面161万平,分5个片区进行建设。

龙华商业旧改&#xff1a;总建面约161万平分5个片区进行建设 据了解&#xff0c;整个龙华商业旧改整体包含北、中、东、南一、南二五个片区&#xff0c;各个片区均整体实施。 更新单元南一片区项目&#xff08;金地宸峯府&#xff09;&#xff0c;拆除用地面积30836.8平方米&…

前4月同比增长超50%,这条座舱智能化赛道国产化率逼近50%

车市行情的低迷&#xff0c;并没有影响智能化人机交互功能的需求增长。 根据高工智能汽车研究院监测数据显示&#xff0c;2023年1-4月中国市场&#xff08;不含进出口&#xff09;乘用车标配HUD&#xff08;W/AR&#xff09;搭载交付55.36万辆&#xff0c;同比增长54.98%&…

附录2-小程序常用API

API有三大类&#xff0c;事件监听API&#xff0c;同步API&#xff0c;异步API 事件监听API都以on开头&#xff0c;比如wx.onWindowResize()监听窗口尺寸变化事件 同步API都以Sync结尾&#xff0c;同步API可以通过函数返回值直接获取&#xff0c;执行出错会抛出异常。比如 wx.…

健康管理系统开发笔记

健康管理系统 项目介绍功能架构项目结构maven项目搭建 项目介绍 健康管理系统是一款应用于健康管理机构的业务系统&#xff0c;实现健康管理机构工作内容 可视化、会员管理专业化、健康评估数字化、健康干预流程化、知识库集成化&#xff0c;从而提 高健康管理师的工作效率&a…

12.页面导航

页面导航 是 页面之间的相互跳转&#xff0c;我们在浏览器中可以使用 a链接 与 location.href 进行跳转 在小程序中可以使用 声明式导航(navigator标签&#xff0c;类似于a标签) 与 编程式导航(使用小程序导航API&#xff0c;类似于location.href) 来跳转页面 目录 1 声明式…

软考A计划-电子商务设计师-电商设计师重点

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

VS2019社区版和QT安装记录

下载 VS2019&#xff1a; Visual Studio 2019 版本 16.11 发行说明 | Microsoft Learnhttps://learn.microsoft.com/zh-cn/visualstudio/releases/2019/release-notes选择第一个&#xff0c;下载社区版。或者这里下载。 比较简单的方式就是直接打开&#xff0c;网络安装。但微…

camunda如何清理或归档历史数据

一、camunda如何清理历史数据 Camunda 提供了多种方式可以清理历史数据。以下是一些常见的方式&#xff1a; 1、使用 HistoryService#deleteHistoricProcessInstance 方法&#xff1a;该方法用于删除指定的历史流程实例以及与之关联的所有历史数据&#xff0c;包括历史任务、…

【微波实验1】 T形波导的内场分析及优化设计

实验目的 熟悉并掌握HFSS的工作界面、操作步骤及工作流程。掌握T型波导功分器的设计方法、优化设计方法和工作原理。 实验仪器 1、 装有windows 系统的PC 一台 2、 HFSS15.0 或更高版本软件 实验原理 本实验所要分析的器件是下图所示的一个带有隔片的T形波导。其中&#…

SpringBoot 设置动态定时任务,千万别再写死了~

怎么在SpringBoot项目中简单使用定时任务&#xff0c;不过由于要借助cron表达式且都提前定义好放在配置文件里&#xff0c;不能在项目运行中动态修改任务执行时间&#xff0c;实在不太灵活。 经过网上搜索学习后&#xff0c;特此记录如何在SpringBoot项目中实现动态定时任务。…

MySQL查询序号带小数点问题

案例&#xff1a; SELECT (num:num1) AS index, name, age FROM sys_user, (SELECT num:0) AS a order by age,name; 查询结果&#xff1a; datagrip和dbeaver查询结果不一样&#xff0c;使用cmd查询&#xff0c;默认也是无小数点的 但实际返回结果&#xff0c;其实是带点的 D…

CocosCreator制作地图外物品位置向导(指引/地图标点)

演示 图解 code goldTips&#xff1a;指引节点&#xff0c;更改位置使用 goldTipRotate&#xff1a;指引节点的子节点中具有指向性的节点&#xff0c;一般为带箭头&#xff0c;尖角等。 protected lateUpdate(dt: number): void {//可以不在lateUpdate中操作&#xff0c;…

【020】C++的动态内存申请new和delete

C的动态内存申请new和delete 引言一、动态分配内存的概述二、静态分配和动态分配三、new和delete3.1、new和delete操作基本类型空间3.2、new和delete操作数组空间 四、new和delete的重载五、动态分配内存的优缺点总结 引言 &#x1f4a1; 作者简介&#xff1a;专注于C/C高性能程…

【算法系列 | 2】深入解析排序算法之插入排序

序言 你只管努力&#xff0c;其他交给时间&#xff0c;时间会证明一切。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记一级论点蓝色&#xff1a;用来标记二级论点 决定开一个算法专栏&#xff0c;希望能帮助大…

看这篇文章能让你健康多活若干年

这个世界值得你多活几十年&#xff0c;即便你对现在的生活不满意&#xff0c;你也会对几十年后的生活倾慕不已。 毕竟&#xff1a; 到2029年&#xff0c;区块链就出来第二十年了&#xff0c;Web3会让我们生活得更容易。 到2042年&#xff0c;chatGPT就出来第二十年了&#xff0…

SpringCloudAlibaba

Spring Cloud Alibaba 是 Spring Cloud 的一个子项目&#xff0c;它是由阿里巴巴开发的一套微服务解决方案&#xff0c;旨在为微服务架构提供一站式解决方案&#xff0c;包括服务注册与发现、配置中心、消息总线、负载均衡、熔断器、限流器、分布式事务等组件。 Spring Cloud A…

阿里、字节大佬共创的Netty核心原理手册,必须是全网No.1

讲到这里&#xff0c;你可能要问了&#xff1a;如果我的工作中涉及网络编程的内容并不多&#xff0c;那我是否还有必要花精力学习 Netty 呢&#xff1f;其实在互联网大厂&#xff08;阿里、腾讯、美团等&#xff09;的中高级 Java 开发面试中&#xff0c;经常会问到涉及到 Nett…

将一个数组分为多个数组按其元素总数尽量均分的numpy.array_split()方法

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将一个数组s分为多个数组 按s中元素总数尽量均分 numpy.array_split() [太阳]选择题 关于以下代码说法错误的一项是? import numpy as np a np.array([1,2,3,4]) print("【显示】a &quo…

突发!ChatGPT之父警告AI可能灭绝人类,350名AI权威签署联名公开信

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ni7WOmZz-1685770686028)(C:\Users\lenovo\AppData\Local\Temp\ksohtml3116\wps1.jpg)] 就在刚刚&#xff0c;AI 领域传出一封重要的公开信。 包括 「ChatGPT 之父」Sam Altman 在内 350 位 AI 权威都…

【历史上的今天】6 月 5 日:揭幕计算机历史的一次聚会;公钥密码学先驱诞生;函数语言设计先驱出生

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 6 月 5 日&#xff0c;世界环境日。1972 年 6 月 5 日至 16 日&#xff0c;联合国人类环境会议在斯德哥尔摩举行&#xff0c;会上发表了《人类环境言》&#x…