spring 学习路线梳理(二)注解

1.通过注解的方式创建bean
  1.1 定义dao层的接口和实现
public interface ILoginDao {public String login();
}@Slf4j
@Repository
public class LoginDaoImpl implements ILoginDao {public LoginDaoImpl(){System.out.println("spring create bean call");}@Overridepublic String login() {log.info("{}","login validator send  dao");return "login success !!!";}
}
1.2 定义service层的接口和实现
public interface ILoginService {public String login();
}@Slf4j
@Service("loginService")
public class LoginServiceImpl implements ILoginService , InitializingBean, DisposableBean {public ILoginDao iLoginDao;//    //通过set方法 注入 需要的dao
//    public void setiLoginDao(ILoginDao iLoginDao) {
//        this.iLoginDao = iLoginDao;
//    }
//    构造器注入LoginServiceImpl(ILoginDao iLoginDao){this.iLoginDao = iLoginDao;}@Overridepublic String login() {log.info("{}","login validator send service");iLoginDao.login();return "login success !!!";}//销毁之前的操作@Overridepublic void destroy() throws Exception {System.out.println("destroy");}//初始化之前的操作@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("afterPropertiesSet");}
}

@Component  组件注解 下面又有3个衍生注解

    定义dao的是 @Repository 

    定义service的是  @Service("loginService")  // 可以指定value,如果没有指定需要按照类型从容器中取bean

   定义controller的是 @Controller

1.3 在xml文件中配置需要扫描的包

引入扫描的 空间 context ,定义扫描的包

1.4 获取容器,从容器中拿到需要的bean
public class SpringSecurityDemoApplication {public static void main(String[] args) {//SpringApplication.run(SpringSecurityDemoApplication.class, args);ClassPathXmlApplicationContext xct= new ClassPathXmlApplicationContext("applicationContext.xml");ILoginService bean = (ILoginService) xct.getBean("loginService");String login = bean.login();System.out.println(login);xct.close();}}

如果没有在注解中指定别名,获取bean的时候会报错。需要通过类型获取bean

service注解中指定的别名注释掉

获取bean的时候按照别名获取

下面是报的错误

通过类型获取 (正常)

2.从spring 3.0开始纯注解开发,没有xml配置

将xml中的配置全部用注解的方式替换

2.1定义一个配置类
@Configuration //定义注解的配置类
@ComponentScan("com.drawing") //定义需要扫描的包
public class SpringConfig {
}
2.2 将获取容器的实现类换成通过注解的方式获取

2.3 运行正常

创建bean的方式没有变化,通过构造方式创建

2.4通过注解方式处理初始化之前的操作和销毁之前的操作

2.4 需要按照单利或多例创建类,只需要在类上加入 
@Scope("prototype") 注解指定就可以

3.自动注入需要的bean

@Slf4j
@Service
public class LoginServiceImpl implements ILoginService {//@Autowiredpublic ILoginDao iLoginDao;//    //通过set方法 注入 需要的dao
//    public void setiLoginDao(ILoginDao iLoginDao) {
//        this.iLoginDao = iLoginDao;
//    }
//    构造器注入LoginServiceImpl(ILoginDao iLoginDao){this.iLoginDao = iLoginDao;}@Overridepublic String login() {log.info("{}","login validator send service");iLoginDao.login();return "login success !!!";}
}

  留下构造器,将@Autowired注释掉可以正常运行

   将构造器和@Autowired同时注释掉,只留下 set方法 提示空指针异常,dao没有注入

   将 @Autowired  留下 构造器注释掉 是可以正常注入成功。

总结:可以通过构造器注入或者 @Autowired 加set方法注入(简写只留下@Autowired不写set方法也可以)。

4.有多个实现类的方式

4.1 定义多个dao的接口和实现
public interface ILoginDao {public String login();
}实现 类 1
@Slf4j
@Repository("ILoginDao1")
public class LoginDaoImpl implements ILoginDao {public LoginDaoImpl(){System.out.println("spring create bean call");}@Overridepublic String login() {log.info("{}","login validator send  dao 1");return "login success !!!";}
}实现 类 2@Slf4j
@Repository("ILoginDao2")
public class LoginDaoImpl2 implements ILoginDao {public LoginDaoImpl2(){System.out.println("spring create bean call");}@Overridepublic String login() {log.info("{}","login validator send  dao 2");return "login success !!!";}
}
4.2 service中的注入 编译报错

4.3 定义多个dao层的实现执行报错,提示不是唯一的

   

4.4 解决

