Spring:使用注解进行Spring开发(@Component、@Configuration、@ComponentScan、@Autowired等)

news2024/11/23 13:21:26

@Component、@Configuration、@ComponentScan、@Autowired、@Scope、@Value、@Resource、@Bean、@Qualifier、@PropertySource等注解

1. 注解和配置文件applicationContext.xml配合使用

现在有一个接口类Book3Dao、和其实现类Book3DaoImpl,利用注解和配置文件在测试类上调用其下的save方法。
Book3Dao

package com.bh.dao;

public interface Book3Dao {
    void save();
}

Book3DaoImpl

package com.bh.dao.Impl;

import com.bh.dao.Book3Dao;

@Component(value = "bookDao_1")
public class Book3DaoImpl implements Book3Dao {
    public void save() {
        System.out.println("已保存数据。。 Book3DaoImpl");
    }
}

【注】:Component里可以写value属性值,也可以不写,写上之后在测试类获取这个bean,就可以使用方法getBean(value属性值)获取Bean;否则只能通过getBean(Book3Dao.class)获取。
applicationContext.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
                http://www.springframework.org/schema/context/spring-context.xsd

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

文件结构
请添加图片描述

测试代码

package com.bh;


import com.bh.dao.Book3Dao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test3 {

    public static void main(String[] args) {

        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        Book3Dao bookDao_1 = ctx.getBean("bookDao_1", Book3Dao.class);

        bookDao_1.save();

    }
}

运行结果:
请添加图片描述
上面这种实现方式还需要配合配置文件applicationContext.xml一起使用才能运行出结果,下面使用纯注解开发模式,实现上述效果。【注】:记得把这个注释掉。
请添加图片描述

2. 纯注解开发模式

不使用配置文件applicationContext.xml,需要一个Java配置类进行代替。
SpringConfig配置类

package com.bh.config;

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

@Configuration
@ComponentScan("com.bh")
public class SpringConfig {

}

测试代码

package com.bh;

import com.bh.config.SpringConfig;
import com.bh.dao.Book3Dao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test3 {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        Book3Dao bookDao_1 = ctx.getBean("bookDao_1", Book3Dao.class);
        bookDao_1.save();
    }
}

注意观察这个测试代码和上面那个测试代码之间的不同,运行结果和上述一致。
关于Bean的单例和非单例设置,在Java类上加注解==@Scope==,并设置值singletonprototype,前者为单例,后者为非单例,如下:
请添加图片描述

请添加图片描述
请添加图片描述

请添加图片描述

3. 使用注解自动装配

现在在2的基础上新建接口Book3Service和其实现类Book3ServiceImpl,在Book3ServiceImpl类中使用自动装配的方式,从而使Book3Dao对象进行注入,如下:
Book3Service

package com.bh.service;

public interface Book3Service {

    void save();
}

Book3ServiceImpl

package com.bh.service.Impl;

import com.bh.dao.Book3Dao;
import com.bh.service.Book3Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Book3ServiceImpl implements Book3Service {

    @Autowired
    private Book3Dao book3Dao;

    public void save() {
        book3Dao.save();
    }
}

运行结果:
请添加图片描述
现在如果我新建一个java类Book4DaoImpl,让其实现Book3Dao接口(一般不会出现这种),如下:
Book4DaoImpl

package com.bh.dao.Impl;

import com.bh.dao.Book3Dao;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope("prototype")  // 非单例
public class Book4DaoImpl implements Book3Dao {

    public void save() {
        System.out.println("已保存数据。。 Book4DaoImpl");
    }
}

之后再运行,就会出现报错,因为我这里定义了两个Book3Dao的bean,spring不知道是哪一个bean。
请添加图片描述
报错信息为:
No qualifying bean of type ‘com.bh.dao.Book3Dao’ available: expected single matching bean but found 2: book3DaoImpl,book4DaoImpl

解决办法就是再加一个注解@Qualifier,并设置其value值,如下:
请添加图片描述
此时运行没有问题,也可以使用注解@Resource,并设置其name值,如下:
请添加图片描述
此时运行也是没有问题的。需要注意的是@Qualifier需要和@Autowired注解一起使用才行。

4. 第三方bean的定义

现在定义一个DruidDataSource的bean,直接再配置类上进行定义即可,如下:
SpringConfig

package com.bh.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;

@Configuration
@ComponentScan("com.bh")
public class SpringConfig {

    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc::mysql://localhost:3306/d_test");
        ds.setUsername("root");
        ds.setPassword("sxx123");

        return ds;
    }

}

测试代码

package com.bh;


import com.bh.config.SpringConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import javax.sql.DataSource;

public class Test3 {

