@Configuration和@Bean注解 (写项目百分之八十会碰到的两个注解)

前言

当我们看到 @Configuration注解,就知道它所标注的类是一个 配置类,Spring boot里面有很多的配置类,当然我们也可以有自己的配置类,可以标注在Class, interface (including annotation type), or enum declaration上。@Bean注解作用在方法上,声明当前方法的返回值是一个 Bean。
单单是这些知识可是完全不够的,我立马新建一个MyConfig类,写上了这两个注解,我带着求知的眼神,点进去看一下@Configuration和@Bean注解。
嗨哟!好家伙!!!不看不知道,一看吓一跳呀!! 足足几百行的英文。留下了没有技术的眼泪。没办法,为了让更多小伙伴 能够明白这两个注解,看吧(各位读者老爷能不能看我翻译总结的份上给个三连呀!)已经总结在下面在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述

一、基本用法

1,基本介绍

Spring Boot 推荐使用 java 配置完全代替 XML 配置,java 配置是通过 @Configration@Bean 注解实现的。二者作用如下:

  • @Configration 注解:声明当前类是一个配置类,相当于 Spring 中的一个 XML 文件
  • @Bean 注解:作用在方法上,声明当前方法的返回值是一个 Bean
2、基本用法

1.最最最基本用法
表示一个类声明了一个或多个@Bean方法,可能会被 Spring 容器处理以在运行时为这些 bean 生成 bean 定义和服务请求,例如:

@Configuration 
public class AppConfig { 
	
	 @Bean 
	 //表示一个方法产生了一个由Spring容器管理的bean
	 public MyBean myBean() { 
	 System.out.println("=======Bean1========");
	 // 实例化、配置和返回 bean ... 
	 } 
 }

当我们启动项目时,名字叫myBean的就会装配到Spring 容器管理的bean中。
在这里插入图片描述

二、@Bean 注解详解

1,使用说明
  • @Bean 注解作用在方法上
  • @Bean 指示一个方法返回一个 Spring 容器管理的 Bean,也就是说方法返回值就是给Springr容器装配的bean
  • @Bean 一般和 @Component 或者 @Configuration 一起使用,也可以在 @Service 里使用,没有特定要求,主要看项目的需求。
  • @Bean 注解默认作用域为单例 singleton 作用域,可通过 @Scope(“prototype”) 设置为原型作用域
2,Bean 名称

(1)默认情况下 Bean 名称就是方法名,比如下面 Bean 名称便是 myBean

@Bean
public MyBean myBean() {
    return new MyBean();
}

(2)@Bean 注解支持设置别名。比如下面除了主名称 myBean 外,还有个别名 myBean1(两个都可以使用)

@Bean("myBean1")
public MyBean myBean() {
    return new MyBean();
}

(3)@Bean 注解可以接受一个 String 数组设置多个别名。比如下面除了主名称 myBean 外,还有别名 myBean1myBean2(三个都可以使用)

@Bean({"myBean1", "myBean2"})
public MyBean myBean() {
    return new MyBean();
}
3,@Bean 与其他注解一起使用

(1)@Bean 注解常常与 @Scope@Lazy@DependsOn@link Primary 注解一起使用:

  • @Profile 注解:为在不同环境下使用不同的配置提供了支持,如开发环境和生产环境的数据库配置是不同的
  • @Scope 注解:将 Bean 的作用域从单例改变为指定的作用域
  • @Lazy 注解:只有在默认单例作用域的情况下才有实际效果
  • @DependsOn 注解:表示在当前 Bean 创建之前需要先创建特定的其他 Bean

(2)比如下面样例,Bean 的作用域默认是单例的,我们配合 @Scope 注解将其改成 prototype 原型模式(每次获取 Bean 的时候会有一个新的实例)

@Bean()
@Scope("prototype")
public MyBean myBean() {
    return new MyBean();
}
4,Bean 初始化和销毁时调用相应的方法

(1)实际开发中,经常会遇到在 Bean 使用之前或使用之后做些必要的操作,SpringBean 的生命周期的操作提供了支持:我们可以通过 @Bean 注解的 initMethoddestrodMethod 进行指定 Bean 在初始化和销毁时需要调用相应的方法。

public class MyBean {
    public void init() {
        System.out.println("MyBean开始初始化...");
    }
 
