SpringFramework之基于配置类管理Bean

news2024/11/16 1:48:11

1、完全注解开发理解

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

上篇的最后我们总结说即使有了注解,我们仍需要xml来配置

①扫描包 ②外部配置文件 ③第三方组件

这里我们使用完全注解配置方式,通过此来替代xml的方式。

两种方式转换图:

2、配置类和扫描注解

①xml+注解方式

配置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 https://www.springframework.org/schema/context/spring-context.xsd">


    <!-- 配置自动扫描的包 -->
    <!-- 1.包要精准,提高性能!
         2.会扫描指定的包和子包内容
         3.多个包可以使用,分割 例如: com.atguigu.controller,com.atguigu.service等
    -->
    <context:component-scan base-package="com.atguigu.components"/>

    <!-- 引入外部配置文件-->
    <context:property-placeholder location="application.properties" />
</beans>

②配置类+注解方式(完全注解方式)

a. 组件类

package demo04;

import demo03.UserDao;
import demo03.UserSerivein;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Service
public class JavaBean {

    private int age=8;
    @Value("${url}")
    private String url;
    @Value("${a:cui}")
    private String name;

    @Override
    public String toString() {
        return "JavaBean{" +
                "age=" + age +
                ", url='" + url + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

b. 外部配置

c.配置类 MyConfig.java

package configjava;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.PropertySource;

import org.springframework.stereotype.Component;

//此注解代表该类是一个配置类,

@Configuration

//使用注解读取外部配置,替代 <context:property-placeholder标签,外部配置可以有多个{}

@PropertySource("classpath:aoo.properties")

//使用@ComponentScan注解,可以配置扫描包,替代<context:component-scan标签,扫描包可以有多个basePackages={"xx","xx"}

@ComponentScan(basePackages = {"demo04"})

public class MyConfig { }

d. 测试

public void test_05(){
  //实例化容器 方法1
  AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(MyConfig.class);
// AnnotationConfigApplicationContext-IOC容器对象 方法2
        AnnotationConfigApplicationContext iocContainerAnnotation = new AnnotationConfigApplicationContext();
//外部设置配置类
        iocContainerAnnotation.register(MyConfig.class);
//刷新后方可生效!!
        iocContainerAnnotation.refresh();
        //得到Bean对象
        JavaBean javaBean=iocContainerAnnotation.getBean(JavaBean.class);
        System.out.println(javaBean);
        iocContainerAnnotation.close();
    }

使用配置类,我们要使用AnnotationConfigApplicationContext 该实现类

总结:

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

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

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

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

3、使用@Bean定义组件

对于第三方组件,我们不需要使用<bean>标签写在xml里,我们用配置类的方式来代替该功能。

java1

package demo04;

public class Java1 {
    private Java2 java2;

    public void setJava2(Java2 java2) {
        this.java2 = java2;
    }
    public void init(){

        System.out.println("111init");
    }
}

java2

package demo04;

public class Java2 {
    public void show(){
        System.out.println("java2");
    }
}

java3

package demo04;

import org.springframework.stereotype.Component;

@Component
public class Java3 {
    public  void show(){
        System.out.println("java3");
    }
}

 MyConfig.java 配置类

package configjava;

import com.alibaba.druid.pool.DruidDataSource;
import demo04.Java1;
import demo04.Java2;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.*;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

//此注解代表该类是一个配置类,
@Configuration
//使用注解读取外部配置,替代 <context:property-placeholder标签,外部配置可以有多个{}
@PropertySource("classpath:aoo.properties")
//使用@ComponentScan注解,可以配置扫描包,替代<context:component-scan标签,扫描包可以有多个{xx,xx}
@ComponentScan(basePackages = {"demo04"})
@PropertySource("aoo.properties")
public class MyConfig {
  引入第三方组件
    @Bean(value = "cui")修改id名称
    @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)  作用域
     public DruidDataSource druidDataSource(){
         DruidDataSource druidDataSource = new DruidDataSource();
         druidDataSource.setUrl("");
         druidDataSource.setPassword("");
         druidDataSource.setUsername("");
         druidDataSource.setDriverClassName("");

         return druidDataSource;

     }
   @Bean
   public Java2 java2(){
        return new Java2();
   }
//    @Bean
//    public Java2 java2_1(){
//        return new Java2();
//    }
//     @Bean
//     public Java1 java1(Java2 java2_1){ 有多个 则根据id名称来匹配对应组件 通过形参来进行di配置
//        java2_1.show();
//     return new Java1();
//     }
    @Bean
    public Java1 java1(){
        Java1 java1=new Java1();
        java1.setJava2(java2());都是@Bean组件 直接调用方法 来进行di配置
        return new Java1();
    }


     @Bean
    public JdbcTemplate jdbcTemplate(){
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(druidDataSource()); 直接调用方法
         return jdbcTemplate;
    }
}

