SpringBoot —— Bean的注入方式

时间:2025-04-02 10:20:27

文章目录

  • 1、组件注解
  • 2、@Component + @Bean
  • 3、@Import(PlaceHolderClass)快速导入一个组件
  • 4、使用Spring提供的FactoryBean注入

1、组件注解

注解 描述
@Component 组件定义不清晰时候的注解
@Controller 控制器层
@Service 服务层
@Repository 数据层

注:添加注解的类需要与启动类在同一个包路径下,如果在别的包下,需要在 启动类启动类所在包下的存在以上注解的类 中添加 @ComponentScan 注解。

例如:

启动类:

package com.springboottest;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackages = {"", ""})
public class SpringbootTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootTestApplication.class, args);
    }

}

Student类(与启动类不在同一个包路径下):

package com.springtest;

import lombok.Data;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;

@Data
@Component
public class Student {

    private String name;
    private String nickName;
}

2、@Component + @Bean

@Component
public class Test {

   @Bean
   public User user() {
        return new User();
   }
}

注:@Bean注解的方法,返回值 User 作为注入的 Bean 对象。


3、@Import(PlaceHolderClass)快速导入一个组件

PlaceHolderClass 描述
一般Class 直接注入
实现了ImportSelector接口的Class 根据返回类的全限定名数组注入
实现了ImportBeanDefinitionRegistrar接口的Class 获取类描述信息,选择性手动注入
@Configuration
@Import({ImportDemo.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class ImportConfig{
    @Bean
    public User user(){
        return new User();
    }
}
//自定义逻辑返回需要导入的组件
public class MyImportSelector implements ImportSelector {
 
    //返回值是导入到容器中的组件全限定名数组
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        //当前类的所有注解
        Set<String> annotationTypes = importingClassMetadata.getAnnotationTypes();
        System.out.println("当前配置类的注解信息:"+annotationTypes);
        return new String[]{".user01",".user02"};
    }
}
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
 
    /**
     * AnnotationMetadata:当前类的注解信息
     * BeanDefinitionRegistry:BeanDefinition注册类;
     *      把所有需要添加到容器中的bean;调用
     *      手工注册进来
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
 
        boolean definition = registry.containsBeanDefinition(".User01");
        boolean definition2 = registry.containsBeanDefinition(".User02");
        if(definition && definition2){
            //创建一个类的BeanDefinition(Bean的描述信息对象)
            RootBeanDefinition beanDefinition = new RootBeanDefinition(User03.class);
            //注册一个Bean,指定bean名
            registry.registerBeanDefinition("User03", beanDefinition);
        }
    }
}

4、使用Spring提供的FactoryBean注入

public class UserFactoryBean implements FactoryBean<User> {
    
    // 注入的Bean
    @Override
    public User getObject() throws Exception {
        return new User();
    }

    // 注入的Bean类型
    @Override
    public Class<?> getObjectType() {
        return User.class;
    }
    
    // 是否是单例
    @Override
    public boolean isSingleton() {
        return true;
    }
}