spring常用注解及源码解析(一)

1、@Configuration

从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器

1、@Configuration不可以是final类型的类

2、@Configuration不可以是匿名类

3、嵌套的@Configuration必须是静态类

注册Bean的过程:
1.1、@Configuration配置spring并启动spring容器

1.2、@Configuration启动容器+@Bean注册Bean

1.3、@Configuration启动容器+@Component注册Bean

Demo:


//配置类等同于以前的配置文件

@Configuration

public class MainConfig {

//给容器注册一个bean,类型是返回值,id默认是用方法名作为id

    //当指定value时,value的值作为该bean的id,不会再去看方法名是什么了

    @Bean(value ="person")

public Personperson01(){

return new Person("snail",20);

    }

}

2、@Bean

1、给容器注册一个bean,类型是返回值,id默认是用方法名作为id
2、当指定value时,value的值作为该bean的id,不会再去看方法名是什么了
3、Demo

@Configuration
public class MainConfig {
    //给容器注册一个bean,类型是返回值,id默认是用方法名作为id
    //当指定value时,value的值作为该bean的id,不会再去看方法名是什么了
    @Bean(value = "person")
    public Person person01(){
        return new Person("snail",20);

    }

}

3、@ComponentScan

可以指定扫码的范围
1、按照包来扫

@ComponentScan(value = "com.dwd.snail.testspring.test")

2、按照注解类型来

@ComponentScan(
        excludeFilters ={@ComponentScan.Filter(type= FilterType.ANNOTATION
,classes = {Controller.class, Repository.class})})

3、按照给定的类型来

@ComponentScan(@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,
                classes = {BookController.class})})

4、可以指定多个ComponentScan规则(该注解可以在配置类上配置多个)

4、@Scope

指定注册的Bean是单实例还是多实例的
1、默认是单实例的,ioc容器启动就会调用方法,并放在容器中,以后就从容器中拿
2、如果改成多实例的话,ioc容器启动时不会调用方法
3、单实例的初始化和销毁都归容器管,但是多实例的话,容器只负责调用,不负责管理这些Bean
Demo:

    @Scope("prototype") //singleton 是单实例的
    //给容器注册一个bean,类型是返回值,id默认是用方法名作为id
    //当指定value时,value的值作为该bean的id,不会再去看方法名是什么了
    @Bean(value = "person")
    public Person person01(){
        return new Person("snail",20);

    }

你可能感兴趣的:(spring常用注解及源码解析(一))