十、Spring IoC注解式开发

news2025/2/26 9:55:41

1 声明Bean的注解


负责声明Bean的注解,常见的包括四个:
  • @Component
  • @Controller
  • @Service
  • @Repository

@Controller、@Service、@Repository这三个注解都是@Component注解的别名。
也就是说:这四个注解的功能都一样。用哪个都可以。

只是为了增强程序的可读性,建议:

  • 控制器类上使用:Controller
  • service类上使用:Service
  • dao类上使用:Repository

他们都是只有一个value属性。value属性用来指定bean的id,也就是bean的名字

2 Spring注解的使用


如何使用以上的注解呢?
  • 第一步:加入aop的依赖

    当加入spring-context依赖之后,会关联加入aop的依赖。

    在这里插入图片描述

  • 第二步:在配置文件中添加context命名空间

    <?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 http://www.springframework.org/schema/context/spring-context.xsd">
    </beans>
    
  • 第三步:在配置文件中指定扫描的包

    <!--给spring框架指定要扫描的包-->
    <context:component-scan base-package="com.powernode.spring6.bean"/>
    
  • 第四步:在Bean类上使用注解

    package com.powernode.spring6.bean;
    
    import org.springframework.stereotype.Component;
    
    @Component("userBean")
    public class User {
    }
    

    以上注解就相当于以下这个配置信息:

    <bean id="userBean" class="com.powernode.spring6.bean.User"/>
    

    测试

    @Test
        public void testBeanComponent(){
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
            User user = applicationContext.getBean("userBean", User.class);
            System.out.println(user);
        }
    

注解的属性名是value,那么value是可以省略的。
如果把value属性全部省略,Bean有默认的名称:Bean类名首字母小写。

如果是多个包有两种解决方案:
第一种:在配置文件中指定多个包,用逗号隔开。
第二种:指定多个包的共同父包。

<!--多个包,使用,隔开-->
<context:component-scan base-package="com.powernode.spring6.bean, com.powernode.spring6.dao"/>
<!--多个包,也可以指定这多个包共同的父包,牺牲一部分效率-->
<context:component-scan base-package="com.powernode.spring6"/>

3 选择性实例化Bean

use-default-filters=“true” 表示:使用spring默认的规则,只要有Component、Controller、Service、Repository中的任意一个注解标注,则进行实例化。

use-default-filters=“false” 表示:不再spring默认实例化规则,即使有Component、Controller、Service、Repository这些注解标注,也不再实例化。

<!--
	 第一种解决方案:
       use-default-filters="false"
       如果这个属性是false,表示com.powernode.spring6.bean包下所有的带有声明Bean的注解全部失效。@Component @Controller @Service @Repository全部失效。
-->
<context:component-scan base-package="com.powernode.spring6.bean" use-default-filters="false">
	<!--包含-->
    <!--只有@Repository @Service被包含进来,生效-->
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>

<!--
    第二种解决方案:
        use-default-filters="true"
        如果这个属性的值是true,表示com.powernode.spring6.bean下的所有的带有声明Bean的注解全部生效。

        use-default-filters="true" 默认值就是true,不用写。
-->
<context:component-scan base-package="com.powernode.spring6.bean">
    <!--排除掉-->
    <!--@Controller失效-->
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

4 负责注入的注解


