Spring詳解(十)----使用@Configuration與@Bean注解裝配Bean


1、@Configuration與@Bean介紹

@Configuration與@Bean主要用於在 Java 代碼中實現 Spring 的配置,它的目的是代替Spring的xml配置文件。下面來簡單介紹一下這兩個注解:

  • @Configuration:標注在類上,作用:配置Spring容器(應用上下文),被它修飾的類表示可以使用 Spring IoC 容器作為 bean 定義的來源。相當於把該類作為Spring的 xml 配置文件中的<beans>元素(並且包含命名空間)。
  • @Bean:標注在方法上,作用:注冊bean對象,被標記的方法的返回值會作為bean被加入到Spring IoC容器之中,bean的名稱默認為方法名。相當於把該方法的返回值作為 xml 配置文件中<beans>的子標簽<bean>,其中@Bean的配置項中包含 5個配置項:
value:等同於下面的name屬性
name:相當於bean的id,<bean id="">,它是一個字符串數組,允許配置多個 BeanName,如果不配置,則默認是方法名
autowire:標志是否是一個引用的 Bean 對象,默認值是 Autowire.NO
initMethod:自定義初始化方法
destroyMethod:自定義銷毀方法

如果要獲取它們,我們可以使用AnnotationConfigApplicationContext 或 AnnotationConfigWebApplicationContext類進行掃描,並用於構建bean定義,初始化Spring容器。這兩者的配合使用會在SpringBoot中大量使用,用來替代XML配置,因為SpringBoot不提倡使用XML配置文件開發。

2、@Configuration與@Bean舉例

本節就來學習如何使用@Configuration與@Bean在Java代碼中給容器之中添加Bean。下面簡單舉例:

①、首先創建一個User類,如下:

/**
 * 用戶實體類
 */
public class User {
    private int userId;
    private String userName;
    private int userAge;
    private String userPwd;
    private String userAddress;
    //這里使用注解自動配置
    @Autowired(required = false)
    private GirlFriend girlFriend;
 
    //getter、setter、toString方法省略......
}

②、創建一個GirlFriend類,如下:

/**
 * GirlFriend實體
 */
public class GirlFriend {
    private String girlName;
    private int girlAge;
    private String girlHeight;
 
    //getter、setter、toString方法省略......
}

③、創建PojoConfig類,用來啟動容器和注冊Bean對象:

package com.thr.pojo;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
 
@ComponentScan(basePackages = "com.thr.pojo")
@Configuration
public class PojoConfig {
    public PojoConfig() {
        System.out.println("PojoConfig容器初始化成功...");
    }
 
    //實例化User對象並且裝配值
    @Bean(name = "user")
    public User user(){
        User user = new User();
        user.setUserId(2021);
        user.setUserName("菜逼小唐");
        user.setUserAge(23);
        user.setUserPwd("asd123");
        user.setUserAddress("地球中國深圳");
        return user;
    }
 
    //實例化GirlFriend對象並且裝配值
    @Bean(name ="girlFriend" )
    public GirlFriend girlFriend(){
        GirlFriend girlFriend = new GirlFriend();
        girlFriend.setGirlName("陳美麗");
        girlFriend.setGirlAge(20);
        girlFriend.setGirlHeight("168");
        return girlFriend;
    }
    @Bean(name ="girlFriend1" )
    public GirlFriend girlFriend1(){
        GirlFriend girlFriend1 = new GirlFriend();
        girlFriend1.setGirlName("何美麗");
        girlFriend1.setGirlAge(23);
        girlFriend1.setGirlHeight("170");
        return girlFriend1;
    }
}

上面的PojoConfig.java代碼相當於如下的xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">
 
    <!--組件自動掃描,指定注解掃描包路徑-->
    <!-- base-package放的是包名,有多個包名中間用逗號隔開 -->
    <context:component-scan base-package="com.thr.pojo"/>
 
    <!--實例化GirlFriend-->
    <bean id="girlFriend" class="com.thr.pojo.GirlFriend">
        <property name="girlName" value="陳美麗"/>
        <property name="girlAge" value="20"/>
        <property name="girlHeight" value="168"/>
    </bean>
    <bean id="girlFriend1" class="com.thr.pojo.GirlFriend">
        <property name="girlName" value="何美麗"/>
        <property name="girlAge" value="23"/>
        <property name="girlHeight" value="170"/>
    </bean>
 
    <!--實例化User-->
    <bean id="user" class="com.thr.pojo.User">
        <property name="userId" value="2021"/>
        <property name="userName" value="菜逼小唐"/>
        <property name="userAge" value="23"/>
        <property name="userPwd" value="asd123"/>
        <property name="userAddress" value="地球中國深圳"/>
        <!--這里本來是要注入GirlFriend對象的,這里使用@Autowired注解 自動注入-->
        <!--<property name="girlFriend" ref="girlFriend"/>-->
    </bean>
</beans>

④、測試代碼(這里使用AnnotationConfigApplicationContext類來獲取):

/**
 * 測試代碼
 */
public class SpringTest1 {
    public static void main(String[] args) {
        //1.初始化Spring容器,通過注解加載
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(PojoConfig.class);
        //2.通過容器獲取實例
        User user =  applicationContext.getBean("user", User.class);
        //3.調用實例中的屬性
        System.out.println(user.getUserId()+"----"+
                        user.getUserName()+"----"+
                        user.getUserAge()+"----"+
                        user.getGirlFriend());
    }
}

⑤、運行測試代碼,查看控制台打印結果:

image

從上面的運行結果來看,bean對象已經創建成功了。

3、@import注解

@import 注解允許從另一個配置類中加載 @Bean 定義。例如將上面注冊的GirlFriend對象拆分到一個GirlFriendConfig類中,然后通過@import注解在PojoConfig類中加載,如下所示:

新建的GirlFriendConfig類:

image

PojoConfig類:

image

運行結果如下圖所示:

image

可以發現是先初始化主容器,然后再初始化了外部引入的配置類容器。


免責聲明!

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



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