当前位置: 首页 > news >正文

基于配置类方式管理 Bean

目录

一、完全注解开发理解

二、配置类和扫描注解 

三、@Bean定义组件

四、@Bean注解细节

五、@import 扩展


一、完全注解开发理解

Spring 完全注解配置(Fully Annotation-based Configuration)是指通过 Java配置类 代码来配置 Spring 应用程序,使用注解来替代原本在 XML 配置文件中的配置。相对于 XML 配置,完全注解配置具有更强的类型安全性和更好的可读性。

由于前面的配置Bean的方式都设计到了XML的格式,所以就需要通过一种注解能实现完全实现抛开XML配置(因为XML文件配置读取的效率低)


二、配置类和扫描注解 

注解 (Annotation)描述 (Description)
@Configuration用于标记一个类作为配置类。配置类用来定义Spring Bean以及配置其他组件。通常与@Bean注解一起使用,在配置类中声明方法来创建和配置Bean。
@PropertySource将外部属性文件加载到Spring环境中。通过该注解,可以将属性文件中定义的键值对作为Spring Bean的属性值来使用。
@ComponentScan指定要扫描的基础包。自动扫描基础包及其子包下的所有类,并将其注册为Spring Bean。可以设置过滤器来限制扫描范围,只扫描带有特定注解的类。

 使用方法:

1.原来的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.alphamilk"/>
<!--    导入资源文件--><context:property-placeholder location="Jdbc.properties"/></beans>

2.对应转换为完全注解方式

package com.alphamilk;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;//表明该类为注解类
@Configuration
//配置外部资源文件,相当于 <context:property-placeholder location="Jdbc.properties"/>
@PropertySource(value = "classpath:Jdbc.properties")
//声明扫描包 相当于<context:component-scan base-package="com.alphamilk"/>
@ComponentScan(value = "com.alphamilk")
public class Javaconfig {
}

两种通过注解创建ioc容器的方式(AnnotationConfigApplicationContext)