    public static void main(String[] args) {

        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        DataSource bean = ctx.getBean(DataSource.class);
        System.out.println(bean);

    }
}

如果想读取properties文件相关配置信息,可以在Java配置类上加上@PropertySource注解,用来读取指定的peroperties文件,然后使用@Value注解进行占位符注入数据即可,如下:
jdbc.properties
请添加图片描述
SpringConfig

package com.bh.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import javax.sql.DataSource;

@Configuration
@ComponentScan("com.bh")
@PropertySource("classpath:jdbc.properties")
public class SpringConfig {

    @Value("${jdbc.driver}")
    private String driverClassName;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String userName;
    @Value("${jdbc.password}")
    private String password;

    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(driverClassName);
        ds.setUrl(url);
        ds.setUsername(userName);
        ds.setPassword(password);

        System.out.println(driverClassName);
        System.out.println(url);
        System.out.println(userName);
        System.out.println(password);
        return ds;
    }

}

运行结果:
请添加图片描述

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

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

相关文章

【Linux网络】网络应用层的 http 和 https协议

文章目录 1、http协议1.1 认识URL1.2 http协议格式1.3 http的方法&#xff08;GET和POST&#xff09;1.4 状态码1.5 cookie1.6 短连接和长连接 2、https协议2.1 常见的加密方式2.2 探究https协议的加密2.3 CA证书 1、http协议 在之前学习序列化和反序列化的时候&#xff0c;认…

Linux 之 vi 文本编辑器(二)

1、文本编辑器简介 Linux 中最常用的文本编辑器&#xff1a; vi&#xff1a;类 Unix 系统中默认的文本编辑器 vim&#xff1a;vi 编辑器的增强版本&#xff0c;习惯上也称 vi vi 文本编辑器的作用和特性&#xff1a; vi 可以执行插入、删除、查找、替换等众多文本操作&…

网络计算模式复习(四)

MapReduce MapReduce分布式处理技术、分布式的文件系统GFS、结构化的BigTable存储系统是Google的三个核心技术。 Map-Reduce&#xff1a;用于大规模数据集的并行计算。 &#xff08;分而治之&#xff09;将要执行的问题拆解成Map&#xff08;映射&#xff09;和Reduce&#x…

SpringBoot整合FreeMarker

一、FreeMarker简述 在线文档&#xff1a;http://freemarker.foofun.cn/ FreeMarker 也是一款模板引擎技术&#xff0c;它是一种基于模板和要改变的数据&#xff0c;并用来生成输出文本(HTML网页&#xff0c;电子邮件&#xff0c;配置文件&#xff0c;源代码等)的通用工具。当然…

创建一个react项目

文章目录 1&#xff1a;命令行输入2&#xff1a;在vs的终端中输入npm start 来启动项目3&#xff1a;删除src目录中的干扰项4&#xff1a;去掉index.js中的严格模式节点JSX介绍JSX中使用js表达式原生js调用三元运算符列表渲染条件渲染三元表达式逻辑&&运算 分支逻辑类名…

Setting up SSH Host ...问题解决

一、问题可能原因&#xff1a; 网速问题导致下载过慢&#xff0c;超时 二、解决方式&#xff1a;手动下载安装 1、确定VSCode commit id&#xff0c;如下图所示 2、拼接请求&#xff0c;下载vscode server包 Arm&#xff1a;https://update.code.visualstudio.com/commit:换…

【AUTOSAR】【通信安全】CRC

目录 一、概述 二、功能说明 2.1 通用行为 2.2 8位CRC计算 2.2.1 8位SAE J1850 CRC计算 2.2.2 8位0x2F多项式CRC计算 2.3 16位CRC计算 2.3.1 16位CCITT-FALSE CRC16 2.3.2 16位0x8005多项式CRC计算 2.4 32位CRC计算 2.4.1 32位以太网CRC计算 2.4.2 32位0xF4ACFB13多…

AIGC产业研究报告 2023——图像生成篇

易观&#xff1a;今年以来&#xff0c;随着人工智能技术不断实现突破迭代&#xff0c;生成式AI的话题多次成为热门&#xff0c;而人工智能内容生成&#xff08;AIGC&#xff09;的产业发展、市场反应与相应监管要求也受到了广泛关注。为了更好地探寻其在各行业落地应用的可行性…

jvm之常用命令行工具

写在前面 本文已起看下给我们的Java程序看病常用到的工具都有哪些&#xff0c;通过工具得到指标&#xff0c;通过指标分析病情&#xff0c;从而给出对应的治疗方案。 1&#xff1a;jps/jinfo 用来获取运行的jvm进程信息&#xff0c;一般我们使用该命令来获取进程号&#xff…

