[黑马程序员SSM框架教程] Spring-22 注解开发依赖注入

news2024/11/27 0:22:57

1.自动装配是基于暴力反射对私有属性进行装配的,所以不需要setter方法。打破了IOC提供对象,我提供入口的思想。现在不用提供入口也能实现。
2. @Qualifier必须依赖注解@Autowired,当自动装配的接口类型有多个实现类时使用,
3. @Autowired就相当于bean里面的绑定,将服务层中添加的数据层接口与数据层中注册对应的实现类进行绑定的过程。注解中没有对应的id名是因为默认按接口类型装配,所以不需要取名字就能自动绑定。很神奇。
具体实现代码:(自动装配,按id自动装配,简单类型装配,文件载入装配)

  • 导入框架依赖(省略)
  • 项目结构
    在这里插入图片描述
  • 配置类
package com.ljh.config;

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

@Configuration
@ComponentScan("com.ljh")
public class SpringConfig {
    //@Configuration注解声明配置类,相当于配置文件
    //@ComponentScan("com.ljh") 相当于扫描bean的位置,收集所有bean对象
}
  • dao层接口省略
  • dao层实现类1
package com.ljh.dao.impl;

import com.ljh.dao.BookDao;
import org.springframework.stereotype.Repository;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
//@Repository("bookDao1")。数据层注解,可以不加名字
//一些生命周期配置
@Repository("bookDao1")
public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("Dao层数据集");
    }
    @PostConstruct
    public void init(){
        System.out.println("init");

    }
    @PreDestroy
    public void des(){
        System.out.println("des");
    }
}
  • 同一接口dao层实现类,仅以输出做区分,体现后面的@Qualifier的作用
  • 加入了@Value(“ljh”)标签进行简单类型的依赖注入。
package com.ljh.dao.impl;

import com.ljh.dao.BookDao;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Repository;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
//@Repository("bookDao1")。数据层注解,可以不加名字
//一些生命周期配置
@Repository("bookDao2")
public class BookDaoImpl2 implements BookDao {
    @Value("ljh")
    private String name;
    public void save() {
        System.out.println("Dao2层数据集 "+name);
    }
    @PostConstruct
    public void init(){
        System.out.println("init2");

    }
    @PreDestroy
    public void des(){
        System.out.println("des2");
    }
}

  • 服务层实现类
package com.ljh.service.impl;

import com.ljh.dao.BookDao;
import com.ljh.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
//@Service服务层实现类注解
@Service
public class BookServiceImpl implements BookService {
    //@Autowired DI依赖,用于在ioc容器中找到对应bean,进行注入
    //@Qualifier("bookDao1")搭配@Autowired使用,用于装配指定实现类id
    @Autowired
    @Qualifier("bookDao1")
    private BookDao bookDao1;
    @Autowired
    @Qualifier("bookDao2")
    private BookDao bookDao2;
    public void save() {
        System.out.println("启动服务层");
        bookDao1.save();
        bookDao2.save();
    }
}
  • 启动类
package com.ljh;

import com.ljh.config.SpringConfig;
import com.ljh.service.BookService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class app {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext atx = new AnnotationConfigApplicationContext(SpringConfig.class);
        BookService bean = atx.getBean(BookService.class);
        bean.save();
        atx.close();
    }
}
  • 运行结果:可以看到是先开启所有bean生命周期再根据名字进行依赖注入。最后统一关闭。解释了@Qualifier可以将相同接口的同一类型不同注解的实现类进行分别指定的装配。
    (https://img-blog.csdnimg.cn/6e3b9e68e1944677b5caeaf6793e4006.png)

  • 载入外部文件
    在资源文件夹命名jdbc.properties文件

name = ljh
  • 配置类中载入
    @PropertySource(“jdbc.properties”)
package com.ljh.config;

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

@Configuration
@ComponentScan("com.ljh")
@PropertySource("jdbc.properties")
public class SpringConfig {
    //@Configuration注解声明配置类,相当于配置文件
    //@ComponentScan("com.ljh") 相当于扫描bean的位置,收集所有bean对象
}
  • 将实现类中 @Value(“ljh“)改成 @Value(”${name}")
package com.ljh.dao.impl;

import com.ljh.dao.BookDao;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Repository;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
//@Repository("bookDao1")。数据层注解,可以不加名字
//一些生命周期配置
@Repository("bookDao2")
public class BookDaoImpl2 implements BookDao {
    @Value("${name}")
    private String name;
    public void save() {
        System.out.println("Dao2层数据集 "+name);
    }
    @PostConstruct
    public void init(){
        System.out.println("init2");

    }
    @PreDestroy
    public void des(){
        System.out.println("des2");
    }
}
  • 运行结果:可以发现ljh依然能从外部文件注入(载入多个配置文件和扫描包一样{,,},但是,*.properties不可用)
    在这里插入图片描述

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

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

相关文章

Linux基础命令-du查看文件的大小

文章目录 du 命令介绍 语法格式 基本参数 参考实例 1)以人类可读形式显示指定的文件大小 2)显示当前目录下所有文件大小 3)只显示目录的大小 4)显示根下哪个目录文件最大 5)显示所有文件的大小 6&#xff0…

layui框架学习(11:徽章)

应用程序有新增内容、未读消息时,会在按钮或菜单中添加红点或带数字的点状或方状图形,用户看到就知道有新内容,如下图所示QQ邮箱的截图,会通过红色圆点或带NEW的方框提醒用户有新内容可以查看。   CSDN用户如果有新消息&#x…

产品经理有必要考个 PMP吗?(含PMP资料)

