Sprint framework Day07:注解结合 xml 配置

前言

Spring注解结合XML配置是指在Spring应用中,使用注解和XML配置的方式来进行Bean的定义、依赖注入和其他配置。这种方式可以充分利用Spring框架的注解和XML配置两种不同的配置方式的特点。

在Spring框架中,我们可以使用注解来定义Bean,如@Component、@Service、@Repository等注解,也可以使用XML配置文件来定义Bean,例如<bean>标签。通常情况下,我们可以使用其中一种方式来定义Bean,但在某些复杂的场景下,我们需要同时使用这两种方式来定义Bean。具体来说:

使用注解来定义Bean,这样可以减少XML配置文件中的内容,使代码更加简洁,易于阅读和维护。例如:

@Component("userService")
public class UserServiceImpl implements UserService {// ...
}


使用XML配置来定义Bean,这样可以提供更多的灵活性,使得对Bean的配置更加详细和准确。例如:

<bean id="userService" class="com.example.UserServiceImpl"><!-- 注入依赖 --><property name="userDao" ref="userDao"/>
</bean>


使用注解和XML配置结合的方式来定义Bean,可以根据具体要求灵活地选择采用XML配置或注解来定义Bean。例如:

<context:component-scan base-package="com.example"/><bean id="userDao" class="com.example.UserDaoImpl"/><bean id="userService" class="com.example.UserServiceImpl"><!-- 注入依赖,在XML配置中引用注解定义的Bean --><property name="userDao" ref="userDao"/>
</bean>


在这种方式下,我们可以使用注解来扫描指定包下的所有组件,使用XML配置来定义和配置Bean,实现依赖注入、AOP等功能。

综上所述,Spring注解结合XML配置是指通过同时使用注解和XML配置的方式,以适应不同的需求和场景,提供更加灵活和精细的配置。

一、开始学习注解

1、本次我们要学习的有四个注解 @Component @Repository @Service @Controller,那么他们分别是什么意思呢?

在Spring框架中,@Component@Repository@Service@Controller是用于标记类的注解,用于定义Bean的角色和作用。

  1. @Component:它是一个通用的注解,用于表示一个普通的组件类,可用于任意层次。当我们使用@Component将一个类标记为组件时,Spring容器会自动扫描并创建这个类的实例作为Bean。
  2. @Repository:它用于标记数据访问层(DAO)的组件类。主要用于对数据库的操作,包括数据的增删改查等。通过@Repository注解,Spring会将这个类识别为持久化层的Bean,常与@Autowired配合使用,进行依赖注入。
  3. @Service:它用于标记服务层(Service)的组件类。主要负责业务逻辑的处理,比如事务管理、数据校验、调用DAO层等。通过@Service注解,Spring会将这个类识别为服务层的Bean,常与@Autowired配合使用,进行依赖注入。
  4. @Controller:它用于标记控制器层(Controller)的组件类。主要用于接收用户请求,处理请求参数,调用Service层处理业务逻辑,并返回相应的视图或数据。通过@Controller注解,Spring会将这个类识别为控制器层的Bean,常与@RequestMapping等注解一起使用。

以上四个注解都是用于标记组件类,并将其注册为Spring容器中的Bean。它们的作用是告诉Spring容器哪些类需要被实例化为Bean,并提供相应的功能,如依赖注入、AOP切面等。

使用这些注解可以使代码更加清晰和模块化,也有利于后续的扩展和维护。同时,结合不同的注解,我们可以将一个大型应用程序分成不同层次的组件,使开发更加高效和可管理。

了解完这四个注解后,我们就来完成一个案例,通过案例去更直观的了解它们吧。

2、新建项目,结果如下

3、导入 spring 依赖 
 <!-- spring 的核心依赖 --><dependencies><!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.23</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.4.5</version></dependency></dependencies>
 4、在 dao 包下新建一个 UserDao 接口,在 impl 包下新建 UserDaoImpl 实现类

userDao 接口

public interface UserDao {void save();}

