Spring5应用之高级注解开发

作者简介:☕️大家好,我是Aomsir,一个爱折腾的开发者!
个人主页:Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客
当前专栏:Spring5应用专栏_Aomsir的博客-CSDN博客

文章目录

  • 参考文献
  • 前言
  • @Configuration
  • 开发步骤:
  • @Bean
    • 开发步骤
    • 自定义类型
    • 细节分析
  • @ComponentScan
  • 纯注解事务开发
  • AOP纯注解开发
  • 总结

参考文献

  • 孙哥suns说Spring5~学不会Spring? 因为你没找对人~孙帅
  • Spring官方文档

前言

在上一篇文章中,我们详细介绍了Spring2.x提供的一系列基础注解,并探讨了如何使用这些注解来简化开发。这些注解在Spring框架中的作用不可忽视,它们为开发者提供了更便捷的方式来管理组件、依赖注入以及其他关键方面的配置。本文将继续探讨Spring注解开发,更深入地了解这些强大的工具如何加速开发过程并提高代码质量。

@Configuration

在Spring3.x中引入了一项重要的新注解,即 @Configuration,它通常被称为配置类。这个注解的作用非常强大,它允许我们将Java类标记为配置Bean,以代替繁琐的XML配置文件。实际上,@Configuration是@Component注解的一种特殊形式。

开发步骤:

  1. 创建配置类:首先,创建一个Java类,并在其上标记 @Configuration 注解,将其变为一个配置Bean。
  2. 编写配置代码:在配置类中,编写Spring配置代码,包括Bean定义、依赖注入等。
  3. 进行测试:编写测试代码来验证配置类中的配置是否按预期工作。

通过使用 @Configuration 注解,我们可以更加方便地管理应用程序的配置,减少对XML配置文件的依赖,同时提高了代码的可维护性和可读性

@Configuration
public class AppConfig {
}
public class TestAnnotation2 {/*** 测试 @Configuration 注解*/@Testpublic void test1() {ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);}
}

在这里插入图片描述

@Bean

@Bean注解通常用于配置类中,用于声明和创建Bean。它与@Component注解相似,都能够将类标记为由Spring管理的组件。然而,@Bean注解在某些方面与@Component有一些关键的不同之处。

  • 区分简单对象和复杂对象:在Spring开发中,我们通常将对象分为两类:简单对象和复杂对象。
    • 简单对象:这些对象可以直接使用new操作符进行创建,例如UserUserServiceUserDAO等。
    • 复杂对象:这些对象不适合直接使用new操作符创建,通常是因为它们依赖其他Bean或需要进行复杂的初始化过程,比如SqlSessionSqlSessionFactory等。

@Bean注解主要用于声明和创建复杂对象,因为它允许我们在配置类中定义复杂对象的初始化和依赖关系。

请注意,即使只有类文件可用,并且需要使用注解驱动的开发,也可以使用@Bean注解来定义Bean
在这里插入图片描述

开发步骤

  • 创建配置Bean,按照上图要求书写方法
  • 编写测试方法进行验证
@Configuration
public class AppConfig {/*** 创建 简单对象* @return User*/@Beanpublic User user() {return new User();}@Beanpublic Connection connection() {Connection conn = null;try {Class.forName("com.mysql.cj.jdbc.Driver");conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/blog?useSSL=false&serverTimezone=UTC","root","123456");} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}return conn;}
}
public class TestAnnotation2 {/*** 测试 @Bean 注解 简单对象*/@Testpublic void test2() {ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);User user = ctx.getBean("user",User.class);System.out.println(user);}/*** 测试 @Bean 注解 复杂对象*/@Testpublic void test3() {ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);Connection connection = ctx.getBean(Connection.class);System.out.println("connection = " + connection);}
}

在这里插入图片描述
在这里插入图片描述

自定义类型

