1. 程式人生 > >15個Spring的核心註釋示例

15個Spring的核心註釋示例

眾所周知,Spring DI和Spring IOC是Spring Framework的核心概念。讓我們從org.springframework.beans.factory.annotation和org.springframework.context.annotation包中探索一些Spring核心註解。我們經常將這些稱為“Spring核心註解”,我們將在本文中對它們進行講解。

這是所有已知的Spring核心註解的列表。

在這裡插入圖片描述

@Autowired

我們可以使用@Autowired註釋來標記Spring將要解析和注入的依賴關係。我們可以將這個註釋與建構函式,setter或欄位注入一起使用。

構造器注入

@RestController

public
 
class
 
CustomerController

{

private
 
CustomerService
 customerService;

@Autowired
 

public
 
CustomerController
 ( 
CustomerService
 customerService)

{  

this
. customerService = customerService;

}}

setter注入

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

import
 org.springframework.web.bind.annotation.
RestController
;

@RestController

public
 
class
 
CustomerController

{

private
 
CustomerService
 customerService;

@Autowired

public
 
void
 setCustomerService(
CustomerService
 = customerService)

{   

this
.customerService=customerService;

}}

領域注入

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

import
 org.springframework.web.bind.annotation.
RestController
;

@RestController
 

public
 
class
 
CustomerController

{

@Autowired
 
private
 
CustomerService
 = customerService;

}

@Bean

@Bean是方法級註釋,是XML元素的直接模擬。 註釋支援一些提供的屬性,例如init-method,destroy-method,auto-wiring和name。

您可以在 @Configuration註解或 @Component註解類中使用 @Bean批註

以下是

方法宣告的簡單示例:

上述配置等效於以下Spring XML:

<beans>
   

<beanid
=
"customerS ervice"
class
=
"com.companyname.projectname.CustomerService“/>



<beanid
=
"orderService"
clas
”=
"com.companyname.projectname.OrderService"
/>

</beans>
importorg.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import com.companyname.projectname.customer.CustomerService;

import com.companyname.projectname.order.OrderService;

@Configuration

public class Application

{

@Bean

public CustomerService customerService()

{   

return new CustomerService();

}

@Bean

public OrderService orderService();

{   

return new OrderService();

}}

@Bean

@Qualifier

此註釋有助於微調基於註釋的自動佈線。 可能存在這樣的情況:我們建立多個相同型別的bean,並且只想使用屬性連線其中一個bean。 這可以使用@ Qualifier註釋以及 @Autowired註釋來控制。

示例:考慮使用EmailService和SMSService類來實現單個MessageService介面

為多個訊息服務實現建立MessageService介面。

public
 
interface
 
MessageService

{

public
 
void
 sendMsg(
String
 message);

}

接下來,建立實現:EmailService和SMSService。

public
 
class
 
SMSService
 
implements
 
MessageService

{

public
 
void
 sendMsg(
Stringmessage
)

{   

System
.out.println(message);

}

}

public
 
class
 
EmailService
 
implements
 
MessageService

{

public
 
void
 sendMsg(
Stringmessage
)

{   

System
.out.println(message);

}

}

這時候該看看 @Qualifier註釋的用法了

public
 
interface
 
MessageProcessor



{

public
 
void
 processMsg(
String
 message);

}

public
 
class
 
MessageProcessorImpl
 
implements
 
MessageProcessor

{

private
 
MessageService
 messageService;

// setter based DI

@Autowired

@Qualifier
(
"emailService"
)

public
 
void
 setMessageService(
MessageService
 messageService)

{ 

this
.messageService=messageService;

}

// constructor based DI

@Autowired

public
 
MessageProcessorImpl
(
@Qualifier
(
"emailService"
)
MessageService
=messageServic)

{   

this
.messageService=messageService;

}

public
 
void
 processMsg (
String
 message)

{

messageService.sendMsg(message);

}

}

@Required

@Required 註釋是一個方法級註釋,並應用於bean的setter方法。此註釋僅指示必須將setter方法配置為在配置時使用值依賴注入。例如,對setter方法的 @Required標記了我們想要通過XML填充的依賴項:

@Required

void
 setColor(
Stringcolor
){

this
.color =color;

}