 我们通过配置类来进行讲解。

1.在配置类中 添加上了@Bean 就代表将来在创建容器类时,会自动将该组件添加进ioc容器

2、我们已经解决了扫描包和读取外部配置类的问题 在这里我们来解决 如何引用第三方组建的问题 我们可以使用@Bean 标签 方法返回值 是我们要添加进ioc组件的类型名,方法名默认是组件id名称

问题1 如何修改组件id名称  我们可以利用Bean标签的参数 value或name

问题2: 组件生命周期

     方法1:我们仍然可以使用之前的@PostConstruct和@PreDestory 注解   

     方法2:我们可以利用Bean标签的参数 initMethod = "",destroyMethod = ""

 问题3: 组件作用域 默认单例 

      可以通过@Scope来修改

  问题4 :如何依赖注入

     方法1:我们可以直接将需要的类型 在参数中进行传递 

         只有1个的情况下 直接匹配

         如果该组件类型不在ioc容器中 则报错   

         如果该组件类型有多个 则会按照id名称来 匹配其中一个组件

      方法2:如果都是@bean组件,则可以直接调用方法 

4、@import 拓展

使用@import可以将其它配置类整合到一个配置类中,最后在AnnotationConfigApplicationContext中只需导入最后一个整合过的配置类即可,简化操作。

package configjava;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
//使用@Import 将多个配置类整合到一个,如果有多个 value={,,,}
@Import(value = MyConfig2.class)
@Configuration
public class MyConfig1 {
}
package configjava;

import org.springframework.context.annotation.Configuration;

@Configuration
public class MyConfig2 {
}

 

5、三种配置方式总结

(1)XML方式

