天天看點

一、Spring注解:@Configuration & @Bean

​ 對于傳統的Spring或者SpringMVC程式來說,一般都是基于XML來配置的,不過對于SpringBoot來說,推崇采用JavaConfig,也就是使用注解來開發。

​ 從Spring3.0開始,就引入了@Configuration用于定義配置類,可以替換XML配置檔案。被@Configuration注解的類内部會包含有多個或者一個被@Bean注解的方法,這些方法會被AnnotationConfigApplicationContext 或 AnnotationConfigWebApplicationContext 類進行掃描,用于建構bean,初始化IOC容器。

@Bean:容器中注冊元件的第一種方式,通常用于導入第三方包中的元件
1. 基于XML配置容器

​ 在傳統的程式中,若要在IOC容器中注冊一個bean,就需要在XML檔案中進行配置。例如要将Persoon類注冊到容器中:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="person" class="com.baiding.model.Person">
        <property name="name" value="lisi"/>
        <property name="age" value="23"/>
    </bean>
</beans>
           

​ 測試一下:使用ClassPathXmlApplicationContext獲得XML方式注冊到容器中的Bean執行個體

public class MainTest {
    @Test
    void test01(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("spring-scan.xml");
        Person person = (Person) ac.getBean("person");
        System.out.println(person); // Person{name='lisi', age=23}
    }
}
           
2. 基于JavaConfig配置

​ 若使用注解的方法初始化IOC容器,我們就需要用到@Configuration 和@Bean這兩個注解了。使用注解方法修改上述配置:

/**
*@Configuration 通知Spring這是一個配置類
*配置類 相當于 配置檔案
*/
@Configuration
public class BeanConfig {

    /**
     * 給容器中注冊一個bean 類型為傳回值的類型 id預設為方法名或者直接用屬性name配置id
     * @return
     */
    @Bean(name = "wangwu")
    public Person person(){
        return new Person("wangwu",);
    }
}
           

建立一個配置類(使用@Configuration注解注釋的類),在類裡面聲明使用@Bean注解的方法。

測試一下:使用AnnotationConfigApplicationContext獲得注解方式注冊到容器中的Bean執行個體

public class MainTest {

    @Test
    void test02(){
        ApplicationContext ac = new AnnotationConfigApplicationContext(BeanConfig.class);
        Person person = (Person) applicationContext.getBean("wangwu");
        System.out.println(person); // Person{name='wangwu', age=22}
        String[] names = applicationContext.getBeanNamesForType(Person.class);
        for(String name :names){
            System.out.println(name); // wangwu
        }
    }
}
           

将JavaConfig方式和XML配置方式做個對比,可以看出:

@Configuration标注在類上,相當于把該類作為spring的xml配置檔案中的

<beans>

,作用為:配置spring容器

@Bean标注在方法上(傳回某個執行個體的方法),等價于spring的xml配置檔案中的

<bean>

,作用為:注冊bean對象

繼續閱讀