<bean 
class
=
"com.javaguides.spring.Car"
>    

<property name=
"color"
value=
"green"
/>

</bean>

否則,將丟擲BeanInitializationException。

@Value

Spring @Value 註釋用於為變數和方法引數指定預設值。我們可以使用@Value 註釋來讀取Spring環境變數以及系統變數 。Spring @Value 註釋也支援SpEL。讓我們看一下使用@Value 註釋的一些示例 。

示例:我們可以使用@Value 註釋為類屬性指定預設值 。

@Value

(
"Default DBConfiguration"
)    

private
 
String
 defaultName;

該 @Value 註釋引數可以是隻有字串,但春天嘗試將其轉換為指定的型別。以下程式碼將正常工作,並將布林值和整數值分配給變數。

@Value
(
"true"
)    

private
 
boolean
 defaultBoolean;



@Value
(
"10"
)

    
private
 
int
 defaultInt;

這演示了Spring @Value - Spring環境變數

@Value
(
"${APP_NAME_NOT_FOUND}"
)   

private
 
String
 defaultAppName;

接下來,使用 @Value 註釋分配系統變數 。

@Value
(
"${java.home}"
)    

private
 
String
 javaHome;    

@Value
(
"${HOME}"
)

    
private
 
String
 homeDir;

Spring @Value – SpEL



@Value
(
"#{systemProperties['java.home']}"
)



    privatem 
String
 javaHome;

@DependsOn

該 @DependsOn 註釋可以強制的Spring IoC容器中的bean,它是由註釋之前初始化一個或多個bean @DependsOn 註釋。

所述 @DependsOn 註釋可以在直接或間接地註釋與任何類使用 @Component 或與所述註解的方法 @Bean。

示例:讓我們建立 FirstBean 和 SecondBean 類。在此示例中, SecondBean 在 bean之前初始化 FirstBean。

public
 
class
 
FirstBean
{    

@Autowired
    

private
 
SecondBean
 secondBean;

}

public
 
class
 
SecondBean
 {

public
  
SecondBean
() {

        
System
.out.println(
"SecondBean Initialized via Constuctor"
);

    }

}

基於配置類在Java中宣告上述bean。

@Configuration

public
 
class
 
AppConfig
 {

    
@Bean
(
"firstBean"
)

    
@DependsOn
(value = {

        
"secondBean"

    })

    
public
 
FirstBean
 firstBean() {

        
return
 
new
 
FirstBean
();

    }

    
@Bean
(
"secondBean"
)

    
public
 
SecondBean
 secondBean() {

        
return
 
new
 
SecondBean
();

    }

}

@Lazy

預設情況下,Spring IoC容器在應用程式啟動時建立並初始化所有單例bean。我們可以通過使用 @Lazy 註釋來防止單例bean的這種預初始化 。所述 @Lazy 註釋可以在任何類中使用,與直接或間接地註釋 @Component 或與所述註解的方法 @Bean。

示例:考慮我們有兩個bean - FirstBean 和 SecondBean。在此示例中,我們將FirstBean 使用 @Lazy註釋顯式載入。

public
 
class
 
FirstBean
 {

    
public
 
void
 test() {

        
System
.
out
.println(
"Method of FirstBean Class"
);

    }

}

public
 
class
 
SecondBean
 {

    
public
 
void
 test() {

        
System
.
out
.println(
"Method of SecondBean Class"
);

    }

}

基於配置類在Java中宣告上述bean。

@Configuration

public
 
class
 
AppConfig
 {

    
@Lazy
(value = 
true
)

    
@Bean

    
public
 
FirstBean
 firstBean() {

        
return
 
new
 
FirstBean
();

    }

    
@Bean

    
public
 
SecondBean
 secondBean() {

        
return
 
new
 
SecondBean
();

    }

}

我們可以看到,bean secondBean 由Spring容器初始化,而bean firstBean 則被顯式初始化。

@Lookup
註釋的方法 @Lookup 告訴Spring在我們呼叫它時返回方法返回型別的例項。

@Primary
我們使用 @Primary 當存在多個相同型別的bean時,我們使用它 給bean更高的優先順序。

@Component

@Primary

class
 
Car
 
