詳細講解Spring中的@Bean注解


隨着SpringBoot的流行,我們現在更多采用基於注解式的配置從而替換掉了基於XML的配置,所以本篇文章我們主要探討基於注解的@Bean以及和其他注解的使用;

@Bean 基礎概念

  1. @Bean:Spring的@Bean注解用於告訴方法,產生一個Bean對象,然后這個Bean對象交給Spring管理。產生這個Bean對象的方法Spring只會調用一次,隨后這個Spring將會將這個Bean對象放在自己的IOC容器中;

  2. SpringIOC 容器管理一個或者多個bean,這些bean都需要在@Configuration注解下進行創建,在一個方法上使用@Bean注解就表明這個方法需要交給Spring進行管理;

  3. @Bean是一個方法級別上的注解,主要用在@Configuration注解的類里,也可以用在@Component注解的類里。添加的bean的id為方法名;

  4. 使用Bean時,即是把已經在xml文件中配置好的Bean拿來用,完成屬性、方法的組裝;比如@Autowired , @Resource,可以通過byTYPE(@Autowired)、byNAME(@Resource)的方式獲取Bean;

  5. 注冊Bean時,@Component , @Repository , @ Controller , @Service , @Configration這些注解都是把你要實例化的對象轉化成一個Bean,放在IoC容器中,等你要用的時候,它會和上面的@Autowired , @Resource配合到一起,把對象、屬性、方法完美組裝;

  6. @Configuration與@Bean結合使用:@Configuration可理解為用spring的時候xml里面的標簽,@Bean可理解為用spring的時候xml里面的標簽;

快速搭建一個maven項目並配置好所需要的Spring 依賴

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>4.3.13.RELEASE</version>
</dependency>

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-beans</artifactId>
  <version>4.3.13.RELEASE</version>
</dependency>

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <version>4.3.13.RELEASE</version>
</dependency>

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>4.3.13.RELEASE</version>
</dependency>

 

在src根目錄下創建一個AppConfig的配置類,這個配置類也就是管理一個或多個bean 的配置類,並在其內部聲明一個myBean的bean,並創建其對應的實體類

@Configuration
public class AppConfig {

    // 使用@Bean 注解表明myBean需要交給Spring進行管理
    // 未指定bean 的名稱,默認采用的是 "方法名" + "首字母小寫"的配置方式
    @Bean
    public MyBean myBean(){
        return new MyBean();
    }
}

public class MyBean {

    public MyBean(){
        System.out.println("MyBean Initializing");
    }
}

然后再創建一個測試類SpringBeanApplicationTests,測試上述代碼的正確性

public class SpringBeanApplicationTests {

    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        context.getBean("myBean");
    }
}

深入了解@Bean注解的源代碼

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {
    @AliasFor("name")
    String[] value() default {};
    @AliasFor("value")
    String[] name() default {};
    Autowire autowire() default Autowire.NO;
    String initMethod() default "";
    String destroyMethod() default AbstractBeanDefinition.INFER_METHOD;
}

@Bean的屬性:

  1. value:bean別名和name是相互依賴關聯的,value,name如果都使用的話值必須要一致;

  2. name:bean名稱,如果不寫會默認為注解的方法名稱;

  3. autowire:自定裝配默認是不開啟的,建議盡量不要開啟,因為自動裝配不能裝配基本數據類型、字符串、數組等,這是自動裝配設計的局限性,並且自動裝配不如依賴注入精確;

  4. initMethod:bean的初始化之前的執行方法,該參數一般不怎么用,因為完全可以在代碼中實現;

  5. destroyMethod:默認使用javaConfig配置的bean,如果存在close或者shutdown方法,則在bean銷毀時會自動執行該方法,如果你不想執行該方法,則添加@Bean(destroyMethod="")來防止出發銷毀方法;

https://mp.weixin.qq.com/s/iCwycZ9ZfWzjMqaz5BxspA

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM