Springboot Bean 小记

Spring boot 中创建bean的方式

  • @Component Spring中最广的注解

    1
    2
    3
    4
    @Compent
    public class DemoBean(){

    }
  • @Bean 一般使用在动态代理的配置类中 @Configuration

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Configuration
    public class DemoConfig(){

    private DemoClass demoClass;

    @Bean
    public DemoClass demoClass(){
    return demoClass;
    }
    }

顺便说下两个注解的区别

在Component中(@Component标注的类,包括@Service,@Repository, @Controller)使用@Bean注解和在@Configuration中使用是不同的。在@Component类中使用方法或字段时不会使用CGLIB增强(及不使用代理类:调用任何方法,使用任何变量,拿到的是原始对象)。而在@Configuration类中使用方法或字段时则使用CGLIB创造协作对象(及使用代理:拿到的是代理对象);当调用@Bean注解的方法时它不是普通的Java语义,而是从容器中拿到由Spring生命周期管理、被Spring代理甚至依赖于其他Bean的对象引用。在@Component中调用@Bean注解的方法和字段则是普通的Java语义,不经过CGLIB处理

简单来说就是 @Configuration 里面多处理了一层,动态增强了,例如同一个bean 就不会被重复生成,而 @Component 就会

统一封装springboot dubbo 的调用 封装到一个类中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Configuration
public class DubboApiBean {

@Reference(version = "1.0")
private IPersonnelApi personnelApi;

@Reference(version = "1.0")
private IPrivilegeApi privilegeApi;

@Reference(version = "1.0")
private IMisApi misApi;

@Bean
public IPersonnelApi personnelApi() {
return personnelApi;
}

@Bean
public IPrivilegeApi privilegeApi() {
return privilegeApi;
}

@Bean
public IMisApi misApi(){
return misApi;
}
}

在调用时直接使用@Resource 或@Autowired