implements
 
Vehicle
 {}

@Component

class
 
Bike
 
implements
 
Vehicle
 {}

@Component

class
 
Driver
 {

    
@Autowired

    
Vehicle
 vehicle;

}

@Component

class
 
Biker
 {

    
@Autowired

    
@Qualifier
(
"bike"
)

    
Vehicle
 vehicle;

}

@Scope
我們使用@ Scope註釋來定義 @Component類的範圍或 @Bean定義。 它可以是單例,原型,請求,會話,globalSession或某些自定義範圍。
舉個例子:

@Component

@Scope
(value = 
ConfigurableBeanFactory
.SCOPE_SINGLETON)

public
 
class
 
TwitterMessageService
 
implements
 
MessageService
 {

}

@Component

@Scope
(value = 
ConfigurableBeanFactory
.SCOPE_PROTOTYPE)

public
 
class
 
TwitterMessageService
 
implements
 
MessageService
 {

}

@Profile
如果我們希望Spring僅在特定配置檔案處於活動狀態時使用 @Component類或 @Bean方法,我們可以使用 @Profile標記它。 我們可以使用註釋的value引數配置配置檔案的名稱:

@Component

@Profile
(
"sportDay"
)

class
 
Bike
 
implements
 
Vehicle
 {}

@Import
該 @Import 註釋指示一個或多個 @Configuration類進口。

例如:在基於Java的配置中,Spring提供了 @Import註釋,允許從另一個配置類載入 @Bean定義。

@Configuration

public
 
class
 
ConfigA
 {

    
@Bean

    
public
 A a() {

        
return
 
new
 A();

    }

}

@Configuration

@Import
(
ConfigA
.
class
)

public
 
class
 
ConfigB
 {

    
@Bean

    
public
 B b() {

        
return
 
new
 B();

    }

}

現在,在例項化上下文時,不需要同時指定ConfigA類和ConfigB類,只需要顯式提供ConfigB。

@ImportResource
Spring提供了一個 @ImportResource註釋,用於將 applicationContext.xml檔案中的bean載入到ApplicationContext中。 例如:考慮我們在類路徑上有 applicationContext.xml Spring bean配置XML檔案。

@Configuration

@ImportResource
({
"classpath*:applicationContext.xml"
})

public
 
class
 
XmlConfiguration
 {

}

@PropertySource
該 @PropertySource 註釋提供了一種方便的宣告性機制,用於新增 PropertySource Spring的Eenvironment以與@Configuration類一起使用 。

例如,我們從檔案config.properties檔案中讀取資料庫配置,並使用Environment 將這些屬性值設定為 DataSourceConfig類。

import
 org.springframework.beans.factory.
InitializingBean
;

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

import
 org.springframework.context.annotation.
Configuration
;

import
 org.springframework.context.annotation.
PropertySource
;

import
 org.springframework.core.env.
Environment
;

@Configuration

@PropertySource
(
"classpath:config.properties"
)

public
 
class
 
ProperySourceDemo
 
implements
 
InitializingBean
 {

    
@Autowired

    
Environment
 env;

    
@Override

    
public
 
void
 afterPropertiesSet() 
throws
 
Exception
 {

        setDatabaseConfig();

    }

    
private
 
void
 setDatabaseConfig() {

        
DataSourceConfig
 config = 
new
 
DataSourceConfig
();

        config.setDriver(env.getProperty(
"jdbc.driver"
));

        config.setUrl(env.getProperty(
"jdbc.url"
));

        config.setUsername(env.getProperty(
"jdbc.username"
));

        config.setPassword(env.getProperty(
"jdbc.password"
));

        
System
.
out
.println(config.toString());

    }

}

@PropertySources

我們可以使用此批註指定多個 @PropertySource配置:

@PropertySources
({

  
@PropertySource
(
"classpath:config.properties"
),

@PropertySource

(
"classpath:db.properties"
)

 })

 
public
 
class
 
AppConfig
 {

  
//...

 }

歡迎工作一到五年的Java工程師朋友們加入Java程式設計師開發: 854393687
群內提供免費的Java架構學習資料(裡面有高可用、高併發、高效能及分散式、Jvm效能調優、Spring原始碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!