文档章节

15个Spring的核心注释示例

j
 java菜分享
发布于 2018/12/17 12:34
字数 1848
阅读 11
收藏 8

众所周知,Spring DI和Spring IOC是Spring Framework的核心概念。让我们从org.springframework.beans.factory.annotation和org.springframework.context.annotation包中探索一些Spring核心注解。我们经常将这些称为“Spring核心注解”,我们将在本文中对它们进行讲解。

 

这是所有已知的Spring核心注解的列表。

 

 

@Autowired

 

我们可以使用@Autowired注释来标记Spring将要解析和注入的依赖关系。我们可以将这个注释与构造函数,setter或字段注入一起使用。

 

构造器注入

 
  1. @RestController

  2. public class CustomerController

  3. {

  4. private CustomerService customerService;

  5. @Autowired

  6. public CustomerController ( CustomerService customerService)

  7. {  

  8. this. customerService = customerService;

  9. }}

setter注入

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

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

  3. @RestController

  4. public class CustomerController

  5. {

  6. private CustomerService customerService;

  7. @Autowired

  8. public void setCustomerService(CustomerService = customerService)

  9. {  

  10. this.customerService=customerService;

  11. }}

领域注入

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

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

  3. @RestController

  4. public class CustomerController

  5. {

  6. @Autowired private CustomerService = customerService;

  7. }

 

@Bean

 

@Bean是方法级注释,是XML元素的直接模拟。 注释支持一些提供的属性,例如init-method,destroy-method,auto-wiring和name。

您可以在 @Configuration注解或 @Component注解类中使用 @Bean批注

以下是

 

方法声明的简单示例:

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

 
  1. <beans>  

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

  3.  

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

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

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

  7. import com.companyname.projectname.customer.CustomerService;

  8. import com.companyname.projectname.order.OrderService;

  9. @Configuration

  10. public class Application

  11. {

  12. @Bean

  13. public CustomerService customerService()

  14. {  

  15. return new CustomerService();

  16. }

  17. @Bean

  18. public OrderService orderService();

  19. {  

  20. return new OrderService();

  21. }}

  22. @Bean

 

@Qualifier

 

此注释有助于微调基于注释的自动布线。 可能存在这样的情况:我们创建多个相同类型的bean,并且只想使用属性连接其中一个bean。 这可以使用@ Qualifier注释以及 @Autowired注释来控制。

 

示例:考虑使用EmailService和SMSService类来实现单个MessageService接口

 

为多个消息服务实现创建MessageService接口。

 
  1. public interface MessageService

  2. {

  3. public void sendMsg(String message);

  4. }

接下来,创建实现:EmailService和SMSService。

 
  1. public class SMSService implements MessageService

  2. {

  3. public void sendMsg(Stringmessage)

  4. {  

  5. System.out.println(message);

  6. }

  7. }

  8. public class EmailService implements MessageService

  9. {

  10. public void sendMsg(Stringmessage)

  11. {  

  12. System.out.println(message);

  13. }

  14. }

这时候该看看 @Qualifier注释的用法了

 
  1.  

    public interface MessageProcessor

     

  2. {

  3. public void processMsg(String message);

  4. }

  5. public class MessageProcessorImpl implements MessageProcessor

  6. {

  7. private MessageService messageService;

  8. // setter based DI

  9. @Autowired

  10. @Qualifier("emailService")

  11. public void setMessageService(MessageService messageService)

  12. {

  13. this.messageService=messageService;

  14. }

  15. // constructor based DI

  16. @Autowired

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

  18. {  

  19. this.messageService=messageService;

  20. }

  21. public void processMsg (String message)

  22. {

  23. messageService.sendMsg(message);

  24. }

  25. }

 

@Required

 

@Required 注释是一个方法级注释,并应用于bean的setter方法。此注释仅指示必须将setter方法配置为在配置时使用值依赖注入。例如,对setter方法的 @Required标记了我们想要通过XML填充的依赖项:

 
  1. @Required

  2. void setColor(Stringcolor){

  3. this.color =color;

  4. }

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

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

  7. </bean>

 

否则,将抛出BeanInitializationException。

 

@Value

 

Spring @Value 注释用于为变量和方法参数指定默认值。我们可以使用@Value 注释来读取Spring环境变量以及系统变量 。Spring @Value 注释也支持SpEL。让我们看一下使用@Value 注释的一些示例 。 

 

示例:我们可以使用@Value 注释为类属性指定默认值 。

 
  1. @Value

  2. ("Default DBConfiguration")    

  3. private String defaultName;

该 @Value 注释参数可以是只有字符串,但春天尝试将其转换为指定的类型。以下代码将正常工作,并将布尔值和整数值分配给变量。

 
  1. @Value("true")    

  2. private boolean defaultBoolean;

  3.  

  4. @Value("10")

  5.    private int defaultInt;

