基于配置类方式管理 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注解

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

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

相关文章

ubuntu安装Google Chrome 浏览器和ChromeDriver

要在Ubuntu上安装Google Chrome浏览器和ChromeDriver&#xff0c;可以按照以下步骤操作&#xff1a; 1. 安装Google Chrome 浏览器 下载Google Chrome 的最新版本。 wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb使用dpkg安装下载的deb包。…

根据订单项id获取订单项

目录 1 himall3.0商城源码 1.1 /// 根据订单项id获取订单项 1.2 /// 获取订单的评论数 1.3 /// 根据订单项id获取售后记录 himall3.0商城源码 public static List<InvoiceTitleInfo> GetInvoiceTitles(long userid) {

【OCR识别】tess4j图片识别文字

什么是OCR? OCR &#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;是指电子设备&#xff08;例如扫描仪或数码相机&#xff09;检查纸上打印的字符&#xff0c;通过检测暗、亮的模式确定其形状&#xff0c;然后用字符识别方法将形状翻译成计算机…

使用Docker进行模型部署

一、常见的模型部署场景 实时的、小数据量的预测应用 部署方式&#xff1a;采用python-httpserve应用部署&#xff08;如flask, fastApi, django&#xff09;&#xff0c;缺点是可能需要跨环境&#xff0c;从Java跨到Python环境实时的、大数据量的预测应用 部署方式&#xff1…

【力扣】349. 两个数组的交集 <哈希>

【力扣】349. 两个数组的交集 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2] 示例 2&#…

MongoDB入门

简介 MongoDB是一个开源、高性能、支持海量数据存储的文档型数据库 是NoSQL数据库产品中的一种&#xff0c;是最像关系型数据库&#xff08;MySQL&#xff09;的非关系型数据库 内部采用BSON(二进制JSON)格式来存储数据,并支持水平扩展。 MongoDB本身并不是完全免费的,它对…

《C和指针》笔记10:作用域

结合上面的例子讲解C语言的作用域。 1. 代码块作用域 (block scope) 位于一对花括号之间的所有语句称为一个代码块。任何在代码块的开始位置声明的标识符都具有代码块作用域 (block scope)&#xff0c;表示它们可以被这个代码块中的所有语句访问。上图中标识为6、7、9、10的变…

Unity C# 之 Task、async和 await 结合使用的一些情况处理

Unity C# 之 Task、async和 await 结合使用的一些情况处理 目录 Unity C# 之 Task、async和 await 结合使用的一些情况处理 一、简单介绍 二、把 async 函数&#xff0c;通过变化转为一般的函数 三、在 async 函数中&#xff0c;切换到主线程&#xff0c;并等待主线程执行…

Ubuntu释放VMware虚拟磁盘未使用空间

By: Ailson Jack Date: 2023.08.26 个人博客&#xff1a;http://www.only2fire.com/ 本文在我博客的地址是&#xff1a;http://www.only2fire.com/archives/152.html&#xff0c;排版更好&#xff0c;便于学习&#xff0c;也可以去我博客逛逛&#xff0c;兴许有你想要的内容呢。…

echarts 甘特图一组显示多组数据

<template><el-button type"primary" click"addlin">添加线</el-button><el-button type"success" click"addArea">添加区域</el-button><div ref"echart" id"echart" class&qu…

SQL自动递增的列恢复至从0开始

在许多数据库管理系统中&#xff0c;当你删除表格中的所有数据时&#xff0c;自动递增的列&#xff08;也称为自增列、标识列或序列&#xff09;的计数器通常不会重置为 0。这是出于性能和数据完整性方面的考虑&#xff0c;以避免因删除数据而导致的自增列值冲突。即使你删除了…

VB.NET调用VB6 Activex EXE实现PowerBasic和FreeBasic的标准DLL调用

VB6写的ActiveX EXE公共对象是外置进程&#xff0c;因此&#xff0c;尽管它是x86 32位的进程&#xff0c;但可以集成到 VB.NET的x64和x32程序中使用。 VS2022的VB.NET程序&#xff0c;调用ActiveX DLL对象我在上篇笔记中写了 VB.NET通过VB6 ActiveX DLL调用PowerBasic及FreeB…

TMS FlexCel Studio for VCL and FireMonkey Crack

TMS FlexCel Studio for VCL and FireMonkey Crack FlexCel for VCL/FireMonkey是一套允许操作Excel文件的Delphi组件。它包括一个广泛的API&#xff0c;允许本机读取/写入Excel文件。如果您需要在没有安装Excel的Windows或macOS机器上阅读或创建复杂的电子表格&#xff0c;Fle…

从零开始学习Python爬虫:详细指南

导言&#xff1a; 随着互联网的迅速发展&#xff0c;大量的数据可供我们利用。而Python作为一种简单易学且功能强大的编程语言&#xff0c;被广泛应用于数据分析和处理。学习Python爬虫技术&#xff0c;能够帮助我们从互联网上获取数据&#xff0c;并进行有效地分析和利用。本文…

YOLOv5算法改进(5)— 添加ECA注意力机制

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。ECA注意力机制是一种用于图像处理中的注意力机制&#xff0c;是在通道注意力机制的基础上做了进一步的改进。通道注意力机制主要是通过提取权重&#xff0c;作用在原特征图的通道维度上&#xff0c;而ECA注意力机制则使用了…

网络基础入门

认识协议 协议其实是一种约定 网络协议初识&#xff1a; 1.内核上以结构体形式呈现 2.操作系统要进行协议管理--先描述&#xff0c;在管理 3.协议的本质是软件&#xff0c;软件是可以分层的&#xff0c;&#xff08;联系C继承多态的知识 &#xff09; 可以参考 &#xff1…

wireshark 流量抓包例题重现

目录 要求 黑客攻击的第一个受害主机的网卡IP地址黑客对URL的哪一个参数实施了SQL注入第一个受害主机网站数据库的表前缀 第一个受害主机网站数据库的名字 要求 &#xff08;1&#xff09;黑客攻击的第一个受害主机的IP地址 &#xff08;2&#xff09;黑客对URL的某一参数实…

【Go 基础篇】Go语言包详解:模块化开发与代码复用

介绍 在Go语言中&#xff0c;包&#xff08;Package&#xff09; 是一种用于组织代码的机制&#xff0c;用于将相关的函数、类型和变量等组织在一起&#xff0c;以便于模块化开发和代码复用。包的使用能够使程序结构更加清晰、可维护性更高&#xff0c;同时也是Go语言强调的一…

Scikit-learn强化学习代码批注及相关练习

一、游戏介绍 木棒每保持平衡1个时间步&#xff0c;就得到1分。每一场游戏的最高得分为200分每一场游戏的结束条件为木棒倾斜角度大于41.8或者已经达到200分。最终获胜条件为最近100场游戏的平均得分高于195。代码中env.step&#xff08;&#xff09;&#xff0c;的返回值就分…

0825|C++day5 运算符重载+静态成员+类的基础【Xmind+实例】

一、运算符重载 实例&#xff1a;&#xff08;赋值运算符、自增自减运算符、插入提取运算符&#xff09; #include <iostream>using namespace std;class Person {friend Person & operator(Person &L,const Person &R);friend Person & operator(Perso…