对于自定义数据类型,难免会遇到这种情况就是自定义类型的依赖注入,对于我们依赖方和被依赖方都使用@Bean的情况下,我们需要进行依赖注入应该怎么办?Spring会帮我们进行自动注入

  • 依赖方在方法体内用Set直接注入被依赖方即可,Spring会帮我们进行处理
  • 依赖方方法形参写上被依赖方,然后直接用Set方法注入,Spring也会帮我们进行处理,原理一致
    如下两段代码演示即可
@Configuration
public class AppConfig {@Beanpublic UserDAO userDAO() {return new UserDAOImpl();}@Beanpublic UserService userService() {UserService userService = new UserServiceImpl();// 这里可以直接注入,Spring会帮我们在容器中找userService.setUserDao(userDAO);return userService;}
}
@Configuration
public class AppConfig {@Beanpublic UserDAO userDAO() {return new UserDAOImpl();}@Beanpublic UserService userService(UserDAO userDAO) {UserService userService = new UserServiceImpl();// 也可以写在方法参数中,Spring也会帮我们进行注入userService.setUserDao(userDAO);return userService;}
}

细节分析

  • 自定义id值可以直接修方法名,也可以使用注解参数@Bean("u")
  • 控制对象的创建次数,可以在方法上标注@Scope并设置对应的值

@ComponentScan

@ComponentScan 注解用于扫描并注册 Spring Bean。它等同于 XML 配置中的 <context:component-scan base-package="" /> 元素。通过在配置类上使用 @ComponentScan 注解,可以告诉 Spring 哪些包需要被扫描,从而将这些包中的 Bean 注入容器中。

此注解具有多个属性,可用于指定包含和排除的规则等。下面是一个示例用法,其中包含和排除是多种多样的,具体的使用方法可以参考官方文档

@Configuration
@ComponentScan(basePackages = "com.aomsir.basic",excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = Service.class)},includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = Configuration.class)},useDefaultFilters = false)
public class AppConfig {
}

纯注解事务开发

在先前的 Spring 事务开发中,我们通常需要在 XML 配置文件中设置数据源dataSourceTransactionManager 等事务相关的配置。

然而,现在我们可以使用纯注解方式来管理事务,只需要创建一个配置类进行配置。接下来,只需在需要事务支持的方法或业务类上添加 @Transactional 注解即可,无需再涉及繁琐的配置。

这种方式极大地简化了事务管理,提高了代码的可维护性

@Configuration
@EnableTransactionManagement  // 开启事务
public class TransactionAutoConfiguration {@Autowiredprivate DataSource dataSource;@Beanpublic DataSourceTransactionManager dataSourceTransactionManager() {DataTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();dataSourceTransactionManager.setDataSource(dataSource);return dataSourceTransactionManager;}
}

AOP纯注解开发

在先前的AOP动态代理开发中,我们已经通过注解方式大大简化了很多内容,如切面类、切入点等。然而,仍然需要在配置文件中声明 <aop:aspectj-autoproxy /> 标签,以允许Spring启用AspectJ,以便使用注解来编写切面。但是,现在我们可以通过纯注解方式来进一步简化这些操作,包括启用AOP。

这种方式极大地减少了XML配置的需求,使AOP编程更加直观和便于维护

@Configuration
@ComponentScan(basePackages = "com.aomsir.basic.aop")
@EnableAspectJAutoProxy    // 允许Aspect - AOP,SpringBoot已经做了这一步
public class AppConfig {}
@Aspect
@Component
public class MyAspect {private static final Logger log = LoggerFactory.getLogger(MyAspect.class);@Pointcut("execution(* com.aomsir.basic.aop..*.*(..))")public void pointCut(){}// 等价于invoke方法@Around("pointCut()")public Object arround(ProceedingJoinPoint joinPoint) throws Throwable {log.info("----log----");Object ret = joinPoint.proceed();return ret;}
}@Service
public class UserServiceImpl implements UserService {private static final Logger log = LoggerFactory.getLogger(UserServiceImpl.class);@Overridepublic void register(User user) {log.error("UserServiceImpl.register 业务运算+Dao的调用");}@Overridepublic boolean login(String name, String password) {log.error("UserServiceImpl.login 业务运算+Dao的调用");return true;}
}