现在基本上做产品的都有一个PMP证件,从结果导向来说,不对口不会有这么大范围的人来考,但是需要因地制宜,在公司内部里,标准程序并不流畅,产品和项目并不规范,关系错综复杂。 而产品经理的职能又…

【Java学习】初识Java

JavaSEJava初识1. Java简介2.Java环境的安装与配置3. 开发第一个Java程序Java初识 学前疑问:(带着疑问去学习,在学习中自行探索答案) Java是什么?能做什么?发展前景如何?需要学习哪些内容&…

腾讯一面—Android 系统启动流程详解

正文AMS 是 Android 中最核心的服务之一,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,它本身也是一个 Binder 的实现类,应用进程能通过 Binder 机制调用…

ESPRESSIF ESP32 开发环境搭建

1.下载Espressif-IDE并安装,安装的时候直接下一步就行,下载地址为 IDE下载地址 2.新建项目 1,首先磁盘新建文件夹,用来保存项目 2,File ->New ->乐鑫IDF项目-> 工程名字test->保存目录就是自己建立的哪个…

EasyRecovery16MAC苹果版本Photo最新版数据恢复软件

无论是在工作学习中,还是在生活中,Word、Excle等办公软件都是大家很常用的。我们在使用电脑的过程中,有时会因自己的误删或电脑故障,从而导致我们所写的文档丢失了。出现这样的大家不要着急,今天小编就给大家推荐一款可…

nacos 单机集群搭建及常用生产环境配置 | Spring Cloud 3

一、Nacos 概览 Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮…

《程序员思维修炼》速读笔记

文章目录书籍信息概览绪论从新手到专家的历程认识大脑利用右脑调试大脑主动学习积累经验控制注意力超越专家图解书籍信息 书名:《程序员思维修炼(修订版)》 作者:[美] Andy Hunt 概览 绪论 再提“实用”关注情境所有人都关注这…

kafka使用入门案例与踩坑记录

每次用到kafka时都会出现各种奇怪的问题,综合实践,下面汇总下主要操作步骤: Docker镜像形式启动 zookeeper启动 docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeperkafka启动 docker run --name kafka01 -p 9092:909…

Apk转Aab(Android-App-Bundle)

这篇文章是参考Apk转Aab(Android-App-Bundle)_YoungBillsohu的博客-CSDN博客 基本照着这个大佬的步骤来就行,但是要注意的是apkTool最好是下新的,否则,会出现说一堆无语的错误,然后导致AAPT2关联资源的时候报错 类似这样的&#…

Java自定义生成二维码(兼容你所有的需求)

1、概述作为Java开发人员,说到生成二维码就会想到zxing开源二维码图像处理库,不可否认的是zxing确实很强大,但是实际需求中会遇到各种各样的需求是zxing满足不了的,于是就有了想法自己扩展zxing满足历史遇到的各种需求&#xff0c…

STC单片机启动看门狗定时器介绍和使用

STC单片机启动看门狗定时器介绍 ✨这里以STC8系列为例。 📑看门狗复位(WDT_CONTR) WDT_FLAG:看门狗溢出标志 看门狗发生溢出时,硬件自动将此位置 1,需要软件清零。EN_WDT:看门狗使能位 0:对单片机无影响 1:启动看门狗定时器。 注意:看门狗定时器可使用软件方式启动,…

JSP网上书店系统用myeclipse定制开发mysql数据库B/S模式java编程计算机网页

一、源码特点 JSP 网上书店系统 是一套完善的系统源码,对理解JSP java 编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。研究的基本内容是基于网上书店系 统,使用JSP作为页面开发工具。Web服务的运…

【机器学习】集成学习投票法:投票回归器(VotingRegressor) 投票分类器(VotingClassifier)

前言 投票回归器和投票分类器都属于集成学习。在【机器学习】集成学习基础概念介绍中有提到过,集成学习的结合策略包括: 平均法、投票法和学习法。sklearn.ensemble库中的Voting Classifier和Voting Regressor,它们分别实现了对回归任务和分…

JUC 之 Synchronized 与 锁升级

—— 对象内存布局 和 对象头 对象构成布局 1. 对象头 对象标记 Mark Word 哈希码GC 标记 & 次数 GC 年龄 采用 4 位 bit 存储,最大为 15(1111),所以 MaxTenutingThreshold 参数(分代年龄)的参数默…

C++回顾(三)—— 函数

3.1 内联函数 3.1.1 内联函数的定义 (1)内联函数的作用 作用:不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处,适用于功能简单,规模较小又使用频繁的函数。递归函数无法内联处理&…

Java-重排序,happens-before 和 as-if-serial 语义

目录1. 如何解决重排序带来的问题2. happens-before1. 如何解决重排序带来的问题 对于编译器,JMM 的编译器重排序规则会禁止特定类型的编译器重排序。对于处理器重排序,JMM 的处理器重排序规则会要求编译器在生成指令序列时,插入特定类型的内…

Android笔记(二十五):两种sdk热更插件资源加载方案

背景 在研究sdk插件化热更新方式的过程中总结出了两套插件资源加载方案,在此记录下 资源热更方式 方式一:合并所有插件资源 需要解决资源id冲突问题 资源ID值一共4个字段,由三部分组成:PackageIdTypeIdEntryId PackageId&…

Mysql 事务的隔离性(隔离级别)

Mysql 中的事务分为手动提交和自动提交,默认是自动提交,所以我们在Mysql每输入一条语句,其实就会被封装成一个事务提交给Mysql服务端。 手动提交需要先输入begin,表示要开始处理事务,然后就是常见的sql语句操作了&…