SpringFramework|基於註解配置的設值注入: @Configuration, @Bean

基於註解的配置: @Configuration, @Bean

前述

以前的註解文章僅僅只是敘述文章中心的註解, 仍舊基於XML配置而非註解掃描. (@Senyag)html

Java: 1.8java

Maven: 3spring

SpringFramework版本以及各組件成員: 5.1.1.RELEASEapp

  • spring-context
  • spring-core
  • spring-beans

如下是官方文檔說明:框架

Starting with Spring 3.0, many features provided by the Spring JavaConfig project became part of the core Spring Framework. Thus, you can define beans external to your application classes by using Java rather than XML files. To use these new features, see the @Configuration, @Bean, @Import, and @DependsOn annotations.ide

從Spring 3.0開始,Spring JavaConfig項目提供的許多功能都成爲核心Spring Framework(Core)的一部分。所以,您能夠使用Java而不是XML文件在應用程序類外部定義bean。要使用這些新功能,請參閱@Configuration@Bean@Import@DependsOn註解。this

各註解說明

  • @Configuration - 表示這個類能夠使用 Spring IoC 容器做爲 bean 定義的來源。.net

  • @Bean - 表示方法生成由Spring容器管理的bean。code

  • @Import - 表示要導入的一個或多個@Configuration類。component

  • @DependsOn - 代表有依賴條件的一個類時, 那些被它依賴的Bean類將先被初始化.
    (換句話說哪一個Bean被註解了這個, 那麼它所依賴的Bean都會先初始化)

    "Spring容器載入bean順序是不肯定的,Spring框架沒有約定特定順序邏輯規範。但spring保證若是A依賴B(如beanA中有@Autowired B的變量),那麼B將先於A被加載。但若是beanA不直接依賴B,咱們如何讓B仍先加載呢?"
    ​ ---- 引用自: https://blog.csdn.net/neweastsun/article/details/78775371

這裏先了解@Configuration@Bean. @DependsOn@Import後面再談...

示例(@Configuration&@Bean的簡單使用)

本示例參考: https://www.cnblogs.com/microcat/p/7074720.html

做用: 簡單演示功能 -- 僅僅獲取一個Bean並調用其中方法, 並不存在依賴關係.

將瞭解:

  • @Bean用於註冊一個SpringBean.
  • @Configuration代表這是個與Spring相關的類, 能夠做爲Bean定義的來源.

Bean - HelloWorld.java

非JavaBean規範

package yag;

public class HelloWorld {

    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

Bean配置文件 - HelloConfig.java

package yag;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class HelloConfig {

    // 將HelloWrold類註冊爲一個Bean
    @Bean
    public HelloWorld helloWorld() {
        return new HelloWorld();
    }
}

至關於如下XML配置:

<beans>
  <bean class="yag.HelloWorld"/>
</beans>

註解掃描 - spring-beans.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 http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>
    <context:component-scan base-package="yag"/>
</beans>

執行者 - Runner.java

package yag;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Runner {

    public static void main(String[] args){
        ApplicationContext context = new AnnotationConfigApplicationContext(HelloConfig.class);
        // 獲取這個bean
        HelloWorld helloWorld = context.getBean(HelloWorld.class);
        // 調用方法
        helloWorld.setMessage("Hello World");
        System.out.println(helloWorld.getMessage());
    }
}

執行結果

Hello World

Process finished with exit code 0

示例(使用@Autowired進行Setter方法注入)

在以前的文章中已經介紹了一些經過註解進行注入的示例了. 但那些文章目的僅僅是瞭解那些註解如何使用, 仍舊是基於XML配置環境的. 如下將瞭解在註解配置中的使用方式.

背景:

HelloWorld是一個bean. 至於Bean使用者就是HelloWorldUser, 它將調用HelloWorld中的sayHello()方法(這須要一個HelloWorld實例).

Bean - HelloWorld.java

非JavaBean規範

package yag;

import org.springframework.context.annotation.Configuration;

@Configuration
public class HelloWorld {

    public void sayHello(){
        System.out.println("Hello World");
    }
}

Bean的使用者 - HelloWorldUser.java

package yag;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

@Configuration
public class HelloWorldUser {

    private HelloWorld helloWorld;

    @Autowired // 在setter方法上, 以實現byName裝配(將匹配id="helloWorld"的Bean)
    public void setHelloWorld(HelloWorld helloWorld) {
        this.helloWorld = helloWorld;
    }

    public void useHelloWorld(){
        helloWorld.sayHello();
    }
}

Bean配置文件 - HelloConfig.java

package yag;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class HelloConfig {

    @Bean(name = "helloWorld") // id="helloWorld"
    public HelloWorld helloWorld(){
        return new HelloWorld();
    }

    @Bean
    public HelloWorldUser helloWorldUser(){
        return new HelloWorldUser();
    }
}

執行者 - Runner.java

package yag;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Runner {

    public static void main(String[] args){
        ApplicationContext context = new AnnotationConfigApplicationContext(HelloConfig.class);
        HelloWorldUser helloWorldUser = context.getBean(HelloWorldUser.class);
        helloWorldUser.useHelloWorld();
    }
}

註解掃描配置 - spring-beans.xml

爲了縮短篇幅, 就羅列這些, 具體的dtd能夠從上面的示例找.

<context:annotation-config/>
    <context:component-scan base-package="yag"/>

執行結果

Hello World

Process finished with exit code 0

關於@Bean的隨記

值得一提的是, @Bean提供了不少參數.

相關文章
相關標籤/搜索