总结

这样,Spring中的注解编程完全分析完了。逐步将先前在Spring中使用配置文件的内容转换为注解方式是一种提高开发效率和可维护性的重要方法。Spring的注解编程使代码更加简洁和可读,同时减少了XML配置的需求。这将为以后学习和应用Spring Boot等框架提供坚实的基础

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

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

相关文章

CentOS 7 部署Jellyfin详细教程

前言 Jellyfin是免费、开源的媒体服务器解决方案&#xff0c;它能让我们轻松地管理和访问个人媒体文件&#xff0c;如电影、音乐等。本文将向您介绍如何快速搭建和部署Jellyfin&#xff0c;并分享一些最佳实践和技巧&#xff0c;帮助您更好地利用这个强大的媒体服务器解决方案。…

2.MySQL表的操作

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 表的操作 (1)表的创建 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; 存储引擎的不同会导致创建表的文件不同。 换个引擎。 t…

xcode打包macos报错:FlutterInputs.xcfilelist 和 FlutterOutputs.xcfilelist

xcode 打包macos的时候&#xff0c;报错如下&#xff1a; Unable to load contents of the file list: ‘macos/ephemeral/FlutterInputs.xcfilelist’ ‘macos/ephemeral/FlutterOutputs.xcfilelist’ 解决方案&#xff1a; 我的项目macos下没有找到FlutterInputs.xcfilelis…

angular项目指定端口,实现局域网内ip访问

直接修改package.json文件 "dev": "ng serve --host 0.0.0.0 --port 8080"终端运行npm run dev启动项目。 这里就指定了使用8080端口运行项目&#xff0c;同时局域网内的其他电脑可以通过访问运行项目主机的ip来访问项目 例如项目运行在ip地址为192.168.2…

jmeter压测

jmeter强大到很强大 hh~也要压测go的一些东西&#xff0c;这是三年前做的东西了&#xff0c;jmeter不支持grpc调用所以写了一个spring小服务中间层&#xff1a; 具体的jmeter开始了 这里设置线程相关 <h3>调用哪个服务的哪个方法</h3> <h3>BeanShell PrePro…

喜报 | 擎创科技实力亮相2023科创会并荣获科技创新奖

近日&#xff0c;由国家互联网数据中心产业技术创新战略联盟&#xff08;NIISA&#xff09;主办的“2023第二届国际互联网产业科技创新大会暨互联网创新产品展览会”于北京圆满落幕。 擎创科技副总裁冯陈湧受邀出席本次论坛&#xff0c;并发表了“银行分布式核心智能运维体系思…

Unity3D 基础——使用 Mathf.SmoothDamp 函数制作相机的缓冲跟踪效果

使用 Mathf.SmoothDamp 函数制作相机的缓冲跟踪效果&#xff0c;让物体的移动不是那么僵硬&#xff0c;而是做减速的缓冲效果。将以下的脚本绑定在相机上&#xff0c;然后设定好 target 目标对象&#xff0c;即可看到相机的缓动效果。通过设定 smoothTime 的值&#xff0c;可以…

洗地机什么牌子好用?洗地机排名

洗地机是如今清洁工作中非常重要的设备&#xff0c;它可以提高清洁效率&#xff0c;保持地面卫生&#xff0c;并减轻人力劳动的负担&#xff0c;市面上有许多不同品牌的洗地机&#xff0c;那么洗地机哪个牌子最好用呢?下面我们来介绍一下洗地机排名&#xff0c;并分析其热门型…

DIY私人图床:使用CFimagehost源码自建无需数据库支持的PHP图片托管服务

文章目录 1.前言2. CFImagehost网站搭建2.1 CFImagehost下载和安装2.2 CFImagehost网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

点云处理【三】(点云降采样)

点云降采样 第一章 点云数据采集 第二章 点云滤波 第二章 点云降采样 1. 为什么要降采样&#xff1f; 我们获得的数据量大&#xff0c;特别是几十万个以上的点云&#xff0c;里面有很多冗余数据&#xff0c;会导致处理起来比较耗时。 降采样是一种有效的减少数据、缩减计算量…

