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.rhkb.cn/news/160789.html

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

相关文章

那些年,我们追过的Java BUG

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

icg模块clock gating解析

// 两种形式&#xff1a; 与门形式 或门形式 三个用途&#xff1a; 用于关断时钟&#xff0c;降低功耗用于动态时钟切换是防止毛刺的产生用于时钟分频 解析&#xff1a;与门形式 解析&#xff1a;或门形式

安达发|制造企业生产排产现状和APS系统的解决方案

随着市场竞争的加剧&#xff0c;制造业企业面临着生产效率、成本控制和客户满意度等方面的巟大压力。在这种背景下&#xff0c;生产排产作为制造业的核心环节&#xff0c;对企业的生产经营具有重要意义。本文将针对制造业的生产排产现状进行分析&#xff0c;并提出相应的APS系统…

Android 远程调用服务之 AIDL

目录 一、AIDL 是什么&#xff1f;二、为什么要使用 AIDL&#xff1f; 1、使用 AIDL 是为了跨进程调用第三方服务&#xff1f; 2、使用 AIDL 是为了向第三方服务传输数据/参数&#xff1f; 3、使用 AIDL 是为了获取第三方服务直接或者异步返回的数据&#xff1f;三…

户外运动盛行,运动品牌如何利用软文推广脱颖而出?

全民健康意识的提升和城市居民对亲近自然的渴望带来户外运动的盛行&#xff0c;这也使运动品牌的市场保持强劲发展势头&#xff0c;那么在激烈的市场竞争中&#xff0c;运动品牌应该如何脱颖而出呢&#xff1f;下面就让媒介盒子告诉你&#xff01; 一、 分享户外运动干货 用户…

【微信小程序开发】布局(附有首页布局案例)

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于小程序的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.弹性布局以及相关样式 1.什么是flex布…

jmeter 解决查看结果树响应内容中文乱码问题

jmeter 解决查看结果树响应内容中文乱码问题 查看结果树中&#xff0c;接口响应内容中&#xff0c;包含中文&#xff0c;显示乱码&#xff1b; 临时解决方法&#xff0c;添加BeanShell 后置处理程序&#xff0c;添加内容prev.setDataEncoding("utf-8"); 运行压测…

【22】c++设计模式——>外观模式

外观模式定义 为复杂系统提供一个简化接口&#xff0c;它通过创建一个高层接口(外观)&#xff0c;将多个子系统的复杂操作封装起来&#xff0c;以便客户端更容易使用。 简单实现 #include<iostream>// 子系统类 class SubsystemA { public:void operationA() {std::co…

Linux 的常用命令大全

常用命令 ls:查看目录与文件pwd:显示当前目录cd:切换目录绝对路径与相对路径touch:创建空文件tab :补全ctrl c :重新输入cat:查看文件内容mkdir:创建目录rm:删除cp:拷贝mv:移动或重命名文件和目录man:帮助命令lessheadtailvim:文本编辑grep:搜索指定文本模式或正则表达式ps:显…

Cisdem Video Player for mac(高清视频播放器) v5.6.0中文版

Cisdem Video Player mac是一款功能强大的视频播放器&#xff0c;适用于 macOS 平台。它可用于播放不同格式的视频文件&#xff0c;并具有一些实用的特性和功能。 Cisdem Video Player mac 中文版软件特点 多格式支持&#xff1a;Cisdem Video Player 支持几乎所有常见的视频格…

Apache DolphinScheduler 官方发布3.2.0版本!大数据调度【重磅更新】

今天&#xff0c;Apache DolphinScheduler 3.2.0 版本在万众期待中终于发布了&#xff01;在之前的预告中&#xff0c;包括《重磅预告&#xff01;Apache DolphinScheduler 3.2.0 新功能“剧透”》、《3.2.0 版本预告&#xff01;Apache DolphinScheduler API 增强相关功能》、…

在 rider 里用配置 Perforce(P4)的注意事项

整个配置界面里&#xff0c;关键就配2处位置&#xff0c;但是都有些误导性。 1是连接形参的4个参数都得填&#xff0c;字符集看你项目的要求&#xff0c;这里工作区其实指的是你的工作空间&#xff0c;还不如显示英文的 Workspace 呢&#xff0c;搞得我一开始没填&#xff0c;…

设计模式_迭代器模式

迭代器模式 介绍 设计模式定义案例迭代器模式行为型&#xff1a;关注对象与行为的分离 提供了一种统一的方式来访问多个不同的集合两个集合&#xff1a;使用了不同的数据存储方式 学生 和 警察 查询显示出集合的内容 &#xff0c;使用相同的代码 问题堆积在哪里解决办法不同…

安达发|AI算法全方位打造制造业AI智能化工厂的超级大脑

随着科技的不断进步&#xff0c;人工智能已经成为了我们生活中不可或缺的一部分。在制造业中&#xff0c;AI技术也正在发挥着越来越重要的作用。而APS系统&#xff0c;则是AI技术在制造业中的一个重要应用。 那么&#xff0c;什么是APS系统呢&#xff1f;简单来说&#xff0c;A…

AI 悄然变天:这家平台为何能俘获众多明星大模型「芳心」?

整个AI领域&#xff0c;GPT-4 发布无疑成为载入 AI 史册的大事件。但其还留下来一些发展空间&#xff0c;其不可能把所有的事情都做完。比如&#xff0c;涉及小数、分数的运算&#xff0c;GPT-4 可能给不出正确答案&#xff08;其多位乘法运算准确率仅为 4.3%&#xff09;。 可…

spring java 动态获取consul K/V

spring java 动态获取consul K/V 1.springConsul配置kv路径 spring:cloud:consul:enabled: ${CONSUL_ENABLED:true}host: ${CONSUL_HOST:localhost}port: ${CONSUL_PORT:8500}config:prefix: ${CONSUL_CONFIG_PREFIX:config} #consul kv前缀fail-fast: ${CONFIG_FAIL_FAST:fa…

ORA-12541:TNS:no listener 无监听程序

问题截图 解决方法 1、删除Listener 新建一个新的 2、主机为服务器ip 3、设置数据库环境 只需要设置实例名不需要设置路径 4、服务命名 一样设置为ip 服务名与监听名一直 eg&#xff1a;orcl

Sketch macOS 支持m1 m2 Sketch 2023最新中文版

SketchUp Pro 2023是一款功能强大的三维建模软件&#xff0c;适用于建筑设计师、室内设计师、工程师和其他创意专业人士。以下是SketchUp Pro 2023的一些主要特点和功能&#xff1a; 三维建模&#xff1a;SketchUp Pro 2023允许用户以直观的方式创建三维模型。通过简单的绘图工…

aidl的注意事项

该篇继承自上一篇&#xff0c;上一篇也有一部分的注意事项&#xff0c;这一篇把其他的情况列出 一 客户段和服务端的aidl文件下的package名字要是一样的 二 server中的 manifest中的package名字&#xff0c;这个与上面两个包不能相同&#xff0c;不然在客户端设置intent的pa…

Java每日笔试题错题分析(6)

Java每日笔试题错题分析&#xff08;6&#xff09; 一、错题知识点前瞻第1题第2题第3题第4题 二、错题展示及其解析第1题第2题第3题第4题 一、错题知识点前瞻 第1题 被动引用&#xff08;免初始化&#xff09; 提示&#xff1a; 第2题 本题考查的含义&#xff0c;对于两个引用…