给Bean属性赋值需要用到这些注解:
  • @Value

  • @Autowired

  • @Qualifier

  • @Resource

    1 @Value

    当属性的类型是简单类型时,可以使用@Value注解进行注入。

    使用@Value注解注入的话,可以用在属性上,并且可以不提供setter方法

    // 使用@Value注解注入的话,可以用在属性上,并且可以不提供setter方法
    @Value("com.mysql.cj.jdbc.Driver")
    private String  driver;
    @Value("jdbc:mysql://localhost:3306/spring6")
    private String  url;
    @Value("root")
    private String  username;
    @Value("root")
    private String  password;
    

    @Value注解也可以使用在setter方法上

    private String  driver;
    private String  url;
    private String  username;
    private String  password;
    // @Value注解也可以使用在setter方法上
    @Value("com.mysql.cj.jdbc.Driver")
    public void setDriver(String driver) {
        this.driver = driver;
    }
    @Value("jdbc:mysql://localhost:3306/spring6")
    public void setUrl(String url) {
        this.url = url;
    }
    @Value("root")
    public void setUsername(String username) {
        this.username = username;
    }
    @Value("root")
    public void setPassword(String password) {
        this.password = password;
    }
    

    @Value注解也可以用在构造方法的形参上

    private String  driver;
    private String  url;
    private String  username;
    private String  password;
    // @Value注解也可以用在构造方法的形参上
    public MyDataSource(@Value("com.mysql.cj.jdbc.Driver") String driver, @Value("jdbc:mysql://localhost:3306/spring6") String url, @Value("root") String username,@Value("root") String password) {
        this.driver = driver;
        this.url = url;
        this.username = username;
        this.password = password;
    }
    

    2 @Autowired与@Qualifier

    @Autowired注解可以用来注入非简单类型。被翻译为:自动连线的,或者自动装配。
    单独使用@Autowired注解,默认根据类型装配。【默认是byType】

    OrderDao接口

    package org.powernode.dao;
    
    public interface OrderDao {
        void insert();
    }
    

    OrderDao接口的实现类

    package org.powernode.dao.impl;
    
    import org.powernode.dao.OrderDao;
    import org.springframework.stereotype.Repository;
    
    @Repository("orderDaoImplForMySQL")
    public class OrderDaoImplForMySQL implements OrderDao {
        @Override
        public void insert() {
            System.out.println("MySQL数据库正在保存订单信息....");
        }
    }
    

    OrderService

    package org.powernode.service;
    
    import org.powernode.dao.OrderDao;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service("orderService")
    public class OrderService {
    
        // @Autowired注解使用的时候,不需要指定任何属性,直接使用
        // 根据类型byType进行自动装配
        @Autowired
        private OrderDao orderDao;
    
        public void generate(){
            orderDao.insert();
        }
    }
    

    配置包扫描

    <?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 http://www.springframework.org/schema/context/spring-context.xsd">
    
        <context:component-scan base-package="org.powernode"/>
    </beans>
    

    测试程序

    @Test
        public void testAutowired(){
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-autowired.xml");
            OrderService orderService = applicationContext.getBean("orderService", OrderService.class);
            orderService.generate();
        }
    

    @Autowired注解默认是byType进行注入的,也就是说根据类型注入的,如果以上程序中,UserDao接口如果有多个实现类,会出现错误,错误信息中说:不能装配,UserDao这个Bean的数量大于1.

    怎么解决这个问题?byName,根据名称进行装配了。
    @Autowired注解和@Qualifier注解联合起来才可以根据名称进行装配,在@Qualifier注解中指定Bean名称。

    package org.powernode.service;
    
    import org.powernode.dao.OrderDao;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Service;
    
    @Service("orderService")
    public class OrderService {
        //  @Autowired和@Qualifier联合使用,可以根据名字自动装配
        @Autowired
        @Qualifier("orderDaoImplForMySQL")
        private OrderDao orderDao;
    
        public void generate(){
            orderDao.insert();
        }
    }
    


    @Autowired注解可以出现的位置:属性上、构造方法上、构造方法的参数上、setter方法上。

    当带参数的构造方法只有一个,并且构造方法上的参数和属性能够对应上,@Autowired注解可以省略。

    3 @Resource

    @Resource注解也可以完成非简单类型注入。那它和@Autowired注解有什么区别?

    • @Resource注解是JDK扩展包中的,也就是说属于JDK的一部分。所以该注解是标准注解,更加具有通用性。(JSR-250标准中制定的注解类型。JSR是Java规范提案。)
    • @Autowired注解是Spring框架自己的。
    • @Resource注解默认根据名称装配byName,未指定name时,使用属性名作为name。通过name找不到的话会自动启动通过类型byType装配。
    • @Autowired注解默认根据类型装配byType,如果想根据名称装配,需要配合@Qualifier注解一起用。
    • @Resource注解用在属性上、setter方法上。
    • @Autowired注解用在属性上、setter方法上、构造方法上、构造方法参数上。

    引入依赖

    Spring6+版本使用这个依赖

    <dependency>
      <groupId>jakarta.annotation</groupId>
      <artifactId>jakarta.annotation-api</artifactId>
      <version>2.1.1</version>
    </dependency>
    

    StudentDao接口

    package cn.powernode.dao;
    
    public interface StudentDao {
        void deleteById();
    }
    

    StudentDao接口的实现类

    package cn.powernode.dao.impl;
    
    import cn.powernode.dao.StudentDao;
    import org.springframework.stereotype.Repository;
    
    @Repository("studentDaoImplForMySQL")
    public class StudentDaoImplForMySQL implements StudentDao {
        @Override
        public void deleteById() {
            System.out.println("MySQL正在删除学生信息...");
        }
    }
    

    StudentService

    package cn.powernode.service;
    
    import cn.powernode.dao.StudentDao;
    import jakarta.annotation.Resource;
    import org.springframework.stereotype.Service;
    
    @Service("studentService")
    public class StudentService {
    
        @Resource(name = "studentDaoImplForMySQL")
        private StudentDao studentDao;
    
        /*@Resource(name = "studentDaoImplForMySQL")
        public void setStudentDao(StudentDao studentDao) {
            this.studentDao = studentDao;
        }*/
    
        public void deleteStudent(){
            studentDao.deleteById();
        }
    }
    

    配置包扫描

    <?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 http://www.springframework.org/schema/context/spring-context.xsd">
    
        <context:component-scan base-package="cn.powernode"/>
    </beans>
    

    测试程序:

    @Test
    public void testResource(){
         ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-resource.xml");
         StudentService studentService = applicationContext.getBean("studentService", StudentService.class);
         studentService.deleteStudent();
     }
    

    @Resource注解:默认byName注入,没有指定name时把属性名当做name,根据name找不到时,才会byType注入。byType注入时,某种类型的Bean只能有一个。

