隨着SpringBoot的流行,我們現在更多采用基於注解式的配置從而替換掉了基於XML的配置,所以本篇文章我們主要探討基於注解的@Bean以及和其他注解的使用;
@Bean 基礎概念
-
@Bean:Spring的@Bean注解用於告訴方法,產生一個Bean對象,然后這個Bean對象交給Spring管理。產生這個Bean對象的方法Spring只會調用一次,隨后這個Spring將會將這個Bean對象放在自己的IOC容器中;
-
SpringIOC 容器管理一個或者多個bean,這些bean都需要在@Configuration注解下進行創建,在一個方法上使用@Bean注解就表明這個方法需要交給Spring進行管理;
-
@Bean是一個方法級別上的注解,主要用在@Configuration注解的類里,也可以用在@Component注解的類里。添加的bean的id為方法名;
-
使用Bean時,即是把已經在xml文件中配置好的Bean拿來用,完成屬性、方法的組裝;比如@Autowired , @Resource,可以通過byTYPE(@Autowired)、byNAME(@Resource)的方式獲取Bean;
-
注冊Bean時,@Component , @Repository , @ Controller , @Service , @Configration這些注解都是把你要實例化的對象轉化成一個Bean,放在IoC容器中,等你要用的時候,它會和上面的@Autowired , @Resource配合到一起,把對象、屬性、方法完美組裝;
-
@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的屬性:
-
value:bean別名和name是相互依賴關聯的,value,name如果都使用的話值必須要一致;
-
name:bean名稱,如果不寫會默認為注解的方法名稱;
-
autowire:自定裝配默認是不開啟的,建議盡量不要開啟,因為自動裝配不能裝配基本數據類型、字符串、數組等,這是自動裝配設計的局限性,並且自動裝配不如依賴注入精確;
-
initMethod:bean的初始化之前的執行方法,該參數一般不怎么用,因為完全可以在代碼中實現;
-
destroyMethod:默認使用javaConfig配置的bean,如果存在close或者shutdown方法,則在bean銷毀時會自動執行該方法,如果你不想執行該方法,則添加@Bean(destroyMethod="")來防止出發銷毀方法;
https://mp.weixin.qq.com/s/iCwycZ9ZfWzjMqaz5BxspA