news 2026/6/10 15:27:22

Spring纯注解开发,有点强!!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring纯注解开发,有点强!!

01

前言

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

02

注解开发

以前跟老韩学习SE时他就说:

注解本质是一个继承了Annotation 的特殊接口,其具体实现类是Java 运行时生成的动态代理类。

而我们通过反射获取注解时,返回的是Java 运行时生成的动态代理对象$Proxy1。通过代理对象调用自定义注解(接口)的方法,会最终调用AnnotationInvocationHandler 的invoke 方法。该方法会从memberValues 这个Map 中索引出对应的值。而memberValues 的来源是Java 常量池。

03

注解定义Bean

注解开发前,配置Bean时是在xml里将class分别写在Bean标签里,然后起id,就像这样

<bean id="a" class="yu7daily.Dao.Daoimpl.A" />

注解开发后,配置Bean时首先将xml里的标签删掉,然后在类上添加@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到底是什么关系呢?

04

衍生注解

对于@Component还有衍生的三个注解:

@Controller、@Service、@Repository

结合与MVC的模式分别起到了补充的作用,方便我们后期在编写类的时候能很好的区分出这个类是属于表现层、业务层还是数据层的类

05

纯注解开发模式

顾名思义,纯注解的模式就是摒弃以前的配置操作,全部由注解来完成

@Configuration:类注解,设置该类为Spring配置类

@ComponentScan:类注解,设置Spring配置类扫描路径

1.写一个配置类,通过注解@Configuration来标注该类为配置类、@ComponentScan来配置包扫描

这样就替换掉了

@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~"); } }

06

注解实现注入

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

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

@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

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

07

Spring整合MyBatis

在配置好MyBatis的基础上(不熟悉的可以去看一下以前写的MyBatis文章),Spring的整合工作就变的非常简单,主要工作就是管理MyBatis中的SqlSessionFactory和Mapper接口的扫描

1.首先导入两个整合需要的的jar包:

<artifactId>spring-jdbc</artifactId>和13<artifactId>mybatis-spring</artifactId>

2.配置数据源对象

3.创建主配置类

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

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

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

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 11:36:21

AI 软件开发的管理

管理 AI 软件开发不仅是技术的堆叠&#xff0c;更是对不确定性、数据资产以及人机协作模式的深度治理。与传统软件工程相比&#xff0c;AI 项目管理的核心挑战在于&#xff1a;代码逻辑是确定的&#xff0c;但模型的输出是概率性的。以下是管理 AI 软件开发的关键维度&#xff…

作者头像 李华
网站建设 2026/6/10 11:43:49

Adobe Premiere Pro 26.0 - 原生支持Windows on ARM

一句话亮点&#xff1a;Adobe首次为ARM平台提供原生支持&#xff0c;适配高通Snapdragon X系列处理器设备。详细描述&#xff1a;Adobe发布26.0版本&#xff0c;标志着其创意软件生态系统正式进入ARM时代。Premiere Pro、After Effects、Audition及Media Encoder首次实现对Wind…

作者头像 李华
网站建设 2026/6/10 11:41:15

LLMs Are Dumber Than a House Cat

原文&#xff1a;towardsdatascience.com/llms-are-dumber-than-a-house-cat-81e7b3d63190 挫折&#xff1f;困惑&#xff1f;或许“缺乏优雅”是一个更好的表达。这是当你看到顶级科学家对已经理解的技术感到惊奇时所感受到的痛苦。 AI 影响者用惊奇牌来吸引点击&#xff0c;…

作者头像 李华
网站建设 2026/6/10 11:39:17

2026年牛客网最新版Java面试题及答案整理

Java学到什么程度可以面试工作&#xff1f; 要达到能够面试Java开发工作的水平&#xff0c;需要掌握以下几个方面的知识和技能&#xff1a; 1. 基础扎实&#xff1a;熟悉Java语法、面向对象编程概念、异常处理、I/O流等基础知识。这是所有Java开发者必备的基础&#xff0c;也…

作者头像 李华
网站建设 2026/6/10 11:40:24

深度测评9个AI论文平台,MBA高效写作必备!

深度测评9个AI论文平台&#xff0c;MBA高效写作必备&#xff01; AI 工具如何重塑论文写作的效率与质量 在当今快速发展的学术环境中&#xff0c;MBA 学生和研究人员正面临着越来越高的写作压力。从选题到开题&#xff0c;从初稿撰写到最终定稿&#xff0c;每一个环节都需要精准…

作者头像 李华
网站建设 2026/6/10 12:14:35

EpiQuik Plant ChIP Kit:高灵敏度与特异性,专为植物样本优化

在生命科学领域&#xff0c;表观遗传学的研究正以前所未有的速度推进。其中&#xff0c;染色质免疫共沉淀&#xff08;ChIP&#xff09;技术作为解析基因组与蛋白质相互作用的核心手段&#xff0c;广泛应用于动植物研究中。尤其是在植物研究中&#xff0c;由于其复杂的基因组结…

作者头像 李华