CTF权威指南 笔记 -第二章二进制文件- 2.4 -动态链接

目录 静态文件的缺点 动态链接 位置无关代码 延迟绑定 _dl_runtime_reslove 函数定义 深入审视 静态文件的缺点 随着可执行文件的增加 静态链接带来的浪费空间问题就会愈发严重 如果大部分可执行文件都需要glibc 那么在链接的时候就需要把 libc.a链接进去 如果一个libc…

Spark大数据处理讲课笔记3.6 RDD容错机制

文章目录 零、本讲学习目标一、RDD容错机制&#xff08;一&#xff09;血统方式&#xff08;二&#xff09;设置检查点方式 二、RDD检查点&#xff08;一&#xff09;RDD检查点机制&#xff08;二&#xff09;与RDD持久化的区别&#xff08;三&#xff09;RDD检查点案例演示 三…

Matlab 多项式拟合

一、线性 1、多项式 corrcoef函数 corrcoef函数用来计算矩阵相关系数。 (1)、corrcoef(x)&#xff1a;若x为一个矩阵&#xff0c;返回的则是一个相关系数矩阵。 (2)、corrcoef(x,y)&#xff1a;计算列向量x、y的相关系数&#xff0c;要求x、y具有相等的元素个数。如果x、y是矩…

2023河南土著双非硕士——毕业季秋招春招就业经验分享(仅限于在河南找工作,毕业想留河南)

作为一名河南土生土长的人&#xff0c;本硕皆就读于河南某双非一本&#xff0c;是一个实打实的河南土著&#xff0c;河南作为互联网就业的贫困环境&#xff0c;相较于CSDN博客上那么多动不动就腾讯、阿里、字节等大厂的就业经验分享&#xff0c;我更想分享一下我在河南省内找工…

百度文心一言正式亮相,数说故事受邀成为首批内测企业

3月16日下午&#xff0c;百度在北京召开新闻发布会&#xff0c;正式推出基于百度新一代大语言模型的生成式AI产品——文心一言&#xff0c;百度创始人、董事长兼首席执行官李彦宏现场展示了文心一言在文学创作、商业文案创作、数理推算、中文理解、多模态生成五个使用场景中的综…

卖期权的时候,我们在卖什么?

一直在思考一个问题&#xff0c;卖期权到底是怎么回事&#xff1f;卖实值期权、平值期权、虚值期权背后的本质有什么区别&#xff1f;卖近期的和远期的期权背后的本质又是什么?我们用沪深300指数期权来研究一下。 我们先从数据上来直观感受一下。上面这个表格是2020-12-09日这…

基于R语言的贝叶斯时空数据模型实践技术

时间&#xff0d;空间数据&#xff08;以下简称“时空数据”&#xff09;是最重要的观测数据形式之一&#xff0c;很多科学研究的数据都以时空数据的形式得以呈现&#xff0c;而科学研究目的可以归结为挖掘时空数据中的规律。另一方面&#xff0c;贝叶斯统计学作为与传统统计学…

【OpenCV】 2D-2D:对极几何算法原理

2D-2D匹配: 对极几何 SLAM十四讲笔记1 1.1 对极几何數學模型 考虑从两张图像上观测到了同一个3D点&#xff0c;如图所示**。**我们希望可以求解相机两个时刻的运动 R , t R,t R,t。 假设我们要求取两帧图像 I 1 , I 2 I_1,I_2 I1​,I2​之间的运动,设第一帧到第二帧的运动为…

MiniGPT-4部署过程

文章目录 项目背景部署过程环境配置与文件准备部署推理报错1报错2 项目背景 2023年4月19日&#xff0c;开源项目MiniGPT-4发布&#xff0c;该项目是由KAUST&#xff08;沙特阿卜杜拉国王科技大学&#xff09;&#xff0c;是几位博士开发的。 项目地址&#xff1a;https://gith…

Spark大数据处理讲课笔记3.4 理解RDD依赖

文章目录 零、本讲学习目标一、RDD依赖二、窄依赖&#xff08;一&#xff09;map()与filter()算子&#xff08;二&#xff09;union()算子&#xff08;三&#xff09;join()算子 三、宽依赖&#xff08;一&#xff09;groupBy()算子&#xff08;二&#xff09;join()算子&#…

字符设备驱动

字符设备就是按字节流进行读写的设备&#xff0c;读写数据分先后顺序&#xff0c;如点灯&#xff0c;IIC&#xff0c;SPI&#xff0c;LCD等都是字符设备&#xff0c;这些设备的驱动就叫字符设备驱动。 include/linux/fs.h中 file_operations 结构体为内核驱动操作函数集合&…