    public void destroy() {
        System.out.println("MyBean销毁...");
    }
 
    public String get() {
        return "MyBean使用...";
    }
}

@Bean(initMethod="init", destroyMethod="destroy")
public MyBean myBean() {
    return new MyBean();
}

三、@Configration 注解详解

1,使用说明
  • @Configration 注解作用在类、接口(包含注解)上
  • @Configuration 用于定义配置类,可替换 xml 配置文件
  • @Configration 注解类中可以声明一个或多个 @Bean 方法
2. 例子

在Configuration配置类里面可以声明多个Bean方法。bean和bean之间是可以联系的,比如bean4需要bean1等其它bean。只需要调用其方法就可以

import com.hkz.entity.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @ClassName MyConfig
 * @Description TODO
 * @Author zishibushui
 * @Date 2021/11/2 22:14
 */
@Configuration
public class MyConfig {

    /**
     *   该Bean即为方法的返回值,Bean的名字就是方法的名字。
     *   如果@Bean{"b1","b2"},则Bean的名字就是b1,b2。不再是方法的名字了
     */
    @Bean
    public String bean1(){
        System.out.println("=========Bean1=========");
        return "bean1";
    }

    @Bean
    public User bean2(){
        System.out.println("=======bean2测试========");
        return new User(2L,"子时不睡2号","深圳");
    }

    @Bean
    public User bean3(){
        System.out.println("=======bean3测试========");
        return new User();
    }

    /**
     * bean()方法带有@Bean注解,它将用来在Spring应用上下文中声明String bean和User bean。
     * 对于bean的任何调用都会被拦截,并且会返回应用上下文中的bean实例。
     * @return
     */
    @Bean
    public String bean4(){
        System.out.println("=======bean4测试========");
        /*
		* 在Configuration配置类里面可以声明多个Bean方法。bean和bean之间是可以联		
		* 系的,比如bean4需要bean1等其它bean。只需要调用其方法就可以
		*/
		//输出的bean1 就是bean1方法的返回值
        System.out.println(bean1());
        System.out.println(bean2());
        System.out.println(bean3());
        return "bean4";
    }
}
3、测试
@RunWith(SpringRunner.class)
@SpringBootTest
class AutowiredApplicationTests {
    @Autowired
    private String bean1;
    @Autowired
    private User bean2;
    @Autowired
    private User bean3;
    @Autowired
    private String bean4;


    @Autowired
    private MyConfig myConfig;
    
    @Test
    public void testConfigAndBean(){
        System.out.println(bean1);
        System.out.println(bean2);
        System.out.println(bean3);
        System.out.println(bean4);
    }
	//输出结果是一样的
    @Test
    public void testConfigAndBean2(){
        System.out.println(myConfig.bean1());
        System.out.println(myConfig.bean2());
        System.out.println(myConfig.bean3());
        System.out.println(myConfig.bean4());
    }
}

控制台输出

日志的输出:说明Bean的装配过程
在这里插入图片描述

结果输出方法的调用也是返回对应bean的实例
在这里插入图片描述

​看完之后 对于@Configuration和@Bean两个注解,内心是不是下面这个表情。
在这里插入图片描述
但是这只是基本的,如果在写项目遇到这两个注解,我会继续在下面补充的。

  • 33
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
回答: @Bean注解Java Spring框架中的一个注解,用于在@Configuration类中声明一个方法,该方法将返回一个被Spring容器管理的Bean对象。\[1\]相比于其他注册Bean的注解,@Bean注解的灵活性更高。因为它可以用在方法上,而不仅仅是类上,这意味着你可以在方法中使用条件语句或其他逻辑来动态获取Bean对象,使其能够根据环境的变化而变化。\[2\]此外,@Bean注解还可以用来提供Bean的详细描述,通过使用@Description注解来提供Bean的描述信息,使得对Bean的理解更加清晰。\[3\]总之,@Bean注解Spring框架中用于声明和注册Bean的一种灵活且功能强大的注解。 #### 引用[.reference_title] - *1* [基于Java的容器注解@Bean](https://blog.csdn.net/wu631464569/article/details/51952787)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [对@Bean注解的学习理解(大白话解释)](https://blog.csdn.net/lzhNox/article/details/127780114)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [spring @Bean注解的使用](https://blog.csdn.net/weixin_30273763/article/details/97971121)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子时不睡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值