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

}
相关推荐
mygljx1 小时前
SpringBoot+Mybatis-plus实现分页查询(一看就会)
spring boot·mybatis·状态模式
彭于晏Yan9 小时前
Redisson分布式锁
spring boot·redis·分布式
ywf121511 小时前
Spring Boot接收参数的19种方式
java·spring boot·后端
独断万古他化13 小时前
【Java 实战项目】多用户网页版聊天室:消息传输模块 —— 基于 WebSocket 实现实时通信
java·spring boot·后端·websocket·ajax·mybatis
yyt36304584113 小时前
spring单例bean线程安全问题讨论
java·spring
Sweet锦14 小时前
SpringBoot 3.5 集成 InfluxDB 1.8
spring boot·时序数据库
Java水解14 小时前
Spring Boot 消息队列与异步处理
spring boot·后端
云烟成雨TD16 小时前
Spring AI 1.x 系列【14】三月双版本连发!Spring AI 最新功能全掌握
java·人工智能·spring
深蓝轨迹17 小时前
黑马点评--达人探店模块
java·spring boot·redis