Spring框架的三种配置方式(二)---xml文件+注解

news2024/11/13 18:08:37

Spring框架有三种配置方式:

1.在spring2.5以前,用xml文件进行配置

2.在spring2.5以后,用xml文件注解(annotation)共同进行配置

3.在spring3.0以后,用注解(annotation)JavaConfig配置类进行配置

一、xml文件

见下一篇

二、xml文件+注解

        为什么要用注解+xml文件,而不直接用xml文件呢?因为过多的类注入和通过过多的set方法和构造方法来进行注入会导致代码冗余,所以我们可以通过注解+xml文件来优化代码,以下以一个具体的实例,通过注解+xml文件的方法来实现类的注入和基本数据的注入:

注入类

注入普通类

关键字:@Component

语法:@component(value="注入容器的id,如果省略,id自动默认是类名且首字母小写")

        使用@component进行类的注入代替了之前我们在xml文件中的:

<bean id="student" class="com.com.apesource.包.Student"></bean>

等价于: 注解+xml文件

注解:

@Component
Class Student{}

 xml文件:(含义:扫描所有被@Component注解所修饰的类,再将其注入容器)

<context:component-scan base-package="com.apesource"/>

注入数据访问层

关键字:@Repository

代替xml文件中的:

 <bean id="daoImp" class="com.apesource.dao.UserDaoImp"/>

注入业务层

关键字:@Service

代替xml文件中的

<bean id="serviceImp" class="com.apesource.service.UserServiceImp"/>

注入控制层

关键字:@Controller

代替xml文件中的

<bean id="controllerImp" class="com.apesource.controller.
UserControllerImp"/>

注入基本数据

@Value

使用方法

含义:注入基本数据

替换:<property><property/>

修饰:成员变量或对应的set方法

语法:(注解+xml文件)

1.注解:①@Value("数据内容")  、②@Value("动态获取数据内容") 

2.xml文件:

<context:property-placeholder location="message.properties" />
具体实现

1.学生类:

<1>//写法1:

@Component(value = "stu")
public class Student {
    //方法1:
    @Value("团团")
    private String stuName;
    @Value("180")
    private int stuHeight;
     @Override
    public String toString() {
        return "Student{" +
                "stuName='" + stuName + '\'' +
                ", stuHeight=" + stuHeight +
                '}';
    }
}

<2.1>//写法2:

@Component(value = "stu")
public class Student {
    //方法2:
   @Value("${msg1}")
    private String stuName;
    @Value("${msg2}")
    private int stuHeight;
     @Override
    public String toString() {
        return "Student{" +
                "stuName='" + stuName + '\'' +
                ", stuHeight=" + stuHeight +
                '}';
    }
}

<2.2> //message.properties文件:存放动态信息

msg1=毛毛
msg2=182

 2.xml文件

<?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.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

<!--扫描注解-->
<context:component-scan base-package="com.apsource"/>
<!--加载资源文件-->
<context:property-placeholder location="message.properties" />
</beans>

运行结果:

 

@AutoWried

使用方法

语法:@AutoWried(required="true-默认、false"),其中required代表是否必须进行装配

修饰对象:成员变量或对应的构造方法

含义:按照 通过set方法进行类型装配,set方法可以省略

具体实现

我们使用一个三层架构来说明他的具体实现:

1.//controller控制层

<1.1>IUserController接口:

public interface IUserController {
    public void save();
}

<1.2> UserControllerImp实现类

@Component(value="controller")
public class UserControllerImp implements IUserController{
    //向spring容器查找IUserService类型的对象实例
                                ,并通过构造方法注入给修饰的属性
    @Autowired
    IUserService service;
    //省略了set方法
    @Override
    public void save() {
        System.out.println("===controller的新增方法===");
        service.save();

    }
}   

2.dao数据访问层 

<2.1>IUserDao接口

public interface IUserDao {
    public void save();
}

 <2.2>UserDaoImp实现类

@Repository
public class UserDaoImp implements IUserDao{
    @Override
    public void save() {
        System.out.println("===dao的新增方法===");
    }
}

3.Service服务层

 <3.1>IUserService接口

public interface IUserService {
    public void save();
}

<3.2> UserServiceImp实现类

@Service
public class UserServiceImp  implements IUserService {
    @Autowired
    //@Autowired(required = false):如果找不到匹配的名字(dao),也不报错
    IUserDao dao;
    @Override
    public void save() {
        System.out.println("===service的新增方法===");
        dao.save();
    }
}

 4.测试类

