15个Spring的核心注释示例

237 篇文章 4 订阅
237 篇文章 1 订阅

众所周知,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等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值