中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring?@Bean注解的使用場景是什么

發布時間:2023-03-10 10:46:05 來源:億速云 閱讀:77 作者:iii 欄目:開發技術

本篇內容介紹了“Spring @Bean注解的使用場景是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

一、簡單介紹

翻看Spring的源碼時,發現@Bean注解的源碼上標注了Since: 3.0,也就是說,@Bean注解是Spring從3.0版本開始提供的源碼。@Bean注解可以標注在方法上,將當前方法的返回值注入到IOC容器中,也可以標注到注解上,作為元注解使用。

二、注解說明

@Bean注解可以說是使用Spring開發應用程序時,使用的比較多的一個注解,尤其是基于SpringBoot開發應用程序時,@Bean注解使用的就很多了。@Bean注解可以標注到方法上,將當前方法的返回值注入到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[]數組類型,指定注入到IOC容器中的Bean的名稱,可以指定多個名稱。如果不指定name屬性和value屬性的值,則注入到IOC容器中的Bean的名稱默認是方法的名稱。

  • value:String[]數組類型,從Spring 4.3.3版本開始提供的@Bean的屬性,作用與name屬性相同。

  • autowireCandidate:boolean類型,表示是否支持自動按照類型注入到其他的Bean中。此屬性會影響@Autowired注解,不會響應@Resource注解,默認為true,表示支持自動按照類型注入到其他的Bean中。

  • initMethod:指定初始化的方法。

  • destroyMethod:指定銷毀的方法。

2. 注解使用場景

在使用Spring的注解開發應用程序時,如果是我們自己開發的類,可以在類上標注@Component注解(也可以是@Repository、@Service、@Controller等注解),將類注入到IOC容器中。但是,有時很多類不是我們自己寫的,而是依賴的第三方的類庫,此時就無法在類上標注@Component等注解了,此時就需要使用@Bean注解將其注入到IOC容器中。

也就是說,@Bean注解適用于將第三方提供的類注入到IOC容器中的場景。使用@Bean注解創建的Bean對象默認是單實例Bean對象。

三、使用案例

1. 案例描述

使用@Bean注解將User類的對象注入到IOC容器中,打印初始化和銷毀方法,并驗證使用@Bean注解創建的Bean對象默認是單實例Bean。

2. 案例實現

使用@Bean注解可以將類對象注入到IOC容器中,并且@Bean注解的initMethod屬性可以指定初始化的方法,destroyMethod屬性可以指定銷毀的方法。當IOC容器對Bean對象進行初始化時,會執行@Bean注解的initMethod屬性指定的方法,當IOC容器在關閉時,會執行@Bean注解的destroyMethod屬性指定的方法,觸發銷毀方法的邏輯。

注意:上述邏輯僅限于注入到IOC容器中的單例Bean對象。如果是單實例Bean,則IOC容器啟動時,就會創建Bean對象,IOC容器關閉時,銷毀Bean對象。如果是多實例Bean,IOC容器在啟動時,不會創建Bean對象,在每次從IOC容器中獲取Bean對象時,都會創建新的Bean對象返回,IOC容器關閉時,也不會銷毀對象。也就是說,如果是多實例Bean,IOC容器不會管理Bean對象。

本節,就以單實例Bean為例來實現案例程序,具體的實現步驟如下所示:

新建注入到IOC容器中的User類
public class User {
    private final Logger logger = LoggerFactory.getLogger(User.class);
    public User(){
        logger.info("執行構造方法...");
    }
    public void init(){
        logger.info("執行初始化方法...");
    }
    public void destroy(){
        logger.info("執行銷毀方法...");
    }
}

IOC容器啟動時,會創建User類的對象并調用init()方法進行初始化。IOC容器關閉時,會銷毀User類的對象,并調用destroy()方法執行銷毀邏輯。

可以看到,User類的實現比較簡單,提供了一個無參構造方法,一個表示初始化的init()方法和一個表示銷毀的destroy()方法,每個方法中都打印了相應的日志來說明調用了對應的方法。

創建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()方法。

創建案例測試類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配置類創建了IOC容器,從IOC容器中兩次獲取User對象,分別賦值給user1和user2,打印user1是否等于user2的日志,并關閉IOC容器。

3. 案例測試

運行BeanTest類的main()方法,輸出的日志信息如下所示:

15:56:57.404 [main] INFO com.lwk.demo.spring.annocation.bean.entity.User - 執行構造方法...
15:56:57.405 [main] INFO com.lwk.demo.spring.annocation.bean.entity.User - 執行初始化方法...
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 - 執行銷毀方法...

可以看到,IOC容器在啟動時,就創建了User對象,并調用了@Bean注解的initMethod方法指定的初始化方法,IOC容器在關閉時,調用@Bean注解的destroyMethod屬性指定的銷毀方法。并且通過打印的user1是否等于user2的日志為true,可以說明使用@Bean注解默認創建的Bean對象是單實例Bean,每個類在IOC容器中只會存在一個單實例Bean對象。

“Spring @Bean注解的使用場景是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

翁牛特旗| 全椒县| 海口市| 临海市| 江油市| 嘉善县| 寻甸| 成武县| 吉木乃县| 浦北县| 维西| 扎鲁特旗| 三原县| 唐山市| 阳泉市| 天长市| 十堰市| 博兴县| 清丰县| 上杭县| 和龙市| 凤台县| 通河县| 鲜城| 镇康县| 彩票| 鄯善县| 内江市| 城口县| 青浦区| 华阴市| 邛崃市| 孝义市| 六盘水市| 凤山县| 怀仁县| 马关县| 大同市| 屏山县| 麻阳| 开平市|