ETJava Beta | Java    注册   登录
  • Spring加载bean

    发表于 2024-09-15 22:59:07     阅读(199)     博客类别:Spring

    Spring加载Bean时注意事项

     

    相同类型中定义相同的bean和在不同类型中定义相同的bean 默认加载方式
        1. @Configuration注解标注的配置类中如果存在bean 则优先加载配置类中的bean
        2. 如果给bean手动指定了名称 则会全部加载
        3. 调用时 如果指定了bean的名称则不可以在使用class方式获取bean
        4. 同一类型中多个相同的bean时只能使用名称加载 采用方法名作为默认名称

     

    测试案例

     

    不同类型中存在相同bean的加载

    MyDataSourceBean

    public class MyDataSourceBean {
    
        @Bean
        public MyDataSource myDataSource(){
            System.out.println("外部配置类中的MyDataSource");
            return new MyDataSource();
        }
    }

     

    Spring配置类

     

    @Configuration
    @Import(MyDataSourceBean.class)
    public class SpringConfig {
    
        @Bean
        public MyDataSource myDataSource(){
            System.out.println("spring配置类中的MyDataSource");
            return new MyDataSource();
        }
    }

     

    测试1 容器初始化加载的是哪个bean

     

    public class Test {
    
        public static void main(String[] args) {
            AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);
        }

    测试2 class方式加载bean

     

     public static void main(String[] args) {
            AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);
            ac.getBean(MyDataSource.class);
        }

     

    测试3 name方式加载

     

    public static void main(String[] args) {
            AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);
            ac.getBean("myDataSource1");
        }

     

    测试4 错误的使用方式

     

    当给bean标记了名称时 不可以在使用class方式加载bean

    public static void main(String[] args) {
    	AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);
        ac.getBean(MyDataSource.class);
    }

    同一类型中多个相同bean加载

     

    SpringConfig

    @Configuration
    public class SpringConfig {
    
        @Bean(name="myDataSource1")
        public MyDataSource myDataSource(){
            System.out.println("spring配置类中的MyDataSource 1");
            return new MyDataSource();
        }
    
        @Bean(name="myDataSource3")
        public MyDataSource myDataSource3(){
            System.out.println("spring配置类中的MyDataSource 3");
            return new MyDataSource();
        }
    }

    测试1 默认初始化bean

     

    public static void main(String[] args) {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);
    }

     

    测试2 name方式加载bean

     

    public static void main(String[] args) {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);
        ac.getBean("myDataSource3");
    }

    测试3 class方式加载bean

     

    public static void main(String[] args) {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);
        ac.getBean(MyDataSource.class);
    }