后端:Spring、Spring Boot-配置、定义bean

文章目录

    • [1. 什么是Bean,如何配置](#1. 什么是Bean,如何配置)
    • [2. 如何配置bean](#2. 如何配置bean)
      • [2.1 使用注解@Bean](#2.1 使用注解@Bean)
      • [2.2 使用注解@Import](#2.2 使用注解@Import)

1. 什么是Bean,如何配置

被spring容器所管理的对象被称为bean,管理方式可以有纯xml文件方式、注解方式进行管理(比如注解@Component)。

在Spring Boot中,在注解 @Component 的基础上,衍生出注解 @Service(专门用于处理业务类的注解)、@Repository(专门用于处理数据访问的注解)。

2. 如何配置bean

2.1 使用注解@Bean

在一个配置类上,定义一个方法,返回值为一个对象的实例化,在这个方法上添加注解@Bean,如下:

java 复制代码
package com.lize.demo.dao;

public class UserDao {
    public void printUserDao(){
        System.out.println("UserDao");
    }
}
java 复制代码
package com.lize.demo.config;


import com.lize.demo.dao.UserDao;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringConnfig {
    @Bean
    public UserDao getUserDao(){
        return new UserDao();
    }
}

单元测试类如下:

java 复制代码
package com.lize.demo;

import com.lize.demo.dao.UserDao;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class DemoApplicationTests {

    @Autowired
    private UserDao ud;

    @Test
    void contextLoads() {

        ud.printUserDao();
    }
}

通过@Bean这种方式定义Bean,相比于直接在类上添加注解@component定义Bean。前者返回的是一个实例化对象,可以在这个过程中设置一些参数初始化Bean。

2.2 使用注解@Import

  • 需要写在类上;
  • 标记的类必须是一个bean,否则不会起作用;
java 复制代码
@Component
@Import(UserDao.class)
public class SpringConnfig {

}

上述只是基础写法。另外,可以实现ImportSelector这个接口,并重写其方法selectImports,这个方法返回的是一个字符串数组,字符串数组的值为类的完整路径,进行批量注入Bean,如下:

java 复制代码
package com.lize.demo.config;

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

public class MyImportSelector implements ImportSelector {

    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {

        return new String[]{
                "com.lize.demo.dao.UserDao"
        };
        // 返回字符串数组
    }
}
java 复制代码
@Component
@Import(MyImportSelector.class)
public class SpringConnfig {

}

还有一种写法为,实现ImportBeanDefinitionRegistrar这个接口,并重写其方法registerBeanDefinitions,如下:

java 复制代码
package com.lize.demo.config;

import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

public class MyImportBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {


        RootBeanDefinition definition = new RootBeanDefinition();
        definition.setBeanClassName("com.lize.demo.dao.UserDao");
        registry.registerBeanDefinition("UserDao",definition);
    }
}
java 复制代码
package com.lize.demo.config;


import com.lize.demo.dao.UserDao;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.stereotype.Component;

@Component
@Import(MyImportBeanDefinitionRegister.class)
public class SpringConnfig {

}
相关推荐
来福猿4 小时前
SpringCloud Config 源码分析:配置拉取、刷新与多环境管理
后端·spring·spring cloud
古法老登瞎折腾5 小时前
大数据智能运维实战(一):机器和任务数据都有了,如何用 MCP 搭建运维助手?
大数据·运维·spring boot·spring ai·mcp
企业数字化笔记6 小时前
多租户配额怎么控制?用量口径、并发预留与超额处理的实现方法
java·数据库·spring boot
雷一言说8 小时前
Spring AI 2.0 RAG:用 Metadata Filter 做多租户检索隔离
java·spring
WeiXin_DZbishe8 小时前
基于springboot装修风格选择系统的设计与开发-计算机毕设【课程设计】77964
java·vue.js·spring boot·后端·python·php·课程设计
摇滚侠8 小时前
《大模型应用开发实践:基于 Spring AI+DeepSeek 实现》第 11 章 大模型技术概览 阅读笔记 1
人工智能·笔记·spring
十年Java程序媛9 小时前
Java 多线程基础与锁机制详解|进程线程、锁升级、synchronized 与 Lock 对比
java·开发语言·spring boot
Q264336502312 小时前
【有源码】基于SpringBoot+Vue的居民健康体检与慢病干预管理系统-面向智慧医疗的体检预约与健康知识服务平台
java·vue.js·spring boot·mysql·毕业设计·javaweb·课程设计
撸串-研究生12 小时前
基于Spring Boot的智慧社区垃圾分类与回收系统的设计与实现【附源码】
spring boot·后端·分类·垃圾分类·社区管理
ly768912 小时前
PostgreSQL 流复制与高可用切换:主从延迟、同步提交与 Spring Boot 读写分离的边界
数据库·spring boot·postgresql·读写分离·流复制·高可用切换