这演示了Spring @Value - Spring环境变量

 
  1. @Value("${APP_NAME_NOT_FOUND}")  

  2. private String defaultAppName;

接下来,使用 @Value 注释分配系统变量 。

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

  2. private String javaHome;    

  3. @Value("${HOME}")

  4.    private String homeDir;

Spring @Value – SpEL

 
  1.  

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

     

  2.    privatem String javaHome;

 

@DependsOn

 

该 @DependsOn 注释可以强制的Spring IoC容器中的bean,它是由注释之前初始化一个或多个bean @DependsOn 注释。

 

所述 @DependsOn 注释可以在直接或间接地注释与任何类使用 @Component 或与所述注解的方法 @Bean。

 

示例:让我们创建 FirstBean 和 SecondBean 类。在此示例中, SecondBean 在 bean之前初始化 FirstBean。

 
  1. public class FirstBean{    

  2. @Autowired    

  3. private SecondBean secondBean;

  4. }

  5. public class SecondBean {

  6. public  SecondBean() {

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

  8.    }

  9. }

基于配置类在Java中声明上述bean。

 
  1. @Configuration

  2. public class AppConfig {

  3.    @Bean("firstBean")

  4.    @DependsOn(value = {

  5.        "secondBean"

  6.    })

  7.    public FirstBean firstBean() {

  8.        return new FirstBean();

  9.    }

  10.    @Bean("secondBean")

  11.    public SecondBean secondBean() {

  12.        return new SecondBean();

  13.    }

  14. }

 

@Lazy

 

默认情况下,Spring IoC容器在应用程序启动时创建并初始化所有单例bean。我们可以通过使用 @Lazy 注释来防止单例bean的这种预初始化 。所述 @Lazy 注释可以在任何类中使用,与直接或间接地注释 @Component 或与所述注解的方法 @Bean。

 

示例:考虑我们有两个bean - FirstBean 和 SecondBean。在此示例中,我们将FirstBean 使用 @Lazy注释显式加载。

 
  1. public class FirstBean {

  2.    public void test() {

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

  4.    }

  5. }

  6. public class SecondBean {

  7.    public void test() {

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

  9.    }

  10. }

基于配置类在Java中声明上述bean。

 
  1. @Configuration

  2. public class AppConfig {

  3.    @Lazy(value = true)

  4.    @Bean

  5.    public FirstBean firstBean() {

  6.        return new FirstBean();

  7.    }

  8.    @Bean

  9.    public SecondBean secondBean() {

  10.        return new SecondBean();

  11.    }

  12. }

我们可以看到,bean secondBean 由Spring容器初始化,而bean firstBean 则被显式初始化。

@Lookup

注释的方法 @Lookup 告诉Spring在我们调用它时返回方法返回类型的实例。

@Primary

我们使用 @Primary 当存在多个相同类型的bean时,我们使用它 给bean更高的优先级。

 
  1. @Component

  2. @Primary

  3. class Car implements Vehicle {}

  4. @Component

  5. class Bike implements Vehicle {}

  6. @Component

  7. class Driver {

  8.    @Autowired

  9.    Vehicle vehicle;

  10. }

  11. @Component

  12. class Biker {

  13.    @Autowired

  14.    @Qualifier("bike")

  15.    Vehicle vehicle;

  16. }

@Scope

我们使用@ Scope注释来定义 @Component类的范围或 @Bean定义。 它可以是单例,原型,请求,会话,globalSession或某些自定义范围。 举个例子:

 
  1. @Component

  2. @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)

  3. public class TwitterMessageService implements MessageService {

  4. }

  5. @Component

  6. @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)

  7. public class TwitterMessageService implements MessageService {

  8. }

@Profile

如果我们希望Spring仅在特定配置文件处于活动状态时使用 @Component类或 @Bean方法,我们可以使用 @Profile标记它。 我们可以使用注释的value参数配置配置文件的名称:

 
  1. @Component

  2. @Profile("sportDay")

  3. class Bike implements Vehicle {}

@Import

@Import 注释指示一个或多个 @Configuration类进口。

例如:在基于Java的配置中,Spring提供了 @Import注释,允许从另一个配置类加载 @Bean定义。

 
  1. @Configuration

  2. public class ConfigA {

  3.    @Bean

  4.    public A a() {

  5.        return new A();

  6.    }

  7. }

  8. @Configuration

  9. @Import(ConfigA.class)

  10. public class ConfigB {

  11.    @Bean

  12.    public B b() {

  13.        return new B();

  14.    }

  15. }

现在,在实例化上下文时,不需要同时指定ConfigA类和ConfigB类,只需要显式提供ConfigB。

@ImportResource