public class Test {
    public static void main(String[] args) {
        ApplicationContext applicationContext=new 
             ClassPathXmlApplicationContext("applicationContext.xml");
        IUserController controller = (IUserController) applicationContext
                                          .getBean("controller");
        controller.save();

运行结果:

那当我们有两个UserDaoImp时@Autowired会为我们注入哪一个类呢?

 <2.3>UserDaoImp2

@Repository
public class UserDaoImp2 implements IUserDao{

    @Override
    public void save() {
        System.out.println("===dao2的新增方法===");

    }
}

 结果:

         为什么会出现这种错误呢?

        是因为@Autowired是先按类型进行匹配的,当我们没有UserDaoImp2时,dao层只有一个实现类类型是IUserDao,所以会直接匹配到UserDaoImp,输出:“===dao1的新增方法===”。那当我们新增了一个实现类UserDaoImp2时,dao层有两个实现类类型是IUserDao,那么此时就会按名称(dao)进行匹配,且两个实现类均没有起别名,默认名称为类名且首字母小写,分别为userDaoImp和userDaoImp2,没有叫dao的,所以会报“NoUniqueBeanDefinitionException”异常。

        那我们尝试给UserDaoImp2命名为dao,会发现输出为:

        可以总结为@Autowired先按类型匹配,再按名字匹配。当没有一个类型匹配时,会产生NoSuchBeanDefinitionException异常。

其他注解

@Primary

含义:首选项,当类型冲突的情况下,此注解修饰的类被列为首选(备胎扶正)

修饰:类

注意:不能单独使用,必须与@Component....联合使用

@Repository
public class UserDaoImp implements IUserDao{

    @Override
    public void save() {
        System.out.println("===dao1的新增方法===");
    }
}
@Repository
public class UserDaoImp2 implements IUserDao{

    @Override
    public void save() {
        System.out.println("===dao2的新增方法===");

    }
}

        此时两个dao层实现类均没有进行命名,按理来说应该出现NoUniqueBeanDefinitionException错误, 但是当我们给UserDaoImp写一个@Primary注解时,会优先匹配UserDaoImp类:

@Repository
@Primary
public class UserDaoImp implements IUserDao{

    @Override
    public void save() {
        System.out.println("===dao1的新增方法===");
    }
}

运行结果:

 

@Qualifier(value="名称")

含义:按照名称装配

修饰:成员变量

注意:不能单独使用,必须与@Autowired联合使用

@Service
public class UserServiceImp  implements IUserService {
    @Autowired
    @Qualifier(value = "userDaoImp")//按名称匹配userDaoImp
    IUserDao dao;

    @Override
    public void save() {
        System.out.println("===service的新增方法===");
        dao.save();
    }
}

结果:

 

@Resource(name="名称")

含义:按照名称装配

修饰:成员变量

注意:可以单独使用

这个注解和Qualifier作用相同,只不过Resource可以单独使用:

@Service
public class UserServiceImp  implements IUserService {
    @Resource(name="userDaoImp")
    IUserDao dao;

    @Override
    public void save() {
        System.out.println("===service的新增方法===");
        dao.save();
    }
}

结果:

@Scope

含义:配置类的作用域

修饰:类

注意:不能单独使用,必须与@Component....联合使用 @Scope("prototype") @Scope("singleton") @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)

@PostConstruct

初始化,修饰方法

@PreDestroy

销毁,修饰方法

三、注解+配置类

见下篇

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

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

相关文章

联通数科如何基于Apache DolphinScheduler构建DataOps一体化能力平台

各位小伙伴晚上好&#xff0c;我是联通数字科技有限公司数据智能事业部的王兴杰。 今天&#xff0c;我将和大家聊一聊联通数字科技有限公司是如何基于Apache DolphinScheduler构建DataOps一体化能力平台的。 今天的分享主要分为三个部分&#xff1a; 关于DataOps的一些思考&a…

视觉SLAM第五讲

本讲将讨论“机器人如何观测外部世界”&#xff0c;也就是观测方程部分。而在以相机为主的视觉SLAM中&#xff0c;观测主要是指相机成像的过程。 三维世界中的一个物体反射或发出的光线&#xff0c;穿过相机光心后&#xff0c;投影在相机的成像平面上。相机的感光器件接收到光…

主机加固是什么?主机加固与产线工控安全关系

1. 需求背景 随着工业4.0的发展&#xff0c;生产线日益智能化&#xff0c;生产网已经发展成一个复杂的计算机环境。尽管这些网络通常进行了物理隔离&#xff0c;但在实际操作中仍需要与外部进行数据交互。这种交互可能导致病毒和恶意软件的入侵&#xff0c;威胁工控主机和产线…

k8s分布式存储-ceph

文章目录 Cephdeploy-ceph部署1.系统环境初始化1.1 修改主机名&#xff0c;DNS解析1.2 时间同步1.3 配置apt基础源与ceph源1.4关闭selinux与防火墙1.5 **创建** ceph **集群部署用户** cephadmin1.6分发密钥 2. ceph部署2.1 **安装** ceph 部署工具2.2 **初始化** mon **节点**…

计算机毕业设计选题推荐-小型民营加油站管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

使用 Java Swing 创建一个最大公约数计算器 GUI 应用

使用Java语言,设计一个程序,实现求取两个正整数的最大公约数。 比较基础的一个Java小程序。 1、效果展示 2、程序代码 package demo; import javax.swing.*; import java.awt.*;

用python连接mysql的方法

如何将个人主机上的mysql服务发布到公网&#xff1a;frp内网穿透 用python连接mysql的方法 方法一&#xff1a; 1.设置清华镜像站&#xff1a;从国内下载安装包&#xff0c;提高下载和安装速度 pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simp…

航向角、前轮转角、偏航角的区别及其在MPC中的使用

目录 前言一、概念解析二、三种角度在MPC中的应用三、总结四、MPC算法流程 前言 航向角、偏航角、前轮转角是车辆控制中描述方向的关键概念。本文将简要介绍它们的区别及在MPC&#xff08;模型预测控制&#xff09;中的应用。 一、概念解析 φ 为车体的航向角&#xff1b; δ…

[ACP云计算]组件介绍

一、IaaS、PaaS、SaaS 二、交换机 三、VPC 四、ECS 云服务器ECS&#xff08;Elastic Compute Service&#xff09;是阿里云提供的性能卓越、稳定可靠、弹性扩展的IaaS&#xff08;Infrastructure as a Service&#xff09;级别云计算服务。云服务器ECS免去了您采购IT硬件的前期…

jupyter项目使用Anaconda环境内核

1、创建虚拟环境 conda create --name myjupyter python3.7 2、进入虚拟环境 conda activate myjupyter 3、切换到自己jupyter notebook项目想在的目录 E: cd E:\first\project\jupyter\jupyter01 4、安装IPython内核包&#xff0c;这是Jupyter Notebook使用Python内核所必需的…

【MySQL 03】库的操作 (带思维导图)

前置&#xff1a;之后的所有的 SQL 语句中&#xff0c;凡是被中括号 [ ] 括起来的均为可选项。 &#x1f308; 一、创建数据库 数据库创建语句 创建数据库本质就是在 /var/lib/mysql 中创建一个目录。 if not exists&#xff1a;如果指定数据库不存在则创建该数据库&#xf…

[Java]面向对象-static继承

Static static表示静态&#xff0c;是Java中的一个修饰符&#xff0c;可以修饰成员方法、成员变量 静态变量&#xff1a; 被static修饰的成员变量&#xff0c;叫静态变量 特点&#xff1a; 被该类所有对象共享 调用方式&#xff1a;1.类名调用 2.对象名调用 静态方法&…

PyFluent入门之旅(8) PyFluent API 分类与区别

PyFluent提供了两种主要的API来与Ansys Fluent进行交互&#xff1a; Settings APITUI API 通过这两种接口方式&#xff0c;可以控制 Ansys Fluent 的各个方面&#xff0c;包括从网格生成到后处理的所有操作。 分类 Settings API pyFluent 的 Settings API类似于 Ansys Flu…

线性表——数据结构

线性表 文章目录 线性表线性表的定义和基本操作线性表的定义线性表的基本操作 线性表的顺序表示顺序表的定义顺序表的实现——静态分配顺序表的实现——动态分配顺序表的特点 线性表的定义和基本操作 线性表的定义 线性表&#xff08;Linear List&#xff09;的定义 ​ 线性…

略谈set与map的pair封装与进入哈希

引子&#xff1a;之前我们讲了红黑树的自实现&#xff0c;与小小的接口实现&#xff0c;那set与map的pair封装是如何实现的呢&#xff1f;&#xff0c;今天我们来一探究竟&#xff0c;而且我们也要进入新章节--哈希 对于operator--()的封装&#xff1a; 注意&#xff1a;牢记思…

动手学深度学习V2每日笔记(批量归一化、ResNet)

本文主要参考沐神的视频教程 https://www.bilibili.com/video/BV1Uv411G71b/spm_id_fromautoNext&vd_sourcec7bfc6ce0ea0cbe43aa288ba2713e56d https://cv.gluon.ai/model_zoo/classification.html 文档教程 https://zh-v2.d2l.ai/ 本文的主要内容对沐神提供的代码中个人不…

【OpenHarmony】openharmony移植到RK3568------搭建开发环境

一、关于OpenHarmony OpenHarmony是由开放原子开源基金会&#xff08;OpenAtom Foundation&#xff09;孵化及运营的开源项目&#xff0c;目标是面向全场景、全连接、全智能时代&#xff0c;基于开源的方式&#xff0c;搭建一个智能终端设备操作系统的框架和平台&#xff0c;促…

各种高端链游 区块链游戏 休闲小游戏DAPP开发

【西游闯关】-高端区块链3D手游 【我朝有马】-高端区块链3D手游 【弹弹岛2】-高端区块链3D手游

FiddlerCharles请求包导入Postman教程

前言 晓杰因开发需要经常需要使用抓包工具进行抓包然后使用POSTMAN测试&#xff0c;每次复制都很麻烦&#xff0c;就想着如何直接抓包工具中导出&#xff0c;postman导入&#xff01; Fiddler 这个有2个方案&#xff0c;第一个方案是因为第二个方案发现的&#xff01; 方案…

html+css+js网页设计 找法网2个页面(带js)ui还原度百分之90

htmlcssjs网页设计 找法网2个页面&#xff08;带js&#xff09;ui还原度百分之90 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑…