注解之@Configuration、@Bean、@Component
目录
前言
@Component:通用的注解!
@Bean
引入第三方的类
@Configuration
前言
首先:我们先简单描述一下这三个的作用
@Component注解表明一个类会作为组件类,并告知Spring要为这个类创建bean。
@Bean注解告诉Spring这个方法将会返回一个对象,这个对象要注册为Spring应用上下文中的bean。通常方法体中包含了最终产生bean实例的逻辑。用于显式声明单个bean,而不是让Spring像上面那样自动执行它。它将bean的声明与类定义分离,并允许您精确地创建和配置bean。另外@Bean注解的方法返回值是对象,可以在方法中为对象设置属性。
@Configuration即用来代替Spring配置文件的,它就是一个@Component组件,接收一个value值也就是bean的名字,value可以不填。
但是上面的讲解都只是冰冷的概念,决定重新捡起来,好好研究这些配置,因为虽说平时自己写的时候都是机械性的,甚至是试探性的,但是还是要更深入一点。
为什么要先讲这三个概念,是因为他们之间的关系,有些你中有我我中有你,最好先有一个大概的了解。
@Component:通用的注解!
通俗的讲:@Compent就是说,是标注这个类是一个组件类,只要你想将你写的类交给Spring容器来管理,那就可以用它!
1、@controller: controller控制器层(注入服务)
2、@service : service服务层(注入dao)
3、@repository : dao持久层(实现dao访问)
为什么摆出上面这三个,因为他们其实就是@Compent,例如我们进入到@Controller里看一下,发现在Controller上就有一个@Component,剩下的两个同理
package org.springframework.stereotype;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {@AliasFor(annotation = Component.class)String value() default "";
}
写一个简单的功能,先写一个类,用@Compent注解上
package com.newcrud.learn;
import lombok.Data;
import org.springframework.stereotype.Component;
@Data
@Component
public class KangShiFuTwo {String name;Integer age;public void getKangShiFuTwo(){System.out.println("getKangShiFuTwo");}
}
写一个测试类,可以用@Autowired获取到没说明已经在Spring容器里了
package com.newcrud.learn;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.Test;
@SpringBootTest
public class KangShiFuTwoTest extends AbstractTestNGSpringContextTests {@AutowiredKangShiFuTwo kangShiFuTwo;@Testpublic void testGetKangShiFuTwo() {kangShiFuTwo.getKangShiFuTwo();}
}
看执行结果
getKangShiFuTwo
@Bean
我们先看一下@Bean的源码
package org.springframework.context.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {@AliasFor("name")String[] value() default {};
@AliasFor("value")String[] name() default {};
/** @deprecated */@DeprecatedAutowire autowire() default Autowire.NO;
boolean autowireCandidate() default true;
String initMethod() default "";
String destroyMethod() default "(inferred)";
}
emmm,他没有@Compent
引入第三方的类
那,我们首先创建一个没有@Compent的类
package com.newcrud.learn;
import lombok.Data;
@Data
public class KangShiFuOne {String name;Integer age;public void getKangShiFuOne(){System.out.println("getKangShiFuOne");}
}
再写一个配置类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfiguration {@Beanpublic KangShiFuOne getKangShiFuOneConfig(){return new KangShiFuOne();}
}
再来写一个测试类
package com.newcrud.learn;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.Test;
@SpringBootTest
public class MyConfigurationTest extends AbstractTestNGSpringContextTests {@AutowiredKangShiFuOne kangShiFuOne;
@Testpublic void testGetKangShiFuTwoConfig() {kangShiFuOne.getKangShiFuOne();}
}
结果如下
getKangShiFuOne
能被@Autowired获取到,是因为@Configuration的作用,那@Bean的作用是什么呢,因为他有一个@Compent没有的功能,那就是他可以将不在jar包里的类放到Spring容器里,比如说你在pom文件中引入的工具包,你并不能把@Compent放到里面去对不对,那你就可以通过@Bean的方式来获取。
这个涉及到 spring boot 的自动装载的概念,当你的 bean 不在你 jar 包的扫描目录下时,是没法实例化的给 spring 管理的。
@Configuration
官方文档描述:用@Configuration注释类表明其主要目的是作为bean定义的源
我们再来看一下@Configuration的源代码,发现在上面也有一个@Compent,那就说明,它也有@Compent的功能
package org.springframework.context.annotation;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
import org.springframework.stereotype.Component;@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {@AliasFor(annotation = Component.class)String value() default "";boolean proxyBeanMethods() default true;
}
通俗的来讲,这个就是代表它所注释的类是一个配置类,但什么才是配置类呢,上面我们也看到了@Configuration好像也就是个@Compent啊,没啥大用
那我们先来编写两个类
package com.newcrud.learn;import lombok.Data;@Data
public class KangShiFuFour {public KangShiFuFour(){System.out.println("getKangShiFuFour");}String name;Integer age;
}
package com.newcrud.learn;import lombok.Data;@Data
public class KangShiFuThree {public KangShiFuThree(){System.out.println("getKangShiFuThree");}String name;Integer age;
}
再来写我们的@Configuration
package com.newcrud.learn;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyConfigurationTwo {@Beanpublic KangShiFuThree getKangShiFuThree(){return new KangShiFuThree();}@Beanpublic KangShiFuFour getKangShiFuFour(){getKangShiFuThree();return new KangShiFuFour();}
}
再写我们的测试类
package com.newcrud.learn;import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.Test;@SpringBootTest
public class MyConfigurationTwoTest extends AbstractTestNGSpringContextTests {@Testpublic void testGetKangShiFuThree() {//这个只是保留一个执行的入口,没有实际意义,我们要看的是启动信息}
}
在启动后会打印两个类的初始化函数输出
getKangShiFuThree
getKangShiFuFour
但是我们仔细想一下,我们是调用了两次getKangShiFuThree的构造函数的,但是只打印了一次,这也是他的一个功能:保持单例模式!
我们再来看一下他的另一个功能
@Configuration类允许通过调用同一类中的其他@Bean方法来定义bean之间的依赖关
package com.newcrud.learn;import org.springframework.context.annotation.Bean;public class MyConfigurationTwo {@Beanpublic KangShiFuThree getKangShiFuThree(){return new KangShiFuThree();}@Beanpublic KangShiFuFour getKangShiFuFour(){getKangShiFuThree();//去掉@Configuration,这里就会报错:Method annotated with @Bean is called directly. Use dependency injection instead.,因为未添加@Configuration注解,导致@Bean之间相互调用出错return new KangShiFuFour();}
}
相关文章:
注解之@Configuration、@Bean、@Component
目录 前言 Component:通用的注解! Bean 引入第三方的类 Configuration 前言 首先:我们先简单描述一下这三个的作用 Component注解表明一个类会作为组件类,并告知Spring要为这个类创建bean。 Bean注解告诉Spring这个方法将会…...
【Web安全】sql注入绕过技法
sql注入绕过技法 1. 注释符号绕过 原理:SQL注释符号(如--, /* */)可以用来忽略查询的一部分,特别是在注入点之后的部分。这对于绕过需要闭合的查询或移除查询余下部分的情况特别有用。 -- 注释内容 # 注释内容 /*注释内容*/ ;2…...
Axios使用方式
ajax是JQUERY封装的XMLHttprequest用来发送http请求 Axios简单点说它就是一个js库,支持ajax请求,发送axios请求功能更加丰富,丰富在哪不知道 1.npm使用方式 vue项目中 npm install axios 2.cdn方式 <script src"https://unpkg.com/axios/dist/axios.min.js">…...
kotlin 内置函数对数组进行各种操作
以下是一些常见的用法示例: plus() 函数将两个数组合并成一个数组。plus() 函数是 Kotlin 标准库中的一个扩展函数,可以用于合并两个同类型的数组。 fun main() {val array1 arrayOf(1, 2, 3)val array2 arrayOf(4, 5, 6)val mergedArray array1.plu…...
力扣labuladong——一刷day54
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣1660. 纠正二叉树二、力扣100. 相同的树三、力扣572. 另一棵树的子树四、力扣101. 对称二叉树 前言 判断树是否相等,就直接遍历就可以。判断…...
3、MSF使用
文章目录 一、利用ms17-010漏洞对靶机执行溢出攻击二、后渗透模块meterpreter的使用 一、利用ms17-010漏洞对靶机执行溢出攻击 分别输入以下命令,使用ms17_010_eternalblue模块对目标机的ms17-010漏洞进行利用: use exploit/windows/smb/ms17_010_eter…...
34970A 数据采集 / 数据记录仪开关单元
34970A 数据采集 / 数据记录仪开关单元 产品综述: Keysight 34970A 数据采集/数据记录仪开关单元由一个 3 插槽主机和一个内置的 6 1/2 位数字万用表组成。每个通道可以单独配置,以测量 11 种不同功能之一,这样既不会增加成本,也…...
BUUCTF刷题之路-web-[GXYCTF2019]Ping Ping Ping1
启动环境后,是一个简简单单的页面: 看样子是能够触发远程执行漏洞的。尝试下ping 127.0.0.1,如果有回显说明我们的想法是对的。 最近才学习的nc反弹shell。想着是否能用nc反弹shell的办法。控制服务器然后输出flag呢?于是我测试下…...
一、深入简出串口(USRT)通信——基本概念。
一、前言 串口到底是什么?简单来说一句话就可以解释,串口就是一种通信协议。 看到这里可能大家会觉得你这不是放屁么,说了跟没说一样。所以这里做前言来描述,大家要先对通信协议有一个下意识地认识才能在学习串口的时候不至于迷茫…...
采用connector-c++ 8.0操作数据库
1.下载最新的Connector https://dev.mysql.com/downloads/connector/cpp/,下载带debug的库。 解压缩到本地,本次使用的是带debug模式的connector库: 注:其中mysqlcppconn与mysqlcppconn8的区别是: 2.在cmakelist…...
【Java数据结构 -- 时间和空间复杂度】
时间和空间复杂度 1. 算法效率2. 时间复杂度2.1 时间复杂度的概念2.2 大O的渐进表示法2.3 推导大O阶方法2.4 常见时间复杂度计算举例例1例2例3例4 计算 bubbleSort的时间复杂度例5 计算binarySearch的时间复杂度?例6 计算阶乘递归factorial的时间复杂度?…...
【每日一题】1457. 二叉树中的伪回文路径-2023.11.25
题目: 1457. 二叉树中的伪回文路径 给你一棵二叉树,每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的,当它满足:路径经过的所有节点值的排列中,存在一个回文序列。 请你返回从根到叶子节点的所有路…...
能让PDF看起来像是扫描件的Look Scanned
什么是 Look Scanned ? Look Scanned 是一个能够让 PDF 看起来就像是扫描件一样的纯前端网站。你再也不需要麻烦地打印之后扫描了,你所需要的就是鼠标点几下。 这是个挺有意思的软件,但是老苏不确定什么场景下会用到这个软件,如果不想自己搭…...
RT-DETR 更换损失函数之 SIoU / EIoU / WIoU / Focal_xIoU
文章目录 更换方式CIoUDIoUEIoUGIoUSIoUWIoUFocal_CIoUFocal_DIoUFocal_EIoUFocal_GIoUFocal_SIoU提示更换方式 第一步:将ultralytics/ultralytics/utils/metrics.py文件中的bbox_iou替换为如下的代码:class...
代码随想录算法训练营第四十六天 | 139.单词拆分,多重背包,背包问题总结
目录 139.单词拆分 多重背包 背包问题总结 01背包 完全背包 多重背包 139.单词拆分 题目链接:139. 单词拆分 不要求字典中的单词全部使用,但是要求拆分的单词拆分成的每一个子串都是字典中的单词。 (1)dp[ i ] 表示前 i 个字符组成…...
opencv-Canny 边缘检测
Canny边缘检测是一种经典的图像边缘检测算法,它在图像中找到强度梯度的变化,从而识别出图像中的边缘。Canny边缘检测的优点包括高灵敏度和低误检率。 在OpenCV中,cv2.Canny() 函数用于执行Canny边缘检测。 基本语法如下: edges…...
案例023:基于微信小程序的童装商城的设计与实现
文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…...
Ansible的循环:loop,with_<lookup>和until
环境 管理节点:Ubuntu 22.04控制节点:CentOS 8Ansible:2.15.6 循环的方法 loopwith_<lookup>until 用这几种方式都可以实现循环。其中, loop 是推荐的用法,在很多时候能够替换 with_<lookup> 。 loop…...
点云 surface 方法总结
点云的表面方法是指通过点云数据来估计和重建物体或场景的表面几何形状。下面总结了几种常见的点云表面方法: 三角化:三角化是最常用的点云表面重建方法之一。它将点云中的点连接成三角形网格,从而重建出物体或场景的表面。常见的三角化算法…...
深入探索Linux文件系统:属性、路径与隐藏之谜
🎥 屿小夏 : 个人主页 🔥个人专栏 : Linux系统理论 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言🌤️文件的组成☁️文件属性☁️文件内容☁️注意事项 🌤️路…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
【Java多线程从青铜到王者】单例设计模式(八)
wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本,sleep也是可以指定时间的,也就是说时间一到就会解除阻塞,继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒),wait能被notify提前唤醒…...
VSCode 使用CMake 构建 Qt 5 窗口程序
首先,目录结构如下图: 运行效果: cmake -B build cmake --build build 运行: windeployqt.exe F:\testQt5\build\Debug\app.exe main.cpp #include "mainwindow.h"#include <QAppli...
使用python进行图像处理—图像滤波(5)
图像滤波是图像处理中最基本和最重要的操作之一。它的目的是在空间域上修改图像的像素值,以达到平滑(去噪)、锐化、边缘检测等效果。滤波通常通过卷积操作实现。 5.1卷积(Convolution)原理 卷积是滤波的核心。它是一种数学运算,…...
RKNN开发环境搭建2-RKNN Model Zoo 环境搭建
目录 1.简介2.环境搭建2.1 启动 docker 环境2.2 安装依赖工具2.3 下载 RKNN Model Zoo2.4 RKNN模型转化2.5编译C++1.简介 RKNN Model Zoo基于 RKNPU SDK 工具链开发, 提供了目前主流算法的部署例程. 例程包含导出RKNN模型, 使用 Python API, CAPI 推理 RKNN 模型的流程. 本…...
【自然语言处理】大模型时代的数据标注(主动学习)
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构D 实验设计E 个人总结 A 论文出处 论文题目:FreeAL: Towards Human-Free Active Learning in the Era of Large Language Models发表情况:2023-EMNLP作者单位:浙江大…...
Three.js进阶之粒子系统(一)
一些特定模糊现象,经常使用粒子系统模拟,如火焰、爆炸等。Three.js提供了多种粒子系统,下面介绍粒子系统 一、Sprite粒子系统 使用场景:下雨、下雪、烟花 ce使用代码: var materialnew THRESS.SpriteMaterial();//…...
