后端: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 {

}
相关推荐
掉鱼的猫1 天前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·spring boot
人活一口气2 天前
Spring Boot与AIGC的完美结合:从零搭建智能内容生成平台
java·spring boot·aigc
唐青枫3 天前
Java Spring WebFlux 实战指南:用 Mono、Flux 和 WebClient 写响应式接口
java·spring
咖啡八杯5 天前
GoF设计模式——策略模式
java·后端·spring·设计模式
java小白小5 天前
SpringBoot(01): 初识SpringBoot,从Spring的痛点说起
spring boot
用户3169353811835 天前
如何从零编写一个 Spring Boot Starter
spring boot
程序员晓琪6 天前
约定大于配置:基于 Java 包名自动生成 API 版本路由的最佳实践
java·spring boot·后端
Flittly6 天前
【AgentScope Java新手村系列】(11)中断与恢复
java·spring boot·spring
dunky6 天前
Spring 的三级缓存与循环依赖
后端·spring
用户3521802454757 天前
🎆从 Prompt 到 Skill:让 Spring AI Agent 学会"装新技能"
人工智能·spring boot·ai编程