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

}
相关推荐
3***16105 分钟前
【JavaEE】Spring Boot 项目创建
java·spring boot·java-ee
6***v4179 分钟前
VScode 开发 Springboot 程序
java·spring boot·后端
t***316512 分钟前
SpringBoot中自定义Starter
java·spring boot·后端
z***33516 分钟前
SpringBoot获取bean的几种方式
java·spring boot·后端
e***749522 分钟前
【JavaEE】Spring Web MVC
前端·spring·java-ee
s***469829 分钟前
【SpringBoot篇】详解Bean的管理(获取bean,bean的作用域,第三方bean)
java·spring boot·后端
k***12171 小时前
SpringBoot返回文件让前端下载的几种方式
前端·spring boot·后端
s***P9822 小时前
Spring Boot 集成 MyBatis 全面讲解
spring boot·后端·mybatis
q***06292 小时前
解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务(Spring MVC Springboot)同时允许跨域
java·前端·spring
w***74172 小时前
spring session、spring security和redis整合的简单使用
redis·spring·bootstrap