【LeetCode刷题(数据结构)】:翻转二叉树

方法一&#xff1a;递归 思路与算法 这是一道很经典的二叉树问题。显然&#xff0c;我们从根节点开始&#xff0c;递归地对树进行遍历&#xff0c;并从叶子节点先开始翻转。如果当前遍历到的节点 root\textit{root}root 的左右两棵子树都已经翻转&#xff0c;那么我们只需要交…

如何在C程序中使用libcurl库下载网页内容

概述 爬虫是一种自动获取网页内容的程序&#xff0c;它可以用于数据采集、信息分析、网站监测等多种场景。在C语言中&#xff0c;有一个非常强大和灵活的库可以用于实现爬虫功能&#xff0c;那就是libcurl。libcurl是一个支持多种协议和平台的网络传输库&#xff0c;它提供了一…

天锐绿盾透明加密、半透明加密、智能加密这三种不同加密模式的区别和适用场景——@德人合科技-公司内部核心文件数据、资料防止外泄系统

由于企事业单位海量的内部数据存储情况复杂&#xff0c;且不同公司、不同部门对于文件加密的需求各不相同&#xff0c;单一的加密系统无法满足多样化的加密需求。天锐绿盾企业加密系统提供多种不同的加密模式&#xff0c;包括透明加密、半透明加密和智能加密&#xff0c;用户可…

解码自然语言处理之 Transformers

自 2017 年推出以来&#xff0c;Transformer 已成为机器学习领域的一支重要力量&#xff0c;彻底改变了翻译和自动完成服务的功能。 最近&#xff0c;随着 OpenAI 的 ChatGPT、GPT-4 和 Meta 的 LLama 等大型语言模型的出现&#xff0c;Transformer 的受欢迎程度进一步飙升。这…

Burstormer论文阅读笔记

这是CVPR2023的一篇连拍图像修复和增强的论文&#xff0c;一作是阿联酋的默罕默德 本 扎耶得人工智能大学&#xff0c;二作是旷视科技。这些作者和CVPR2022的一篇BIPNet&#xff0c;同样是做连拍图像修复和增强的&#xff0c;是同一批。也就是说同一个方向&#xff0c;22年中了…

设计模式:简单工厂模式(C#、JAVA、JavaScript、C++、Python、Go、PHP):

简介&#xff1a; 简单工厂模式&#xff0c;它提供了一个用于创建对象的接口&#xff0c;但具体创建的对象类型可以在运行时决定。这种模式通常用于创建具有共同接口的对象&#xff0c;并且可以根据客户端代码中的参数或配置来选择要创建的具体对象类型。 在简单工厂模式中&am…

MySQL --- 聚合查询

聚合查询相当是行和行之间进行运算。 下文中的所有示例操作都是基于此表&#xff1a; 聚合函数 count(列名) select count(列名) from 表名; 统计该表中该列的行数&#xff0c;但是 null 值不会统计在内&#xff0c;但是如果写为 count(*) null 也会算进去&#xff08;就算…

轻松完成Figma导入Sketch的在线方法

众所周知&#xff0c;Figma支持Sketch文件的导入&#xff0c;但Figma不支持Sketch文件的导出&#xff0c;而Sketch不能直接打开Figma文件&#xff0c;在这种情况下&#xff0c;如何将Figma导入Sketch&#xff1f;别担心&#xff0c;其实借助免费的在线工具即时设计&#xff0c;…

在 Android 上恢复已删除音乐的 5 种简单方法

人们经常将重要的音乐文件保存在智能手机上&#xff0c;以方便随时随地收听自己喜欢的曲目。但是&#xff0c;如果这些珍贵的音乐文件因软件故障或硬件故障而被意外删除或丢失怎么办&#xff1f;这将是许多音乐爱好者的噩梦&#xff01; 如果您也是这些人中的一员&#xff0c;…