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());
}
}
⑤、運行測試代碼,查看控制台打印結果:

從上面的運行結果來看,bean對象已經創建成功了。
3、@import注解
@import 注解允許從另一個配置類中加載 @Bean 定義。例如將上面注冊的GirlFriend對象拆分到一個GirlFriendConfig類中,然后通過@import注解在PojoConfig類中加載,如下所示:
新建的GirlFriendConfig類:

PojoConfig類:

運行結果如下圖所示:

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