相信大家在学习spring时候都会遇到@Configuration和@Bean注解。该注解最终目的是将bean类交给Spring容器管理,前篇文章也对Spring容器做了解释 。】

【@Configuration 】

作用: @Configuration 作用于类上面,告诉spring当前类是作为配置文件使用的,相当于Spring中的xml配置文件。

//作用于类上面,告诉spring当前类是作为配置文件使用的,相当于Spring中的xml配置文件
@Configuration
public class TestConfig {

}

【@Bean】

作用:配置类里面使用@Bean注解,表示该对象被注册为在 Spring 容器中的 bean,带有 @Bean 的注解方法将返回一个对象,并默认是单实例的 。

一、先新建一个普通类TestBean,该类有个方法getBean()。

//新建一个普通类TestBean,该类有个方法getBean()
public class TestBean {
    public void getBean() {
        System.out.println("成功获取Bean类方法");
    }
}

二、在配置类里面将该类交给Spring容器管理

//作用于类上面,告诉spring当前类是作为配置文件使用的,相当于Spring中的xml配置文件
@Configuration
public class TestConfig {
   //带有 @Bean 的注解方法将返回一个对象,表示该对象被注册为在 Spring 容器中的 bean
   @Bean
   public TestBean getBean(){
       return new TestBean();
   }
}

三、创建一个controller,启动项目,访问获取Spring容器里面注册的Bean。

@RestController
public class BeanController {
    @GetMapping("/getBean")
    public void getBean() {
        //1.返回我们IOC容器
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestConfig.class);
        //2.查看容器里面的组件
        String[] strings = applicationContext.getBeanDefinitionNames();
        for(String string : strings) {
            System.out.println(string);
        }
    }
}

在浏览器请求访问/getBean路径,结果如下:

springboot bean 注解 spring中@bean注解_配置文件


可以看出,testConfig和getBean都被注入到Spring容器里面。配置了@Bean的方法将返回一个对象,以方法名作为Bean的id。返回类型就是Bean类型。

四、可以更改Bean注册的id

//作用于类上面,告诉spring当前类是作为配置文件使用的,相当于Spring中的xml配置文件
@Configuration
public class TestConfig {
    //更改Bean注册的名字
    @Bean("myBean")
    public TestBean getBean(){
        return new TestBean();
    }
}

在浏览器请求访问/getBean路径,结果如下:

springboot bean 注解 spring中@bean注解_配置文件_02

五、注入Bean,调用使用

@RestController
public class BeanController {

    //调用
    private TestBean myBean;
    
    //通过构造器方式注入
    public BeanController(TestBean myBean) {
        this.myBean = myBean;
    }

    @GetMapping("/hello")
    public void test() {
        //这里并不需要重新new对象就可以调用方法,使用的是spring容器的实例
        myBean.getBean();
    }

}

调用方法成功返回方法的内容:

springboot bean 注解 spring中@bean注解_后端_03


由上可见,访问TestBean的方法并不需要重新new对象,直接通过注入的方式就可以调用方法,使用的是spring容器的已经注册好的TestBean实例。

五、@Bean注册的对象默认是单实例

@RestController
public class BeanController {

    //调用
    private TestBean myBean;

    public BeanController(TestBean myBean) {
        this.myBean = myBean;
    }

    @GetMapping("/getBean")
    public void getBean() {
        //1.返回我们IOC容器
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestConfig.class);
        //2.查看容器里面的组件
        String[] strings = applicationContext.getBeanDefinitionNames();
        for(String string : strings) {
            System.out.println(string);
        }

        TestBean myBean = applicationContext.getBean("myBean",TestBean.class);
        System.out.println("第一个Bean:"+myBean);

        TestBean myBean2 = applicationContext.getBean("myBean",TestBean.class);
        System.out.println("第二个Bean:"+myBean2);
    }
}

在浏览器请求访问/getBean路径,结果如下:

springboot bean 注解 spring中@bean注解_springboot bean 注解_04

由此可见,从spring容器里获取出的Bean类是同一个实例,也验证了@Bean注册的对象默认是单实例。

将Bean注册修改为多实例

//作用于类上面,告诉spring当前类是作为配置文件使用的,相当于Spring中的xml配置文件
@Configuration
public class TestConfig {

    //@Scope("prototype")就是设置为多实例
    @Bean("myBean")
    @Scope("prototype")
    public TestBean getBean(){
        return new TestBean();
    }
}

在浏览器请求访问/getBean路径,结果如下:

springboot bean 注解 spring中@bean注解_java_05


可以看出,配置@Scope(“prototype”)可以将Bean设置为多实例。