Spring学习笔记9 SpringIOC注解式开发

news2024/12/28 18:34:24

Spring学习笔记8 Bean的循环依赖问题_biubiubiu0706的博客-CSDN博客

注解的存在主要是为了简化XML的配置.Spring6倡导全注解式开发

回顾下

注解怎么定义,注解中的属性怎么定义

注解怎么使用

通过反射机制怎么读取注解

注解的自定义

注解的使用

通过反射机制怎么读取注解

IOC之包扫描原理

需求:给定一个包名,扫描所有类,只要有@Component注解,就创建该类对象,然后放到Map集合中

Key为注解的value,Value为对象

bean包下新建

package com.example.client;

import com.example.annotation.Component;

import java.io.File;
import java.net.URL;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * 手写组件扫描
 * @author hrui
 * @date 2023/9/24 18:20
 */
public class ComponentScan {

    public static void main(String[] args) throws Exception{
        //创建存放注解值的key和对象的容器
        Map<String,Object> beanMap=new HashMap<>();
        //目前只知道包名,扫描包下所有类,当类上有@Component注解时候,实例化该对象,放到Map
        String packageName="com.example.bean";
        //开始扫描
        //.这个正则表达式代表任意字符,这里的"."必须是一个普通的"."字符,不能是正则表达式中的"."
        String packagePath = packageName.replaceAll("\\.", "/");
        System.out.println(packagePath);
        URL url = ClassLoader.getSystemClassLoader().getResource(packagePath);
        String path = url.getPath();
        System.out.println(path);
        //获取绝对路径下所有文件
        File files=new File(path);
        File[] listFile = files.listFiles();
        Arrays.stream(listFile).forEach(f->{

            try {
                System.out.println(f.getName());
                System.out.println(f.getName().split("\\.")[0]);
                //拼接包名 获得类名
                String className=packageName+"."+f.getName().split("\\.")[0];
                System.out.println(className);
                //通过反射机制解析注解
                Class<?> clazz = Class.forName(className);
                //判断类上有没有@Component注解
                if(clazz.isAnnotationPresent(Component.class)){
                    //获取注解
                    Component annotation = clazz.getAnnotation(Component.class);
                    String key=annotation.value();
                    //有该注解就创建对象
                    Object o = clazz.newInstance();
                    beanMap.put(key, o);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        });

        System.out.println(beanMap);
    }
}

上面就是包扫描的原理

声明Bean的注解,常见的包括4个

@Compoent   组件

@Controller   控制器

@Service   业务

@Repository   DAO

新建模块spring-010

pom.xml

<dependencies>
    <!--Spring依赖-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>6.0.10</version>
    </dependency>
    <!--junit单元测试-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>

    <!--Log4j2依赖-->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.19.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>2.19.0</version>
    </dependency>
</dependencies>

引入日志文件,Spring默认用的log4j2   在resources目录下固定名称log4j2.xml日志文件即可

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <loggers>
        <!--
        level指定⽇志级别,从低到⾼的优先级:
        ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
        -->
        <root level="INFO">
            <appender-ref ref="spring6log"/>
        </root>
    </loggers>
    <appenders>
        <!--输出⽇志信息到控制台-->
        <console name="spring6log" target="SYSTEM_OUT">
            <!--控制⽇志输出的格式-->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger{1024} - %msg%n"/>
        </console>
    </appenders>
</configuration>

上面4个注解的源码

@Component

看下@Controller   @Service   @Repository 

说明@Component是老大  一样的效果

其实作用是一样的,只为增加程序的可读性

@Controller表示控制层    @Service表示业务层    @Repository表示持久层

那我非不想这么写,都用@Component行不行,答案是:可以.你喜欢,你随意

@Component   @Controller  @Service @Repository  这4个常用的Spring注解如何使用

1.引入spring-context依赖--->里面的spring--aop依赖   这个已经引入

2.在Spring配置文件中引入命名空间

3.配置包扫描

4.希望将对象交由Spring管理的类上加注解

测试

实际上,即使不取名,默认也有名,类名首字母小写

将4个bean的注解里的vlaue去掉

例如

SpringIOC解决多个包扫描问题

两种解决方案:

1.在配置文件中指定多个包,用逗号隔开

2.指定多个包的共同父包

测试

指定父包

SpringIOC注解式开发之选择性实例化Bean

例如某个包下有很多Bean,分别标注了@Component  @Controller  @Service  @Repository

现在由于某种业务需要,允许@Controller注解的参与Bean管理,其他不实例化.

第一种解决方案

测试:只有A和C 创建对象了

第二种解决方案

负责注入的注解

@Component  @Controller  @Service  @Repository 这四个注解是用来声明Bean的.

声明后这些Bean交由Spring管理.

如何给Bean的属性赋值,需要以下注解

@Value 用于注入简单类型  可以用在属性上   set方法上   构造方法的形参上

@Autowired  用于注入非简单类型  用于 构造方法上   方法上  形参上  属性上  注解上

@Qualifier

@Resource

@Value注解是专门用来注入简单类型的,专门用来代替

示例

现在不需要set方法

新建个配置文件

测试

再测一个

另外 @Value还可以用在set方法上

@Value还可以用在构造方法中

再测

注意:这样不行

SpringIOC注解之@Autowired和 @Qualifier

@Autowired注解可以用来注入非简单类型

单独使用@Autowried注解.默认根据类型匹配----->byType

如果要byName@Autowired和@Qualifier需要一起使用

注意:@Autowired单独使用 都是byType

需要byName要和@Qualifier一起使用

另外建个包com.example2

持久层接口

持久层实现类

业务层接口

业务层实现类

新建配置文件用以包扫描

测试

如果我接口下有多个实现类

就报错了  原因 它找到两个

需要@Autowired和@Qualifier联合使用 

在Spring中,@Autowired 注解默认会使用"byType"方式进行自动装配,它会尝试按照被注入的类型(数据类型)去寻找匹配的依赖,然后将依赖注入到目标字段或方法参数中。如果存在多个匹配的依赖对象(同一类型的多个Bean),并且无法确定要注入哪一个时,它会引发一个异常。

如果 "byType" 自动装配失败,Spring 不会自动尝试 "byName" 自动装配。如果有多个相同类型的 Bean,但您希望显式选择其中一个进行注入,您可以使用 @Qualifier 注解与 @Autowired 结合使用,以指定要注入的 Bean 的名称

测试

下面演示@Autowired的可以自动装配的位置,@Autowired单独使用时,有两个同类型的会报错,

因此先把OrderDaoForMysql或者OrderDaoForOracle注释掉一个

下面演示@Autowired的可以自动装配的位置

@Autowired在构造方法上

测试

@Autowired在构造方法参数上

测试

有给属性赋值的构造方法,省略掉@Autowired行不行 (注意:这里要求构造方法必须只有一个,且该构造方法给属性赋值)

测试

@Autowired放在set方法上

关于@Resource注解

@Resource注解也可以完成非简单类型注入.它和@Autowired的区别是

1.@Resource是JDK扩展包中的注解,是javaEE的.更具通用性

2.@Autowired注解是Spring框架自己的

3.@Resource注解默认byName,为指定名字使用属性名为name.通过name找不到会自动启用byType装配

4.@Autowired默认byType,找不到的话不会自动用byName,需要通过@Qualifier来byName

5.@Resource注解用在属性上,set方法上

6.@Autowired注解用在属性上,set方法上,构造方法上,构造方法参数上

@Resource注解属于JDK扩展包(如果是JDK8不需要额外引入依赖,高于JDK11或低于JDK8需要额外引入依赖)

注意:Spring6开始不再支持JAVAEE,它支持JAKARTA9(需要引入依赖)

如果用的Spring6的引依赖

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

如果用的Spring5 

<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.2</version>
</dependency>

 

这用的Spring6  引入依赖

新建个包

持久层接口

持久层实现类

业务层

新建配置文件包扫描

测试

测试放在set方法上

测试

@Resource不能放在构造方法上

@Resource(name="xxxxx")如果不指定名字  单写个@Resource会将属性名作为名字,如果找不到bean,会用byType

如果

SpringIOC全注解开发  将Spring配置文件干掉

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

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

相关文章

顺序表的实现和练习

杂谈&#xff1a; 有些数据结构&#xff08;C语言实现&#xff09;的教材/教程中会使用C中引用的语法&#xff0c;引用确实在形式上比指针简洁&#xff0c;这样做无非是为了避免后续对二级指针的使用。 我认为既然使用C语言实现数据结构&#xff0c;那么指针就不应该是门槛。…

【动手学深度学习-Pytorch版】序列到序列的学习(包含NLP常用的Mask技巧)

序言 这一节是对于“编码器-解码器”模型的实际应用&#xff0c;编码器和解码器架构可以使用长度可变的序列作为输入&#xff0c;并将其转换为固定形状的隐状态&#xff08;编码器实现&#xff09;。本小节将使用“fra-eng”数据集&#xff08;这也是《动手学习深度学习-Pytor…

[论文分享] How to Better Utilize Code Graphs in Semantic Code Search?

How to Better Utilize Code Graphs in Semantic Code Search? [ESEC/FSE 2022] 语义代码搜索极大地促进了软件的重用&#xff0c;使用户能够找到与用户指定的自然语言查询高度匹配的代码片段。由于代码图(如控制流图和程序依赖图)丰富的表达能力&#xff0c;两种主流的研究工…

【Gradle-9】Gradle插件发布指南

1、前言 不管是在公司内部&#xff0c;还是开源&#xff0c;Gradle插件发布都是一项必备的技能&#xff0c;本文主要介绍本地发布和远端发布两种方式。 2、本地发布 2.1、添加依赖 在plugin>build.gradle文件中&#xff08;插件的项目&#xff09;先依赖一个maven发布的…

分布式搜索引擎Elasticsearch

一、Elasticsearch介绍 1.Elasticsearch产生背景 大数据量的检索NoSql: not only sql,泛指非关系型的数据库Nginx的7层负载均衡和4层负载均衡2.Elasticsearch是什么 一个基于Lucene的分布式搜索和分析引擎,一个开源的高扩展的分布式全文检索引擎 Elasticsearch使用Java开发…

零基础也能制作小说推文视频,输入文案就能制作推文短视频

小说推文视频一直是各类写手们追捧的创作方式之一&#xff0c;而如何制作出优质、吸引人的小说推文视频成了许多人关注的焦点。幸运的是&#xff0c;现在有了一款名为推文视频制作神器&#xff0c;让制作小说推文视频变得轻松简单。 这款小说推文视频神器的功能十分强大&#…

山西电力市场日前价格预测【2023-09-25】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-09-25&#xff09;山西电力市场全天平均日前电价为442.30元/MWh。其中&#xff0c;最高日前电价为720.46元/MWh&#xff0c;预计出现在19: 00。最低日前电价为276.06元/MWh&#xff0c;预计…

AUTOSAR 多核操作系统时序监控系统设计

AUTOSAR 多核操作系统时序监控系统设计 0 引言1 AUTOSAR 介绍1.1 AUTOSAR 诞生1.3 AUTOSAR 架构 2 时序监控系统软硬件介绍2.1 硬件部分2.2 软件部分 3 时序监控系统设计3.1 监控系统整体设计3.2 监控数据获取3.3 监控数据存储3.4 监控数据处理 3.5 还原运行时序5 推动 5G工业互…

3D点云目标检测:Centerformer训练waymo数据集

一、环境准备 项目地址:centerformer 1.0、基础环境 python 3.8.0 torch 1.9.1cu111 waymo-open-dataset-tf-2-6-0 1.4.9 spconv 1.2.1 其余按照requirement.txt里安装就行 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt由于我本人是在…

uniapp、vue实现滑动拼图验证码

uniapp、vue实现滑动拼图验证码 实际开发工作中&#xff0c;在登陆的时候需要短信验证码&#xff0c;但容易引起爬虫行为&#xff0c;需要用到反爬虫验证码&#xff0c;今天介绍一下拼图验证码&#xff0c;解决验证码反爬虫中的滑动验证码反爬虫。滑动拼图验证码是在滑块验证码…

QLineEdit设置数据的输入范围QIntValidator和QDoubleValidator

在日常开发过程中QLineEdit作为输入框&#xff0c;有时要限制输入的内容&#xff0c;比哪&#xff0c;考试分数为0-100&#xff0c;这个时候就使用QIntValidator作为限制范围&#xff0c;而如何输入的是带小数的呢&#xff0c;那么使用QDoubleValidator可以吗&#xff0c;下面请…

ipad触控笔有必要买原装吗?ipad2023手写笔推荐

目前&#xff0c;在无纸教学、无纸办公的大背景下&#xff0c;电容笔得到了广泛的关注。只是&#xff0c;对于这两支电容笔的不同之处&#xff0c;不少人并不是很清楚。其实这两种电容笔都很好区分&#xff0c;第一种是主动电容笔&#xff0c;也就是我们常用的电容式屏幕&#…

安全生产一张图 安全生产三维地理信息平台

一、 建设目标 易图讯科技是一家专业从事大数据、移动互联网、物联网、三维GIS、AI系统研发&#xff0c;开发了三维电子沙盘、AI三维电子沙盘、WEB三维地球、移动端三维地球、数字武装三维电子沙盘、智慧动员三维电子沙盘、智慧公安三维电子沙盘、智慧安监三维电子沙盘、森林防…

vue重修003

文章目录 版权声明day03一、今日目标1.生命周期2.综合案例-小黑记账清单3.工程化开发入门4.综合案例-小兔仙首页 二、Vue生命周期三、Vue生命周期钩子四、生命周期钩子小案例1.在created中发送数据2.在mounted中获取焦点 五、案例-小黑记账清单1.需求图示&#xff1a;2.需求分析…

Maven项目在pom.xml里配置远程仓库

如图:作用 在项目的 pom.xml 文件中配置了 <repositories> 元素&#xff0c;Maven会优先使用项目级别的仓库配置&#xff0c;而不会查找全局设置文件中的仓库配置。换句话说&#xff0c;项目级别的配置会覆盖全局设置文件中的仓库配置。 这意味着当在项目的 pom.xml 文…

AUTOSAR 面试知识回顾

如果答不上来&#xff0c;就讲当时做了什么 1. Ethernet基础: 硬件接口&#xff1a; ECU到PHY&#xff1a; data 是MII总线&#xff0c; 寄存器控制是SMI总线【MDCMDIO两根线, half duplex】PHY输出(100BASE-T1)&#xff1a; MDI总线&#xff0c;2 wire 【T1: twisted 1 pair …

C++项目:仿muduo库实现高性能高并发服务器

文章目录 一、实现目标二、前置知识&#xff08;一&#xff09;HTTP服务器1.概念 &#xff08;二&#xff09;Reactor模型&#xff1a;1.概念2.分类&#xff08;1&#xff09;单Reactor单线程&#xff1a;单I/O多路复用业务处理。&#xff08;2&#xff09;单Reactor多线程&…

腾讯mini项目-【指标监控服务重构-会议记录】2023-07-26

2023-07-26组长会议纪要 A组 项目对齐和问题 分配需求&#xff0c;SLI指标上报&#xff0c;暂时没有实际效果 每个人负责一条指标&#xff0c;同步代码&#xff0c;时间问题还是难题跟B组同学请教&#xff0c;答疑 问题&#xff1a;启动 Tracer 【已解决】 环境问题&#xf…

21.redo日志(下)

title: “redo日志&#xff08;下&#xff09;” createTime: 2022-03-06T15:52:4108:00 updateTime: 2022-03-06T15:52:4108:00 draft: false author: “ggball” tags: [“mysql”] categories: [“db”] description: “” redo log的刷盘时机 log buffer 空间不足时&…

【linux】性能优化

这张图谱出自倪朋飞&#xff1b; 1、什么是性能指标 这里一定会想到 “高并发” 和 “响应快”&#xff0c;这里词正对应的就是 “吞吐” 和 “延时”。我们知道随着应用负载的体系&#xff0c;系统资源的使用就会提高&#xff0c;甚至达到极限。而性能问题的本质&#xff0c…