UserDaoImpl 实现类

@Component("userDao")
@Slf4j
public class UserDaoImpl implements UserDao {@Overridepublic void save() {log.info("insert into user_info...... ");}
}

  @Component:用于标识当前类为一个 Bena ,这样就会被 spring 容器扫描到,可以通过 value 来指定, Bean 的 id,如果不指定 value,默认的 id 就是当前类名并,将首字母改为小写(例如:userDaoImpl)

 5、在 service 包下新建一个 UserService 接口,在 impl 包下新建一个 UserServiceImpl 实现类

UserService 接口

public interface UserService {void add();}

UserServiceImpl 实现类


@Component("userService")
public class UserServiceImpl implements UserService {private UserDao userDao;/*** 通过构造方法注入 dao** @param userDao** @Autowired注解进行注入*/@Autowiredpublic UserServiceImpl(UserDao userDao) {this.userDao = userDao;}@Overridepublic void add() {userDao.save();}
}
 6、在 controller 包下,新建 UserController 类

@Component("userController")
public class UserController {private UserService userService;/*** 通过构造方法注入** @param userService*/@Autowiredpublic UserController(UserService userService) {this.userService = userService;}public void add() {userService.add();}}
7、 在 resources 下新建一个 spring 的 xml 文件 application.xml,在配置文件中完成 Bean 的装配
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
"><bean id="userDao" class="edu.nf.ch07.dao.impl.UserDaoImpl"/><bean id="userService" class="edu.nf.ch07.service.impl.UserServiceImpl"><constructor-arg name="userDao" ref="userDao"/></bean><bean id="userController" class="edu.nf.ch07.controller.UserController"><constructor-arg name="userService" ref="userService"/></bean>
</beans>

这个案例是通过使用 @Component 注解去装配一个 bean。

8、测试
public class Main {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");UserController bean = context.getBean(UserController.class);bean.add();}}

测试结果

9、分析

在实现类和 UserControlelr 类都是用了 @Component 注解去装配一个 bean ,而且还是带参数的,那么这个参数有什么用呢?看下图:

使用Spring框架进行依赖注入的配置文件,它采用了XML格式来描述组件及其之间的依赖关系。

在这个配置文件中,定义了三个Bean:

  1. userDao:它的类为edu.nf.ch07.dao.impl.UserDaoImpl。这个Bean用于访问数据库,并提供了数据访问操作。

  2. userService:它的类为edu.nf.ch07.service.impl.UserServiceImpl。这个Bean用于封装一些具体的业务逻辑操作,并调用userDao进行数据访问。

  3. userController:它的类为edu.nf.ch07.controller.UserController。这个Bean用于接收用户请求,通过调用userService处理业务逻辑,最终返回相应的视图或数据。

  4. 在XML配置文件中,name用于指定要注入的属性或构造函数参数的名称。它通常和valueref等属性一起使用,在显式配置Bean时指定相应的属性或构造函数参数。name属性的取值为一个字符串,表示目标属性或构造函数参数的名称。

  5. 在XML配置文件中,ref用于指定依赖注入的目标Bean。它的取值为一个Bean的ID。在给某个属性或构造函数参数注入值时,通过ref指定目标Bean的ID,Spring容器会自动解析这个依赖关系,并将相应的Bean实例注入到目标位置。

在这些Bean之间,存在一定的依赖关系。userDaouserService依赖,因此在userService的构造函数中使用constructor-arg标签注入userDao。同样,userServiceuserController依赖,因此在userController的构造函数中使用constructor-arg标签注入userService

这种基于XML的配置方式被称为“显式配置”,它会告诉Spring容器哪些Bean需要被实例化,并建立它们之间的依赖关系。通过使用这种方式,我们可以将组件之间的关系直观地描述出来,同时可以灵活地进行配置和修改。