 1. 所有内容写到xml格式配置文件中
2. 声明bean通过<bean标签
3. <bean标签包含基本信息(id,class)和属性信息 <property name value / ref property是通过setter注入时。通过构造函数的在xml中通过constructor-arg 来编写信息
4. 引入外部的properties文件可以通过<context:property-placeholder
5. IoC具体容器实现选择ClassPathXmlApplicationContext对象

(2) 注解类+XML方式

1. 注解负责标记IoC的类和进行属性装配
2. xml文件依然需要,需要通过<context:component-scan标签指定注解范围
3. 标记IoC注解:@Component,@Service,@Controller,@Repository 
4. 标记DI注解:@Autowired @Qualifier @Resource @Value
5. IoC具体容器实现选择ClassPathXmlApplicationContext对象

(3)完全注解方式

1. 完全注解方式指的是去掉xml文件,使用配置类 + 注解实现
2. xml文件替换成使用@Configuration注解标记的类
3. 标记IoC注解:@Component,@Service,@Controller,@Repository 
4. 标记DI注解:@Autowired @Qualifier @Resource @Value
5. <context:component-scan标签指定注解范围使用@ComponentScan(basePackages = {"com.atguigu.components"})替代
6. <context:property-placeholder引入外部配置文件使用@PropertySource({"classpath:application.properties","classpath:jdbc.properties"})替代
7. <bean 标签使用@Bean注解和方法实现
8. IoC具体容器实现选择AnnotationConfigApplicationContext对象

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

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

相关文章

深度剖析Android Binder IPC机制

Android系统的成功离不开其强大的IPC&#xff08;Inter-Process Communication&#xff09;机制&#xff0c;其中最引人注目的就是Binder。本文将深入探讨Binder的技术原理&#xff0c;解释其工作方式以及相关的关键概念。 什么是Binder Binder是Android系统中的IPC机制&…

【递归、搜索与回溯算法】第一节.初识递归、搜索与回溯算法

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;递归、搜索与回溯算法 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&am…

hive一行多列合并为一行一列

SELECT named_struct(name, John, age, 30, city, New York) AS person;

【前端】Layui小功能收集整理

目录 1、layui 鼠标悬浮提示文字 2、关闭当前窗口并刷新父页面 3、子iframe关闭/传值/刷新父页面 1、layui 鼠标悬浮提示文字 鼠标放在图标上悬浮显示提示信息&#xff0c;效果图如下 <div style"float:left; line-height:40px">道试题 <i class"l…

【MySQL进阶之路丨第十篇】一文带你精通MySQL排序、分组、连接

引言 在上一篇中我们介绍了MySQL子句&#xff1b;在开发中&#xff0c;掌握数据的排序、分组、连接等操作和语句是十分重要的。 这一篇我们使用命令行方式来帮助读者掌握MySQL中数据的排序、分组与连接。 上一篇链接&#xff1a;MySQL | 一文带你精通MySQL子句 MySQL排序 MySQ…

ChatGPT在测试计划中的应用策略

简介 测试计划是指描述了要进行的测试活动的范围、方法、资源和进度的文档。它主要包括测试项、被测特性、测试任务和风险控制等。 所以在使用ChatGPT输出结果之前&#xff0c;我们需要先将文档的内容框架梳理好&#xff0c;以及将内容范围划定好&#xff0c;必要的时候&…

学生学徒作品分享——金融大模型-房屋租金价格影响因素分析与预测

金融大模型-房屋租金价格影响因素分析与预测项目背景 广州作为中国最发达的城市之一&#xff0c;每年都吸引大量务工人员前来就业&#xff0c;而租房是他们需要解决的最大问题之一&#xff0c;各地区租房需求日益增长。在租房过程&#xff0c;价格、交通是重要的考虑因素&a…

vue3同时引入多个iconfont图标库

vue3同时引入多个iconfont图标库 本文目录 vue3同时引入多个iconfont图标库下载iconfont库创建项目库图标加入项目库下载到本地 vue3引入文件存放位置main.ts设置组件中使用 分别引入多个iconfont 下载iconfont库 创建项目库 iconfont官网&#xff1a;https://www.iconfont.c…

物联网_01_物理设备的网络接入

设备的网络接入及物理层使用到的传输协议 现在物理设备有两种接入方式,一种是直接接入另一种是网关接入 直接接入 给物理设备添加NB-IOT通信模组等设备使之具有直接接入网络的能力 网关接入 物理设备在本地组网后通过统一的网关接入到网络(ZigBee无线组网网关).网关是处在本地…

Win10使用nginx,注册到服务设置自启与后台运行,解决 Access is denied 问题

安装 nginx 下载 nginx 官网下载页面&#xff1a;https://nginx.org/en/download.html直接选择当前最新 window 版本的或找到自己需要的版本下载即可 安装使用 下载完成后是有一个压缩包文件&#xff0c;直接解压到自己需要的目录下即可。是免安装的&#xff0c;解压即用简…

2023年中国功能型内窥镜市场发展趋势分析:市场渗透潜力空间广阔[图]

4K内窥镜系统对图像算法存在更高的要求。仅采用软件方式处理图像难以符合4K系统对算力的高要求。其次&#xff0c;针对内窥镜图像的亮暗区域不均匀、饱和度低、细节纹理及组织结构需突出的特点&#xff0c;在选择合适的图像增强算法上难度较大。 功能型内窥镜行业壁垒分析 资料…

Vue动态class

注意在自定义组件上绑定class会添加到该组件的根元素上面 1.对象语法 传入class对象v-bind:class 指令也可以与普通的 class attribute 共存可以动态修改class的值可以绑定一个计算数据来实现 1.传入class对象 <script src"./vue.js"></script><di…

强大的虚拟机软件 VMware Fusion Pro 13中文最新 for mac

VMware Fusion Pro是一款虚拟化软件&#xff0c;它允许在Mac电脑上同时运行Windows和其他操作系统&#xff0c;而无需重启电脑&#xff0c;它采用了领先的虚拟化技术&#xff0c;能够保证在Mac电脑在同时运行多个操作系统时表现出极高的效率和稳定性。 VMware Fusion Pro具有以…

@Binds methods must be abstract 报错指南

bindings方法必须是抽象的 Binds使用错误

页面查询多项数据组合的线程池设计 | 京东云技术团队

背景 我们应对并发场景时一般会采用下面方式去预估线程池的线程数量&#xff0c;比如QPS需求是1000&#xff0c;平均每个任务需要执行的时间是t秒&#xff0c;那么我们需要的线程数是t * 1000。 但是在一些情况下&#xff0c;这个t是不好估算的&#xff0c;即便是估算出来了&…

数据仓库分层

原因 用空间换时间&#xff0c;通过大量的预处理来提升应用系统的用户体验&#xff08;效率&#xff09;&#xff0c;因此数据仓库会存在大量冗余的数据。如果不分层的话&#xff0c;如果源业务系统的业务规则发生变化将会影响整个数据清洗过程&#xff0c;工作量巨大。通过数…

C# Onnx Yolov8 Detect 烟雾检测

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace Onnx…

MAX插件CG Magic怎么云渲染?操作方法已整起!

小编这里会收到不少网友的反馈是关于3ds max插件CG Magic怎么云渲染&#xff1f; 3d max的这款插件CG MAGIC的出现就是为了设计师使用过程中&#xff0c;可以省时又省心的完成工作。 同时&#xff0c;大家要了键下&#xff0c;现阶段CG MAGIC有18个板块&#xff0c;118个模块…

安装Git和git命令使用

文章目录 安装Git创建版本库版本回退工作区和暂存区管理修改撤销修改 安装Git 在Windows上安装Git 在Windows上使用Git&#xff0c;可以从Git官网直接下载安装程序&#xff0c;然后按默认选项安装即可。 安装完成后&#xff0c;在开始菜单里找到“Git”->“Git Bash”&…

三星正在开发HBM4,预计2025年推出

近年来&#xff0c;人工智能&#xff08;AI&#xff09;、高性能计算&#xff08;HPC&#xff09;和PC一直在推动高性能DRAM产品的研发&#xff0c;市场对HBM类DRAM的需求也在迅速增长&#xff0c;各大厂商也加大了这方面的投入。目前HBM市场主要由三星、SK海力士和美光三家存储…