1.直接创建Annotation

  public  void test(){
//     1.创建ioc容器,并且导入对应的配置类ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Javaconfig.class);
//        2.获取组件StudentController studentController = (StudentController) applicationContext.getBean("StudentController");
//        3.使用组件studentController.getInfo();}

2.通过创建实现类AnnotationConfigApplicationContext并调用regist方法

public  void test(){
//  1.创建 ioc 容器AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
//        2.设置配置类路径applicationContext.register(Javaconfig.class);
//        3.获取BeanStudentController bean = applicationContext.getBean(StudentController.class);
//        4.使用Beanbean.getInfo();}

总结:

@Configuration指定一个类为配置类,可以添加配置注解,替代配置xml文件

@ComponentScan(basePackages = {"包","包"}) 替代<context:component-scan标签实现注解扫描

@PropertySource("classpath:配置文件地址") 替代 <context:property-placeholder标签

配合IoC/DI注解,可以进行完整注解开发!


三、@Bean定义组件

场景需求:将Druid连接池对象存储到IoC容器

需求分析:第三方jar包的类,添加到ioc容器,无法使用@Component等相关注解!因为源码jar包内容为只读模式!

所以在注解类中只能通过传统的xml <bean 进行配置。但是通过@Bean注解就能解决

语法描述
@Bean表示该方法产生一个由 Spring 管理的 Bean。
@Bean(name="beanName")指定 Bean 的名称。
@Bean(initMethod="init")指定 Bean 的自定义初始化方法。
@Bean(destroyMethod="destroy")指定 Bean 的自定义销毁方法。
@Bean(autowire=Autowire.BY_NAME)指定 Bean 的自动装配模式为按名称自动装配。
@Bean(autowire=Autowire.BY_TYPE)指定 Bean 的自动装配模式为按类型自动装配。
@Bean(autowire=Autowire.NO)指定 Bean 不进行自动装配。
@Bean(autowire=Autowire.BY_NAME, initMethod="init")同时指定自动装配模式和初始化方法。

案例代码:

package com.alphamilk;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;//表明该类为注解类
@Configuration
//配置外部资源文件,相当于 <context:property-placeholder location="Jdbc.properties"/>
@PropertySource(value = "classpath:Jdbc.properties")
//声明扫描包 相当于<context:component-scan base-package="com.alphamilk"/>
@ComponentScan(value = "com.alphamilk")
public class Javaconfig {@Value("${alphamilk.url}")private String url;@Value("${alphamilk.driver}")private String Driver;@Value("${alphamilk.username}")private String username;@Value("${alphamilk.password}")private String password;/*<bean ->方法方法的返回值类型 == bean组件的类型或者其他接口和父类方法的名字 = bean id方法体可以自定义实现过程最重要的一步:通过加上@Bean 才会让配置类创建的组件存储到ioc容器中*/@Beanpublic DruidDataSource dataSource(){DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl(url);dataSource.setDriverClassName(Driver);dataSource.setUsername(username);dataSource.setPassword(password);return  dataSource;}
}

四、@Bean注解细节

1.关于BeanName的问题

1.1正常情况下Bean的Name默认为方法名字

//   正常情况下Bean的名字就是以下方法的dataSource@Beanpublic DruidDataSource dataSource(){DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl(url);dataSource.setDriverClassName(Driver);dataSource.setUsername(username);dataSource.setPassword(password);return  dataSource;}

1.2通过@Bean name/value指定Name

//   通过@Bean(指定对应名字) hehhehehe@Bean("hehhehehe")public DruidDataSource dataSource(){DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl(url);dataSource.setDriverClassName(Driver);dataSource.setUsername(username);dataSource.setPassword(password);return  dataSource;}

2.通过Bean指定对应的周期方法

2.1还是正常的Bean注解方式(@PostContruct 、 @PreDestory)

public class StudentController {@PostConstructpublic void init(){System.out.println("组件初始化");}@AutowiredStudentService service;public void getInfo(){System.out.println(service.getInfo());}@PreDestroypublic void destory(){System.out.println("组件被销毁");}}

 2.2可以通过调用@Bean内部的方法进行初始化与销毁

//  调用@Bean内部的方法进行初始化与销毁@Bean(value = "dataSource",initMethod = "" ,destroyMethod = "")public DruidDataSource dataSource(){DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl(url);dataSource.setDriverClassName(Driver);dataSource.setUsername(username);dataSource.setPassword(password);return  dataSource;}

3.Bean的指定作用域

3.1Bean的指定作用域还是跟原来一样通过注解@Scope标签

//  通过@Scope注解实现,Bean的作用域@Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE)@Bean(value = "dataSource")public DruidDataSource dataSource(){DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl(url);dataSource.setDriverClassName(Driver);dataSource.setUsername(username);dataSource.setPassword(password);return  dataSource;}

 4.Bean组件之间的调用

4.1方案1:直接调用对方的Bean方法即可

    @Bean(value = "dataSource")public DruidDataSource dataSource(){DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl(url);dataSource.setDriverClassName(Driver);dataSource.setUsername(username);dataSource.setPassword(password);return  dataSource;}public JdbcTemplate jdbcTemplate(){JdbcTemplate jdbcTemplate = new JdbcTemplate();
//        传入对方的方法jdbcTemplate.setDataSource(dataSource());return jdbcTemplate;}

4.2方案2:通过形参传入方式注入

//    通过形参方式赋值public JdbcTemplate jdbcTemplate(DruidDataSource dataSource){JdbcTemplate jdbcTemplate = new JdbcTemplate();jdbcTemplate.setDataSource(dataSource);return jdbcTemplate;}

注意:如果有多个组件,则形参的名称应该改为对方的Bean id。


五、@import 扩展

问题引出: 当有多个配置类的时候,需要一个一个导入对应的配置类,十分麻烦,而通过@import扩展可以实现多个配置类整合成一个配置类,最后在ioc容器创造时候只需要导入一个配置类

语法描述
@import(com.example.MyConfiguration.class)导入指定的配置类。
@import({ConfigA.class, ConfigB.class})导入多个配置类。
@import(com.example.*.config.*)使用通配符导入指定包下的所有配置类。
@importResource("classpath:applicationContext.xml")导入 XML 配置文件。
@importResource({"classpath:beans.xml", "classpath:datasource.xml"})导入多个 XML 配置文件。

案例代码:

@Import(value = {JavaConfigB.class, JavaConfigC.class})
@Configuration
public class JavaConfigA {
}

应用场景:在一个项目中可以分别配置自己需要的东西,比如数据库的配置,其他的配置等等。最后通过import整合起来。


本章总结:

1.配置类和扫描注解

掌握@component-scan、@PropertySource、@Configuration三种注解的含义与用法。

2.@Bean定义组件

掌握@Bean的基本使用,会使用两种方式创建ioc容器

3.@Bean注解细节

掌握@Bean注解的命名,周期方法,作用域,与@Bean注解下DI的实现

4.import扩展

了解并会使用@import注解

相关文章:

基于配置类方式管理 Bean

目录 一、完全注解开发理解 二、配置类和扫描注解 三、Bean定义组件 四、Bean注解细节 五、import 扩展 一、完全注解开发理解 Spring 完全注解配置&#xff08;Fully Annotation-based Configuration&#xff09;是指通过 Java配置类 代码来配置 Spring 应用程序&#…...

最新CMS指纹识别技术

指纹识别 1&#xff0e;CMS简介 CMS&#xff08;Content Management System&#xff0c;内容管理系统&#xff09;&#xff0c;又称整站系统或文章系统&#xff0c;用于网站内容管理。用户只需下载对应的CMS软件包&#xff0c;部署、搭建后就可以直接使用CMS。各CMS具有独特的…...

快速入门学习记录:常用代码、特定函数、复杂概念和特定功能说明

&#x1f600;前言 本篇博文是关于Java入门学习的一些常用记录&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&a…...

【win视频播放器】HEVC视频扩展

问题描述&#xff1a; 播放此视频需要新的编解码器 编解码器允许应用读取并播放不同文件。可以从Microsoft Store下载该编解码器 &#xffe5;7.00 现在获取 稍后再说 解决方法&#xff1a; 方法一&#xff1a;&#xff08;该方法我正常使用&#xff09; 链接&#xff1a;ht…...

React+Typescript 父子组件事件传值

好 之前我们将 state 状态管理简单过了一下 那么 本文 我们来研究一下事假处理 点击事件上文中我们已经用过了 这里 我们就不去讲了 主要来说说 父子之间的事件 我们直接来编写一个小dom 我们父组件 编写代码如下 import Hello from "./components/hello";functio…...

python人工智能和机器学习

人工智能和机器学习是当今科技领域最热门和前沿的话题之一。随着数据的爆炸式增长和计算能力的提升&#xff0c;人工智能和机器学习在各个领域都有广泛的应用。Python作为一种易学易用且功能强大的编程语言&#xff0c;已经成为人工智能和机器学习的首选工具之一。本文将介绍Py…...

[PyTorch][chapter 51][Auto-Encoder -1]

目录&#xff1a; 简介 损失函数 自动编码器的类型 一 AutoEncoder 简介&#xff1a; 自动编码器是一种神经网络&#xff0c;用于无监督学习任务.(没有标签或标记数据), 例如降维,特征提取和数据压缩. 主要任务&#xff1a; 1&#xff1a; 输入数据 …...

Uniapp或者微信小程序如何动态的计算Scrollview的高度

当一个小程序页面&#xff0c;顶部有搜索栏&#xff0c;或者分类查询时&#xff0c;我们想要保证它们能固定到顶部&#xff0c;就需要使用到Scrollview&#xff0c;那么如何确定Scrollview就是一个问题&#xff0c;这时我们可以使用以下代码来实现 setScrollHeight(view #scr…...

Abase数据库管理系统

Abase数据库管理系统的架构介绍如下: 1. 概述 Abase是一个开源的分布式数据库中间件,实现MySQL数据库的自动扩缩容、故障转移和查询路由。 2. 功能架构 - 读写分离:拆分为主从两套服务 - 自动扩缩容:根据负载水平完成扩容 - 负载均衡:基于查询解析的路由 - 故障转移:快速切换…...

系统架构设计高级技能 · 大数据架构设计理论与实践

系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估&#xff08;二&#xff09;【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…...

ubuntu上使用osg3.2+osgearth2.9

一、介绍 在ubuntu上使用osgearth加载三维数字地球&#xff0c;首先要有osg和osgearth的库&#xff0c;这些可以直接使用apt-get下载安装&#xff0c;但是版本有些老&#xff0c;如果需要新版本的就需要自己编译。 #查看现有版本 sudo apt-cache madison openscenegraph #安装…...

C语言巧妙打印64位整数

使用C语言打印64位整数时&#xff0c;如果用的是32位编译器&#xff0c;那么打印如下&#xff0c; int64_t data 0x1234567890123456; printf("0x%llx\n", data);如果是64位编译器&#xff0c;那么打印代码如下&#xff0c; int64_t data 0x1234567890123456; pr…...

c语言每日一练(11)

前言&#xff1a;每日一练系列&#xff0c;每一期都包含5道选择题&#xff0c;2道编程题&#xff0c;博主会尽可能详细地进行讲解&#xff0c;令初学者也能听的清晰。每日一练系列会持续更新&#xff0c;暑假时三天之内必有一更&#xff0c;到了开学之后&#xff0c;将看学业情…...

SLAM十四讲学习笔记 第二期:部分课后实践代码

持续更新.... 前期准备第二讲实验一&#xff1a;简单输出 第五讲任务一&#xff1a;imageBasics&#xff08;Ubuntu配置opencv&#xff09;任务二&#xff1a;双目匹配点云&#xff08;Ubuntu配置pangolin&#xff09;检验部分我认为可以加深对CMake的理解 任务三&#xff1a;r…...

Android kotlin 跳转手机热点开关页面和判断热点是否打开

Android kotlin 跳转手机热点开关页面和判断热点是否打开 判断热点是否打开跳转手机热点开关页面顺带介绍一些其他常用的设置页面跳转 其他热点的一些相关知识Local-only hotspot 参考 判断热点是否打开 网上方法比较多&#xff0c;我这边使用了通过WifiManager 拿反射的getWi…...

Redis 执行 RDB 快照期间,主进程可以正常处理命令吗?

执行了 save 命令&#xff0c;会在主进程生成 RDB 文件&#xff0c;由于和执行操作命令在同一个线程&#xff0c;所以如果写入 RDB 文件的时间太长&#xff0c;会阻塞主进程。 执行 bgsave 过程中&#xff0c;由于是交给子进程来构建 RDB 文件&#xff0c;主进程还是可以继续工…...

Python加入Excel--生产力大提高|微软的全方面办公

Python作为一种功能强大的编程语言&#xff0c;已经逐渐成为了数据分析、机器学习、Web开发等领域的主流语言之一。而将Python集成到Excel中&#xff0c;则可以为Excel用户提供更加强大的数据处理和分析能力&#xff0c;同时也可以为Python开发者提供更加便捷的数据处理和可视化…...

Excel 分组排名

分组排名 公式&#xff1a;SUMPRODUCT((A:AA2)*(C:C>C2)) 1 降序&#xff1a;> 改为 < ⚠️注意1&#xff1a;此处空值参与排名&#xff1b;不参与排名则公式改为&#xff1a;IF(C2“”,“”,SUMPRODUCT((A:AA2)*(C:C>C2)) 1) ⚠️注意2&#xff1a;相同值的项…...

Redis初始以及安装

"梦却了无影踪&#xff0c;梦仍不曾改动" 初始Redis (1) Redis是什么&#xff1f; 要认识、学习一个软件&#xff0c;最重要的途径无一是去该软件的官方文档里瞅瞅、转悠转悠。 从官方文档的介绍中得知&#xff0c;Redis是一种工作于内存&#xff0c;…...

react导出、导入文件

导出文件&#xff1a; if (res) {let binaryData [];binaryData.push(res);let blobUrl ;blobUrl res;// let blobUrl window.URL.createObjectURL(new Blob(binaryData, { type: application / zip }));console.log(blobUrl);const eleLink document.createElement(a);el…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...