 在service注入中加入 @Qualifier 指定注入bean的名称

5.注解管理第三方的bean

定义bean

在spring的配置文件中导入bean,就是添加到容器中。剩下就是注入使用。

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

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

相关文章

【创建型】单例模式

单例模式使用的场景:需要频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象(比如数据源、session工厂等) 1. 饿汉式(静态常量&#xf…

怎么安装行星减速电机才是正确的

行星减速电机由于其高效、精密的传动能力,广泛应用于自动化设备、机器人、机床以及其他需要精准控制的领域。正确的安装行星减速电机对于确保设备的性能与延长使用寿命至关重要。 一、前期准备 在进行行星减速电机的安装之前,必须做好充分的前期准备工作…

代码随想录算法训练营第三十四天 | 01背包问题 416.分割等和子集

01背包问题—1(dp为二维数组): 文章链接 题目链接:卡码网 46 思路: 因为有物品和背包容量两个方面,因此我们使用二维数组保存递推的结果 ① dp数组及下标的含义: dp[i][j],其中 i 是第 i 个物品&#x…

什么品牌的护眼台灯比较好?五款护眼效果比较明显的护眼台灯

在当今信息爆炸的时代背景下,挑选一款真正符合个人需求的护眼台灯,确实是一项不小的挑战。市场上品牌众多、型号繁杂,功能特点各不相同,价格区间也相当广泛,许多消费者在选购时往往感到迷茫不已。当大家询问“什么品牌…

cv.dnn.blobFromImage参数详解

例如: image cv.imread(imgs/img.png) blob cv.dnn.blobFromImage(image, scalefactor1.0, size(224, 224), mean(0, 0, 0), swapRBTrue, cropFalse) print("原始图像形状:", image.shape) print("Blob数据形状:", blob.shape)1. image 含义…

消息队列-Rabbitmq(消息发送,消息接收)

将来我们开发业务功能的时候,肯定不会在控制台收发消息,而是应该基于编程的方式。由于RabbitMQ采用了AMQP协议,因此它具备跨语言的特性。任何语言只要遵循AMQP协议收发消息,都可以与RabbitMQ交互。并且RabbitMQ官方也提供了各种不…

电脑没有下载声卡驱动怎么办?电脑声卡驱动安装方法

在日常使用电脑的过程中,我们可能会遇到电脑没有声音的问题,这往往与声卡驱动缺失或损坏有关。声卡驱动是连接电脑硬件(声卡)与操作系统之间的桥梁,确保音频信号能够正常输入输出。那么,当电脑没有声卡驱动…

人工智能与数据安全:Facebook如何应对隐私挑战

在数字时代,数据隐私和安全成为了用户和企业关注的核心问题。作为全球最大的社交媒体平台之一,Facebook面临着日益严峻的隐私挑战。近年来,频繁发生的数据泄露事件和对用户隐私的质疑,使得Facebook在保护用户数据方面倍感压力。为…

使用RabbitMQ实现微服务间的异步消息传递

使用RabbitMQ实现微服务间的异步消息传递 RabbitMQ简介 安装RabbitMQ 在Ubuntu上安装RabbitMQ 在CentOS上安装RabbitMQ 配置RabbitMQ 创建微服务 生产者服务 安装依赖 生产者代码 消费者服务 消费者代码 运行微服务 消息模式 直接模式 生产者代码 消费者代码 扇出模式 生产…

【MySQL】MySQL安装以及各种报错处理

前言: 本节内容讲述在Ubuntu环境下怎么进行MySQL的安装。 以及一些安装过程中遇到的报错如何处理的问题。 ps:注意, 本篇文章不是图形化界面的MySQL安装教程哦。想要安装图形化界面的MySQL的友友们可以另寻资源了。 目录 更新软件包列表 安装M…

Servlet 3.0 注解开发

文章目录 Servlet3.0注解开发修改idea创建注解的servlet模板内容讲解 关于servlet3.0注解开发的疑问_配置路径省略了属性urlPatterns内容讲解内容小结 Servlet3.0注解开发 【1】问题 说明:之前我们都是使用web.xml进行servlet映射路径的配置。这样配置的弊端&…

FPGA时序分析和约束学习笔记(3、Timequest时序路径详解和优化)

FPGA时序分析和约束学习笔记(3、Timequest时序路径详解和优化) Timequest中Data Path分析 Data Arrival Path clock path:时钟信号到达源寄存器时钟端口的时间 data path:数据从源寄存器Q端口出发到达目标寄存器D端口的时间 D…

windows与windows文件共享

目录 基础设置主机共享文件端设置从机接受文件端设置 基础设置 1、先确保两台电脑直接能够ping通,这是文件共享的前提,如果ping不通就去查找对应的原因,一般都是防火墙的原因。 在ping通的情况下: 2、先找到高级共享设置 3、对专…

前端页面整屏滚动fullpage.js简单使用

官网CSS,JS地址 fullPage.js/dist/fullpage.min.js at master alvarotrigo/fullPage.js GitHub fullPage.js/dist/fullpage.min.css at master alvarotrigo/fullPage.js GitHub <!DOCTYPE html> <html lang"en"><head><meta charset"…

Rust整合Elasticsearch

Elasticsearch是什么 Lucene&#xff1a;Java实现的搜索引擎类库 易扩展高性能仅限Java开发不支持水平扩展 Elasticsearch&#xff1a;基于Lucene开发的分布式搜索和分析引擎 支持分布式、水平扩展提高RestfulAPI&#xff0c;可被任何语言调用 Elastic Stack是什么 ELK&a…

opencv-day2-图像预处理1

图像预处理 在计算机视觉和图像处理领域&#xff0c;图像预处理能够提高后续处理&#xff08;如特征提取、目标检测等&#xff09;的准确性和效率。 常见的图像预处理操作&#xff1a; 图像色彩空间转换 图像大小调整 图像仿射变换 图像翻转 图像裁剪 图像二值化处理 图…

scrapy爬取名人名言

爬取名人名言&#xff1a;http://quotes.toscrape.com/ 1 创建爬虫项目&#xff0c;在终端中输入&#xff1a; scrapy startproject quotes2 创建之后&#xff0c;在spiders文件夹下面创建爬虫文件quotes.py&#xff0c;内容如下&#xff1a; import scrapy from scrapy.spi…

一文了解Linux内核I2C子系统,驱动苹果MFI加密芯片

版本 日期 作者 变更表述 1.0 2024/10/27 于忠军 文档创建 背景&#xff1a;由于苹果有一套MFI IAP2的蓝牙私有协议&#xff0c;这个协议是基于BR/EDR的RFCOMM自定义UUID来实现IAP2协议的通信&#xff0c;中间会牵扯到苹果加密芯片的I2C读取&#xff0c;所以我们借此机…

Spring之依赖注入(DI)和控制反转(IoC)——配置文件、纯注解

依赖注入 依赖注入(Dependency Injection&#xff0c;简称 DI)与控制反转(loC)的含义相同&#xff0c;只不过这两 个称呼是从两个角度描述的同一个概念。对于一个 Spring 初学者来说&#xff0c;这两种称呼很难理解, 下面我们将通过简单的语言来描述这两个概念。 当Java对象&…

Ubuntu 22.04安装部署

一、部署环境 表 1‑1 环境服务版本号系统Ubuntu22.04 server lts运行环境1JDK1.8前端WEBNginx1.8数据库postgresqlpostgresql13postgis3.1pgrouting3.1消息队列rabbitmq3.X(3.0以上)运行环境2erlang23.3.3.1 二、安装系统 2.1安装 1.安装方式&#xff0c;选第一条。 2.选择…