注入bean的方式

HeJin大约 1 分钟源码解析bean的注入

public class User {

    private String name = "天动万象";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

注解

  • @Configuration
  • @Component
  • @Service
  • @Controller
  • @Repository

配置类注入bean

@SpringBootApplication
public class Springboot01Application {

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

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

}

@Import注入bean

具体的类

@Import(User.class)
@SpringBootApplication
public class Springboot01Application {

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

}

配置类

@Import(UserConfig.class)
@SpringBootApplication
public class Springboot01Application {

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

}

UserConfig

public class UserConfig {

    @Bean
    public User user(Cat cat){
        User user = new User();
        user.setCat(cat);

        return user;
    }

    @Bean
    public Cat cat(){
        return new Cat();
    }

}

实现了ImportSelector接口的类

@Import(UserSelector.class)
@SpringBootApplication
public class Springboot01Application {

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

}

UserSelector

public class UserSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        // 全路径名称
        return new String[] {"com.hejin.entity.User", "com.hejin.entity.Cat"};
    }
}

实现了ImportSelector接口的类,这种方式注入bean。我们可以把类的全路径名称写在配置文件中,通过读取流的方式获得全路径名称数组,实现统一注入。

思考

SpringBoot默认扫描的是主启动类所在的包及其子包。这些包是我们自己建的。假如这时候需要引入第三方的依赖,SpringBoot是扫描不到第三方依赖的包的。一般第三方都会提供一个Configuration,我们直接使用@Import导入即可使用。