Spring @Bean注解的使用場景與案例實現(xiàn)
一、簡單介紹
翻看Spring的源碼時,發(fā)現(xiàn)@Bean注解的源碼上標注了Since: 3.0,也就是說,@Bean注解是Spring從3.0版本開始提供的源碼。@Bean注解可以標注在方法上,將當(dāng)前方法的返回值注入到IOC容器中,也可以標注到注解上,作為元注解使用。
二、注解說明
@Bean注解可以說是使用Spring開發(fā)應(yīng)用程序時,使用的比較多的一個注解,尤其是基于SpringBoot開發(fā)應(yīng)用程序時,@Bean注解使用的就很多了。@Bean注解可以標注到方法上,將當(dāng)前方法的返回值注入到IOC容器中。@Bean注解也可以標注到注解上,作為元注解使用。
1. 注解源碼
/** * @author Rod Johnson * @author Costin Leau * @author Chris Beams * @author Juergen Hoeller * @author Sam Brannen * @since 3.0 */ @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Bean { //Since: 4.3.3 @AliasFor("name") String[] value() default {}; @AliasFor("value") String[] name() default {}; //Since: 5.1 boolean autowireCandidate() default true; String initMethod() default ""; String destroyMethod() default AbstractBeanDefinition.INFER_METHOD; }
從@Bean源碼的注釋可以看出,@Bean注解是Spring從3.0版本開始提供的注解,注解中各個屬性的含義如下所示:
- name:String[]數(shù)組類型,指定注入到IOC容器中的Bean的名稱,可以指定多個名稱。如果不指定name屬性和value屬性的值,則注入到IOC容器中的Bean的名稱默認是方法的名稱。
- value:String[]數(shù)組類型,從Spring 4.3.3版本開始提供的@Bean的屬性,作用與name屬性相同。
- autowireCandidate:boolean類型,表示是否支持自動按照類型注入到其他的Bean中。此屬性會影響@Autowired注解,不會響應(yīng)@Resource注解,默認為true,表示支持自動按照類型注入到其他的Bean中。
- initMethod:指定初始化的方法。
- destroyMethod:指定銷毀的方法。
2. 注解使用場景
在使用Spring的注解開發(fā)應(yīng)用程序時,如果是我們自己開發(fā)的類,可以在類上標注@Component注解(也可以是@Repository、@Service、@Controller等注解),將類注入到IOC容器中。但是,有時很多類不是我們自己寫的,而是依賴的第三方的類庫,此時就無法在類上標注@Component等注解了,此時就需要使用@Bean注解將其注入到IOC容器中。
也就是說,@Bean注解適用于將第三方提供的類注入到IOC容器中的場景。使用@Bean注解創(chuàng)建的Bean對象默認是單實例Bean對象。
三、使用案例
1. 案例描述
使用@Bean注解將User類的對象注入到IOC容器中,打印初始化和銷毀方法,并驗證使用@Bean注解創(chuàng)建的Bean對象默認是單實例Bean。
2. 案例實現(xiàn)
使用@Bean注解可以將類對象注入到IOC容器中,并且@Bean注解的initMethod屬性可以指定初始化的方法,destroyMethod屬性可以指定銷毀的方法。當(dāng)IOC容器對Bean對象進行初始化時,會執(zhí)行@Bean注解的initMethod屬性指定的方法,當(dāng)IOC容器在關(guān)閉時,會執(zhí)行@Bean注解的destroyMethod屬性指定的方法,觸發(fā)銷毀方法的邏輯。
注意:上述邏輯僅限于注入到IOC容器中的單例Bean對象。如果是單實例Bean,則IOC容器啟動時,就會創(chuàng)建Bean對象,IOC容器關(guān)閉時,銷毀Bean對象。如果是多實例Bean,IOC容器在啟動時,不會創(chuàng)建Bean對象,在每次從IOC容器中獲取Bean對象時,都會創(chuàng)建新的Bean對象返回,IOC容器關(guān)閉時,也不會銷毀對象。也就是說,如果是多實例Bean,IOC容器不會管理Bean對象。
本節(jié),就以單實例Bean為例來實現(xiàn)案例程序,具體的實現(xiàn)步驟如下所示:
新建注入到IOC容器中的User類
public class User { private final Logger logger = LoggerFactory.getLogger(User.class); public User(){ logger.info("執(zhí)行構(gòu)造方法..."); } public void init(){ logger.info("執(zhí)行初始化方法..."); } public void destroy(){ logger.info("執(zhí)行銷毀方法..."); } }
IOC容器啟動時,會創(chuàng)建User類的對象并調(diào)用init()方法進行初始化。IOC容器關(guān)閉時,會銷毀User類的對象,并調(diào)用destroy()方法執(zhí)行銷毀邏輯。
可以看到,User類的實現(xiàn)比較簡單,提供了一個無參構(gòu)造方法,一個表示初始化的init()方法和一個表示銷毀的destroy()方法,每個方法中都打印了相應(yīng)的日志來說明調(diào)用了對應(yīng)的方法。
創(chuàng)建Spring的配置類BeanConfig
@Configuration @ComponentScan(basePackages = "com.lwk.demo.spring.annocation.bean") public class BeanConfig { @Bean(initMethod = "init", destroyMethod = "destroy") public User user(){ return new User(); } }
可以看到,在BeanConfig類上標注了@Configuration注解,說明BeanConfig類是一個Spring的配置類,并且在BeanConfig類上標注了@ComponentScan注解,指定要掃描的包為com.lwk.demo.spring.annocation.bean。
在BeanConfig類中定義了一個user()方法,返回一個User對象。在user()方法上標注了@Bean注解,并通過initMethod屬性指定的初始化方法為User類的init()方法,通過destroyMethod屬性指定的銷毀方法為User類的destroy()方法。
創(chuàng)建案例測試類BeanTest
public class BeanTest { private static final Logger LOGGER = LoggerFactory.getLogger(BeanTest.class); public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class); LOGGER.info("IOC容器啟動完成...."); User user1 = context.getBean(User.class); User user2 = context.getBean(User.class); LOGGER.info("user1是否等于user2===>>>{}", (user1 == user2)); context.close(); } }
可以看到,在BeanTest類中,通過BeanConfig配置類創(chuàng)建了IOC容器,從IOC容器中兩次獲取User對象,分別賦值給user1和user2,打印user1是否等于user2的日志,并關(guān)閉IOC容器。
3. 案例測試
運行BeanTest類的main()方法,輸出的日志信息如下所示:
15:56:57.404 [main] INFO com.lwk.demo.spring.annocation.bean.entity.User - 執(zhí)行構(gòu)造方法...
15:56:57.405 [main] INFO com.lwk.demo.spring.annocation.bean.entity.User - 執(zhí)行初始化方法...
15:56:57.431 [main] INFO com.lwk.demo.spring.annocation.bean.BeanTest - IOC容器啟動完成....
15:56:57.432 [main] INFO com.lwk.demo.spring.annocation.bean.BeanTest - user1是否等于user2===>>>true
15:56:57.437 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@41975e01, started on Thu Mar 09 15:56:57 CST 2023
15:56:57.438 [main] INFO com.lwk.demo.spring.annocation.bean.entity.User - 執(zhí)行銷毀方法...
可以看到,IOC容器在啟動時,就創(chuàng)建了User對象,并調(diào)用了@Bean注解的initMethod方法指定的初始化方法,IOC容器在關(guān)閉時,調(diào)用@Bean注解的destroyMethod屬性指定的銷毀方法。并且通過打印的user1是否等于user2的日志為true,可以說明使用@Bean注解默認創(chuàng)建的Bean對象是單實例Bean,每個類在IOC容器中只會存在一個單實例Bean對象。
到此這篇關(guān)于Spring @Bean注解的使用場景與案例實現(xiàn)的文章就介紹到這了,更多相關(guān)Spring @Bean注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot定制JSON響應(yīng)數(shù)據(jù)返回的示例代碼
@JsonView 是 Jackson 庫中的一個注解,它允許你定義哪些屬性應(yīng)該被序列化到 JSON 中,基于不同的“視圖”或“配置”,在本文中,通過了解@JsonView,你將能夠更好地掌握如何在Spring Boot應(yīng)用中定制JSON數(shù)據(jù)的輸出,需要的朋友可以參考下2024-05-05Java @Transactional與synchronized使用的問題
這篇文章主要介紹了Java @Transactional與synchronized使用的問題,了解內(nèi)部原理是為了幫助我們做擴展,同時也是驗證了一個人的學(xué)習(xí)能力,如果你想讓自己的職業(yè)道路更上一層樓,這些底層的東西你是必須要會的2023-01-01springboot項目mysql-connector-java默認版本如何查看
這篇文章主要介紹了springboot項目mysql-connector-java默認版本如何查看問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11JAVA中跳出當(dāng)前多重嵌套循環(huán)的方法詳解
今天在看面試題時,發(fā)現(xiàn)了這個問題,因為在PHP中跳出多次循環(huán)可以使用break數(shù)字來跳出多層循環(huán),但這在java中并不好使,這篇文章主要給大家介紹了關(guān)于JAVA中跳出當(dāng)前多重嵌套循環(huán)的相關(guān)資料,需要的朋友可以參考下2022-01-01