5 全注解式开发

写一个配置类来代替配置文件。

package cn.powernode;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * 编写一个类代替Spring框架的配置文件
 */
@Configuration
// 组件扫描
@ComponentScan({"cn.powernode.dao", "cn.powernode.service"})
public class Spring6Config {
}

编写测试程序:不再new ClassPathXmlApplicationContext()对象了。
new AnnotationConfigApplicationContext()对象

@Test
public void testNoXML(){
    ApplicationContext applicationContext= new AnnotationConfigApplicationContext(Spring6Config.class);
    StudentService studentService = applicationContext.getBean("studentService", StudentService.class);
    studentService.deleteStudent();
}

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

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

相关文章

CSS奇思妙想之-利用CSS裁剪(clip-path)完成各种图形

在日常开发当中&#xff0c;如果想要开发多边形&#xff0c;一般都需要多个盒子或者伪元素的帮助&#xff0c;有没有一直办法能只使用一个盒子实现呢&#xff1f; 有的&#xff1a;css裁剪 clip-path介绍 css裁剪&#xff08;clip-path&#xff09;这个属性平时率非常低。但是…

Submodule命令:android如何将自己项目中的某个Module作为gitlab中第三方公共库

一、创建远程公共库 1、Android Studio创建本地仓库 创建一个新的module 在新建module中添加代码(此处示例代码) 右击新建的module&#xff0c;打开新建module的命令行界面&#xff0c; 因为我们只上传这个module的代码&#xff0c;而不是整个项目的代码 命令行中输入以下命令…

2023年03月IDE流行度最新排名

点击查看最新IDE流行度最新排名&#xff08;每月更新&#xff09; 2023年03月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多&#xff0c;这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&am…

【vue】环境安装与实例创建

vue是一套用于构建前端界面的框架。 文章目录1. vue环境安装2. 创建项目vue init创建项目Vite创建项目vue create创建项目vue ui创建项目3. 打包项目1. vue环境安装 首先安装nodejs并配置npm国内镜像&#xff1a;https://zhuanlan.zhihu.com/p/442215189 升级或安装cnpm并查看…

Java 字符编码

编码&#xff1a;数据存储进计算机中需要转换为二进制存储&#xff0c;这个过程就是编码。 解码&#xff1a;计算机读取数据并展示在页面上&#xff0c;需要将二进制转换为人类语言的过程&#xff0c;叫做解码。 乱码&#xff1a;如果编码和解码时使用的码表不一样&#xff0c;…

ChatGPT火爆,元宇宙“熄火”?别操之过急,也别敷衍了事

近期&#xff0c;在ChatGPT火爆的同时&#xff0c;元宇宙“遇冷”的消息引起关注。据科技圈流传&#xff0c;大量元宇宙聊天群一夜之间改名为ChatGPT聊天群。ChatGPT火爆出圈导致元宇宙“熄火”&#xff0c;真的是这样吗&#xff1f;ChatGPT与元宇宙二者有怎样的底层逻辑关联&a…

Linux进程信号(产生、保存、处理)/可重入函数概念/volatile理解/SIGCHLD信号

首先区分一下Linux信号跟进程间通信中的信号量&#xff0c;它们的关系就犹如老婆跟老婆饼一样&#xff0c;没有一毛钱的关系。 信号的概念 信号的概念&#xff1a;信号是进程之间事件异步通知的一种方式&#xff0c;属于软中断。比如&#xff1a;红绿灯是一种信号&#xff0c…

机器学习:基于神经网络对用户评论情感分析预测

机器学习&#xff1a;基于神经网络对用户评论情感分析预测 作者&#xff1a;AOAIYI 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;AOAIYI首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f4…

深入理解RDBMS-学习笔记

1 经典案例 1.1 红包雨 1.2 事务ACID 1.3 红包雨与ACID 1.3.1 原子性 1.3.2 一致性 1.3.3 隔离性 1.3.4 持久化 1.4 红包雨与高并发 1.5 红包雨与高可靠 2 发展历史 2.1 前DBMS时代 2.1.1 人工管理 2.1.2 文件系统 1950s&#xff0c;现代计算机的雏形基本出现。1956年IB…