 二、使用特定注解定义各个类

1、 Dao 层 @Repository
@Repository("userDao")
public class UserDaoImpl implements UserDao {@Overridepublic void save() {log.info("insert into user_info...... ");}
}
2、service 层 @Service

@Service("userService")
public class UserServiceImpl implements UserService {private UserDao userDao;/*** 通过构造方法注入 dao** @param userDao** @Autowired注解进行注入*/public UserServiceImpl(UserDao userDao) {this.userDao = userDao;}@Overridepublic void add() {userDao.save();}
}
3、controller 层 @Controller

@Controller("userController")
public class UserController {private UserService userService;/*** 通过构造方法注入** @param userService*/public UserController(UserService userService) {this.userService = userService;}public void add() {userService.add();}}
4、改配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.2.xsd
"><!-- 启用注解扫描 , 指定扫描的包 --><context:component-scan base-package="edu.nf.ch07"/></beans>

在Spring配置文件中,<context:component-scan>用于启用注解扫描,并指定要扫描的包路径。通过这个配置,Spring容器会自动扫描指定包及其子包下的类,并将它们注册为Bean。上述示例中,使用<context:component-scan>配置启用了注解扫描功能,并通过base-package属性指定了要扫描的包路径为edu.nf.ch07。这意味着Spring容器将会扫描该包及其子包下的类,查找带有特定注解(如@Component@Service@Repository等)的类,并将其注册为Bean。

5、测试
public class Main {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");UserController bean = context.getBean(UserController.class);bean.add();}}

测试结果

 6、使用@Component 和使用 @Controller @Repository @Service 的区别

@Component@Controller@Repository@Service都是Spring中的注解,它们都是@Component注解的扩展。使用它们可以标记一个类作为组件,并将其注册到Spring容器中。它们之间的区别如下:

  1. @Component:通用注解,可用于任何类。
  2. @Controller:用于标记控制器层的组件,常用于SpringMVC应用程序。
  3. @Repository:用于标记数据访问层的组件,表示该组件负责数据访问,常用于与数据库交互的场景。
  4. @Service:用于标记业务逻辑层的组件,表示该组件负责业务处理,常用于编写业务逻辑。

使用<context:component-scan>配置时,它会扫描指定包及其子包下的标记了@Component@Controller@Repository@Service注解的类,并将其注册为Bean。因此,在使用<context:component-scan>时,使用哪种注解来标记类并没有影响。

但是,建议在不同层次的组件上使用相应的注解,以便更好地组织代码,并使代码更易于理解和维护。这也是所谓的“约定优于配置”原则的一种体现,即通过预定义的注解来简化配置,提高代码清晰度和可读性。

三、使用注解结合 xml 开发有什么好处?


注解和XML配置结合的方式可以提供更灵活和可扩展的依赖注入配置方案。下面是使用注解和XML配置结合的几个好处:
增加可读性和易维护性:通过使用注解,可以将依赖注入相关的配置信息直接写在类的代码中,使得代码更加直观和可读。同时,将一些通用的配置信息(比如数据库连接等)放在XML配置文件中,可以提高配置信息的可维护性和重用性。
灵活性和扩展性:注解可以灵活地应用于各种情况,例如使用 @Autowired 注解进行自动注入、使用 @Qualifier 注解指定具体的Bean、使用 @Primary 注解指定默认的Bean等。这些注解可以与XML配置文件结合使用,提供更细粒度的依赖注入控制和配置灵活性。
降低耦合性:通过使用注解和XML配置结合的方式,可以将实现类与接口之间解耦。使用 @Qualifier 注解可以根据需要选择具体的实现类,在不改变代码的情况下更换依赖的实现类。同时,@Primary 注解可以指定默认的实现类,减少了代码中对具体实现类的直接引用,进一步降低了耦合性。
总的来说,注解和XML配置结合的方式可以提供更灵活、可读性更好、可维护性更高、扩展性更强、耦合性更低的依赖注入配置方案。通过合理选择和使用注解和XML配置,可以更好地管理和控制对象之间的依赖关系。
 

四、gitee 案例

案例完整地址:https://gitee.com/qiu-feng1/spring-framework.git

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

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

相关文章

笔试、面试总结(网络安全与渗透测试)

什么是同源策略&#xff1f; 为了防止不同域在用户浏览器中彼此干扰&#xff0c;浏览器对从不同来源&#xff08;域&#xff09;收到的内容进行隔离。浏览器不允许任何旧有脚本访问一个站点的 cookie&#xff0c;否则 &#xff0c;会话容易被劫持。只有发布 cookie 的站点能够…

leetCode 583.两个字符串的删除操作 动态规划 + 优化空间复杂度(二维dp、一维dp)

583. 两个字符串的删除操作 - 力扣&#xff08;LeetCode&#xff09; 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 示例 1&#xff1a; 输入: word1 "sea", word2 &qu…

苹果CMS海螺模版V20修复版/加广告代码 ​适合视频影视类网站使用​

最新苹果CMS海螺模版V20修复版&#xff0c;增加广告代码&#xff0c;适合视频影视类网站使用&#xff0c;有兴趣的可以研究研究。 修复说明&#xff1a; 修复多线路时播放页列表点其他线路还是播放默认线路的问题 修复前台黑白切换和字体颜色切换失效 修复微信二维码没有对…

c语言表达式求值--整型提升

什么是整型提升&#xff1f; C的整型算术运算总是至少以缺省整型类型的精度来进行的。 为了获得这个精度&#xff0c;表达式中的字符和短整型操作数在使用之前被转换为普通整型&#xff0c;这种转换称为整型提升。 什么叫缺省整数类型&#xff1f;缺省在计算机里面是默认的意…

【数据结构】线段树

算法提高课笔记 还未更新完 文章目录 原理pushupbuildmodifyquerypushdown&#xff08;懒标记 / 延迟标记&#xff09;扫描线法 原理 时间复杂度&#xff1a;O(logn) 线段树是一棵二叉树&#xff0c;把一段区间分成多个部分 类似堆的方式&#xff0c;用一维数组存整棵树 对…

计算机导论实验——Linux基础入门

使用Xshell登录 Linux 主机 linux命令&#xff1a; cd&#xff1a;去哪里 pwd&#xff1a;在哪里 ls&#xff1a;查看当前有什么文件 mkdir&#xff1a;创建新目录 cp&#xff1a;复制 cat&#xff1a;连接或显示文件 rm&#xff1a;删除 mv&#xff1a;用于移动或重命名文件…

Android Studio版本升级后的问题 gradle降级、jdk升级

Cannot use TaskAction annotation on method IncrementalTask.taskAction$gradle_core() because interface org.gradle.api.tasks.incremental.IncrementalTaskInputs is not a valid parameter to an action method. 修改下面两处地方分别为7.0.3、7.3.3Android Gradle plu…

Spark中的Driver、Executor、Stage、TaskSet、DAGScheduler等介绍

工作流程&#xff1a; Driver 创建 SparkSession 并将应用程序转化为执行计划&#xff0c;将作业划分为多个 Stage&#xff0c;并创建相应的 TaskSet。Driver 将 TaskSet 发送给 TaskScheduler 进行调度和执行。TaskScheduler 根据资源情况将任务分发给可用的 Executor 进程执…

基于 chinese-roberta-wwm-ext 微调训练中文命名实体识别任务

一、模型和数据集介绍 1.1 预训练模型 chinese-roberta-wwm-ext 是基于 RoBERTa 架构下开发&#xff0c;其中 wwm 代表 Whole Word Masking&#xff0c;即对整个词进行掩码处理&#xff0c;通过这种方式&#xff0c;模型能够更好地理解上下文和语义关联&#xff0c;提高中文文…

数据仓库Hive(林子雨课程慕课)

文章目录 9.数据仓库Hive9.1 数据仓库的概念9.2 Hive简介9.3 SQL语句转换为MapReduce作业的基本原理9.4 Impla9.4.1 Impala简介9.4.2 Impala系统架构9.4.3 Impala查询执行过程9.4.4 Impala与Hive的比较 9.5 Hive的安装和基本操作9.5.1 Hive安装9.5.2 Hive基本操作 9.数据仓库Hi…

黑马点评-05缓存穿透问题及其解决方案,缓存空字符串或使用布隆过滤器

缓存穿透问题(缓存空) 缓存穿透的解决方案 缓存穿透(数据穿透缓存直击数据库): 缓存穿透是指客户端请求访问缓存中和数据库中都不存在的数据,此时缓存永远不会生效并且用户的请求都会打到数据库 数据库能够承载的并发不如Redis这么高&#xff0c;如果大量的请求同时访问这种…

十大排序算法Java实现及时间复杂度

文章目录 十大排序算法选择排序冒泡排序插入排序希尔排序快速排序归并排序堆排序计数排序基数排序桶排序时间复杂度 参考资料 十大排序算法 选择排序 原理 从待排序的数据元素中找出最小或最大的一个元素&#xff0c;存放在序列的起始位置&#xff0c; 然后再从剩余的未排序元…

C++类和对象(下)

目录 一、初始化列表 二、单参构造参数和explicit关键字 三、匿名对象 四、static成员 五、友元 六、内部类 一、初始化列表 之前我们在构造函数中写得还不错&#xff0c;也没发现什么问题&#xff0c;为什么C还有搞一个初始化列表呢&#xff1f; 如下这段代码&#x…

mars3d的api文档关于addDynamicPosition查找使用说明

示例链接&#xff1a;功能示例(Vue版) | Mars3D三维可视化平台 | 火星科技 api地址&#xff1a;Mars3D三维可视化平台 | 火星科技 说明&#xff1a; 1.用户反馈不知道如何搜索这个属性的用法 说明&#xff1a; 1. 示例代码中的graphic.addDynamicPosition()说明这个addDynam…

基本微信小程序的二手车交易平台

项目介绍 首先,论文一开始便是清楚的论述了小程序的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了小程序的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数…

@MultipartConfig注解

前言&#xff1a; 在学习Javaweb的Servlet文件上传和下载的过程中&#xff0c;我们会遇到一个特殊的注解---MultipartConfig。 MultipartConfig的适用情况&#xff1a; 1.文件上传: 当您的应用程序需要接收用户上传的文件时&#xff0c;可以在相应的 Servlet 上使用 Multipart…

Jmeter连接mysql数据库详细步骤

一、一般平常工作中使用jmeter 连接数据库的作用 主要包括&#xff1a; 1、本身对数据库进行测试&#xff08;功能、性能测试&#xff09;时会需要使用jmeter连接数据库 2、功能测试时&#xff0c;测试出来的结果需要和数据库中的数据进行对比是否正确一致。这时候可以通过j…

C++ 位图与布隆过滤器

目录 前言位图场景演示应用场景模拟实现问题例题 布隆过滤器例子理解应用 例题 前言 位图与布隆过滤器是用来在海量数据中判断一个数据在不在的问题的数据结构&#xff0c;这种数据结构在存储空间上大大的优于红黑树、哈希等数据结构 位图 我们为了处理一个数据在海量数据中…

SQL开发笔记之专栏介绍

Sql是用于访问和处理数据库的标准计算机语言&#xff0c;使用SQL访问和处理数据系统中的数据&#xff0c;这类数据库包括&#xff1a;Mysql、PostgresSql、Oracle、Sybase、DB2等等&#xff0c;数据库无非围绕着“增删改查”的核心业务进行开发。并且目前绝大多数的后端程序开发…

很烦的Node报错积累

目录 1. 卡在sill idealTree buildDeps2、Node Sass老是安装不上的问题3、unable to resolve dependency tree4、nvm相关命令5、设置淘宝镜像等基操5.1 镜像 5.2 npm清理缓存6、Browserslist: caniuse-lite is outdated loader 1. 卡在sill idealTree buildDeps 参考&#xf…