Spring提供了一个 @ImportResource注释,用于将 applicationContext.xml文件中的bean加载到ApplicationContext中。 例如:考虑我们在类路径上有 applicationContext.xml Spring bean配置XML文件。

 
  1. @Configuration

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

  3. public class XmlConfiguration {

  4. }

@PropertySource

该 @PropertySource 注释提供了一种方便的声明性机制,用于添加 PropertySource Spring的Eenvironment以与@Configuration类一起使用 。

例如,我们从文件config.properties文件中读取数据库配置,并使用Environment 将这些属性值设置为 DataSourceConfig类。

 
  1. import org.springframework.beans.factory.InitializingBean;

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

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

  4. import org.springframework.context.annotation.PropertySource;

  5. import org.springframework.core.env.Environment;

  6. @Configuration

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

  8. public class ProperySourceDemo implements InitializingBean {

  9.    @Autowired

  10.    Environment env;

  11.    @Override

  12.    public void afterPropertiesSet() throws Exception {

  13.        setDatabaseConfig();

  14.    }

  15.    private void setDatabaseConfig() {

  16.        DataSourceConfig config = new DataSourceConfig();

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

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

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

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

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

  22.    }

  23. }

@PropertySources

我们可以使用此批注指定多个 @PropertySource配置:

 
  1. @PropertySources({

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

  3.  @PropertySource("classpath:db.properties")

  4. })

  5. public class AppConfig {

  6.  //...

  7. }

欢迎工作一到五年的Java工程师朋友们加入Java程序员开发: 854393687
群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!
 

 

© 著作权归作者所有

共有 人打赏支持
j
粉丝 4
博文 124
码字总数 379846
作品 0
深圳
私信 提问
Java Web(4)Spring 集成,与Hibernate

在数据库持久层的hibernate弄好后,接下来使用spring 来托管Hibernate的SessionFactory。 为什么要这么做呢?对于我来说也是一个很模糊的概念。 前面已经使用单例模式来加载Hibernate,确保S...

Jagery
2015/11/15
0
0
基于Groovy实现Spring Bean的动态加载

Spring对Groovy有着良好的支持,能把Groovy实现类作为Bean来使用,在前一篇Blog《Spring对Groovy Bean的支持》有详细的描述http://my.oschina.net/joshuazhan/blog/137940。基于Groovy Bean...

joshuazhan
2013/07/15
0
12
零侵入的 RESTful API 文档框架 - HttpDoc

HttpDoc 基于Java标准doc注释构建的代码零侵入的HTTP RESTful API在线阅览文档及测试界面框架 JSON-Editor: httpdoc-ui TextArea: httpdoc-ui-v1 功能特性 基础功能无需为配合HttpDoc框架而多...

不会钓鱼的兔子
2018/11/16
0
0
使用 Spring 3 MVC HttpMessageConverter 功能构建 RESTful web 服务

Spring,构建 Java™ 平台和 Enterprise Edition (Java EE) 应用程序的著名框架,现在在其模型-视图-控制器(Model-View-Controller ,MVC)层支持具象状态传输 (REST)。RESTful web 服务根据...

IBMdW
2011/08/05
5.2K
2
Springboot 中使用单元测试

参考自官网:Spring1.59的文档 一、测试 Testing Springboot 测试支持由两个模块提供; spring-boot-test 包含核心项目,而spring-boot-test-autoconfigure支持测试的自动配置。 大多数开发人...

不开心时不要学习
2018/01/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

监听DOM上某一个元素是否发生变化,利用MutationObserver来监听元素变化

/** * 观察DOM是否发变化的事件 * @type {MutationObserver|*} */ var MutationObserver = window.MutationObserver || window.WebKitMutationObse......

lwkai
1分钟前
0
0
遇到的问题

问题1:前两天在Nodepad++写了一个登录页面,但在Chrome中调试一直写不进Cookie。 解决办法:Chrome浏览器不支持本地静态js写Cookie。换用Edge调试即可。 内心:卧槽,浪费我这么多时间。 问...

akane_oimo
3分钟前
0
0
Oracle学习日志-6(聚合查询)

聚合函数 聚合函数可以对数据进行某种操作或者计算。比如几个常用的函数: COUNT:计算表中行数。 SUM:计算表中数据列中数据的合计值。 AVG:计算表中数据列中数据的平均值。 MAX:求出表中...

白话
5分钟前
0
0
Axure原型工具Axure RP9安装及Licensee

http://www.zhanshaoyi.com/9132.html

晚风0623
9分钟前
0
0
如何限制用户仅通过HTTPS方式访问OSS?

一、当前存在的问题 当前OSS支持用户使用HTTPS/HTTP协议访问Bucket。但由于HTTP存在安全漏洞。大型企业客户都要求使用HTTPS方式访问OSS,并且拒绝HTTP访问请求。 目前OSS可以通过RAM policy方...

阿里云官方博客
31分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部