怎样对一张图像进行直方图均衡化?(或者图像均衡化代码?)

怎样对一张图像进行直方图均衡化&#xff1f;&#xff08;或者图像均衡化代码&#xff1f;&#xff09; 图像增强概述 图像增强是有目的地强调图像的整体或局部特性&#xff0c;将原来不清晰的图像变得清晰或强调某些感兴趣的特征&#xff0c;扩大图像中不同物体特征之间的差…

认识异或运算

1.什么是异或运算 异或运算是位运算的一种&#xff0c;符号为&#xff1a;^ 运算规则为&#xff1a;相同为0&#xff0c;不同为1 例如 性质&#xff1a; N ^ 0 N N ^ N 0 A ^ B B ^ A (A ^ B) ^ C A ^ (B ^ C)N ^ 0 N public class XorOperation {public static void …

【算法基础】排序 插入、归并、堆、快速 升序+降序

目录 1.排序 1.1 插入排序 1.2 归并排序 1.3 推排序 1.4 快速排序 1.排序 1.1 插入排序 时间复杂度&#xff1a;O(n)~O(n*n) 空间复杂度&#xff1a;O(1) 稳定 步骤&#xff1a; 1.设第一个元素为有序列。 2.取有序列后面的一个元素。 3.将该元素插入到有序列中的正确位…

【C语言学习笔记】:一维数组指针,二维数组指针

数组&#xff08;Array&#xff09;是一系列具有相同类型的数据的集合&#xff0c;每一份数据叫做一个数组元素&#xff08;Element&#xff09;。数组中的所有元素在内存中是连续排列的&#xff0c;整个数组占用的是一块内存。以int arr[] { 99, 15, 100, 888, 252 };为例&am…

Linux | 调试器GDB的详细教程【纯命令行调试】

文章目录一、前言二、调试版本与发布版本1、见见gdb2、程序员与测试人员3、为什么Release不能调试但DeBug可以调试❓三、使用gdb调试代码1、指令集汇总2、命令演示⌨ 行号显示⌨ 断点设置⌨ 查看断点信息⌨ 删除断点⌨ 开启 / 禁用断点⌨ 运行 / 调试⌨ 逐过程和逐语句⌨ 打印 …

C/C++开发,无可避免的多线程(篇二).thread与其支持库

一、原子类型与原子操作 1.1 原子类型与操作介绍 在前一篇博文中&#xff0c;多线程交互示例代码中&#xff0c;给出了一个原子类型定义&#xff1a; // 原子数据类型 atomic_llong total {0}; 那么什么事原子数据类型呢&#xff0c;和c的基础数据类型有什么不同呢&#xff1a…

实验一 Python编程基础

目录 一、实验目标 二、实验内容 1.绘制如下图形 &#xff0c;一个正方形&#xff0c;内有三个红点&#xff0c;中间红点在正方形中心。 2.使用turtle库绘制如下图形&#xff1a; 3.绘制奥运五环图 4.回文问题 5.身份证性别判别 6.数据压缩 7.验证哥德巴赫猜想 8.使…

JVM常用指令

JVM常用指令1.准备工作2.jps3. jconsole4.jstat5.jstack6.jmap7.jvisualvm工具8.自动dump内存信息1.准备工作 在idea中编写代码 public class JVMTest {Testpublic void test() throws InterruptedException {while (true) {Thread.sleep(1000);System.out.println(123);}} }…

Unity 入门精要01---标准光照模型

本节基础知识结构 基础光照部分 环境光 在标准光照模型中&#xff0c;我们会环境光来代替间接光照 Cambient g amient 我们可以在Windows->Rendering->Lighting->Enviroment进行修改Ambient 的Color 自发光 直接在最后片元着色器输出颜色之前把材质的自发光颜色添…

深圳大学计软《面向对象的程序设计》实验13 运算符重载

A. 三维坐标点的平移&#xff08;运算符重载&#xff09; 题目描述 定义一个三维点Point类&#xff0c;利用友元函数重载"“和”–"运算符&#xff0c;并区分这两种运算符的前置和后置运算。 要求如下&#xff1a; 1.实现Point类&#xff1b; 2.编写main函数&a…

关于2023年造林施工、林业设计资质,新办、年审的最新通知!

一、资质类别省林学会本年度开展认定的资质种类包括&#xff1a;造林绿化类&#xff08;含施工资质、监理资质&#xff09;、林业有害生物防治类&#xff08;含防治资质、监理资质&#xff09;和林业调查规划设计类。二、认定标准资质认定执行以下标准&#xff1a;1.造林绿化施…