Spring核心注释

介绍:

org.springframework.beans.factory.annotationorg.springframework.context.annotation包中存在的Spring注释通常称为Spring Core注释。 我们可以将它们分为两大类:DI相关的注释和上下文配置注释

春天注释

在本教程中,我们将探索所有这些Spring Core批注。

与DI相关的注释:

1.

我们使用@Autowired标记将由Spring容器注入的依赖项。 它可以与构造函数,setter或基于字段的注入一起使用。

构造函数注入:

public class Employee {private Department dept;@Autowiredpublic Employee(Department dept) {this.dept = dept;}
}

对于基于构造函数的注入,所有构造函数参数都是必需的。 从Spring 4.3开始,除非有两个或多个,否则我们可以跳过使用@Autowired批注显式批注的构造函数。

场注入:

public class Employee {@Autowiredprivate Department dept;
}

二传手注射:

public class Employee {private Department dept;@Autowiredpublic void setDept(Department dept) {this.dept = dept;}
}

@Autowired批注还接受一个名为required的可选布尔参数。 默认情况下,其值设置为true。 我们可以将其显式设置为false ,当自动装配失败时,Spring不会抛出异常。

2.

当我们有多个相同类型的bean时,我们将@Qualifier@Autowired注释一起使用以避免歧义。

假设我们有两个类:

@Component
public class Employee implements Person {}@Component
public class Student implements Person {}

由于它们都实现了Person接口,因此Spring无法使用@Autowired知道要注入哪个Person bean。 要解决此问题,我们可以使用@Qualifier批注:

public class Main {@Autowired@Qualifier("employee")private Person person;
}

就像@Autowired一样,我们可以将其与setter,构造函数或基于字段的注入一起使用。

3.

现在我们知道,当我们有多个相同类型的bean时,可以将@Qualifier@Autowired一起使用。 但是,大多数时候,我们特别需要这些bean的实例之一,很少需要其他实例。 我们可以 使用@Primary批注 标记 最常用的bean。 有了它,所有不合格的注入都将解析为我们的主bean。

@Primary
@Component
public class Employee implements Person {}@Component
public class Student implements Person {}@Component
public class EmployeeHandler {@Autowiredprivate Person employee;  
}@Component
public class StudentHandler {@Autowired@Qualifier("student")private Person student;    
}

由于我们已经在StudentHandler中指定了限定词,因此将注入Student bean。 对于EmployeeHandler ,我们跳过了限定符,因此将注入Employee 。 就像Employee是我们类型Person的主要bean一样。

4.

@Bean@Configuration类中使用的方法级注释。 它标记了用于实例化Spring bean的工厂方法:

@Configuration
public class AppConfig {...@Beanpublic Employee employee() {return new Employee();}
}

当需要返回类型的新实例时,Spring将调用这些方法。 实例化的bean与工厂方法具有相同的名称。 如果我们想给它一个不同的名字,我们可以使用这个注释的name参数来做到。

@Bean("myEmp")
public Employee employee() {return new Employee();
}

5.

默认情况下,Spring在应用程序启动时实例化所有单例bean。 如果要防止这种急切的初始化,可以使用@Lazy批注。 当我们使用@Lazy批注时,将首先根据用户请求实例化bean。

我们可以将此注释放在:

  • @Bean带注释的方法可延迟特定的bean实例化
  • 一个用@Configuration注释的类,以延迟创建该类中定义的所有bean
  • 一个标记为@Component的类 ,然后将延迟加载
  • 以及在构造函数,字段或setter上的@Autowired注释。 同样,在这里,容器将不会加载注入的依赖项,直到我们收到第一个用户请求
@Configuration
public class AppConfig {@Bean@Lazypublic Employee employee() {return new Employee();}@Beanpublic Student student() {return new Student();}
}

它还接受一个可选的布尔参数 ,默认值设置为true 。 如果将其设置为false ,它将热切实例化该bean。 当我们有一个配置来延迟加载除少数几个以外的所有bean时,这可以派上用场。

6.

@Required是在bean的setter方法上使用的方法级注释。 它只是标记我们要使用XML填充的依赖项:

@Required
void setName(String name) {this.name = name;
}
<bean class="com.programmergirl.spring.Employee"><property name="name" value="Joey" />
</bean>

如果不这样做,它将抛出BeanInitializationException

7.

我们可以使用@Value将外部源中定义的属性值注入到我们的bean中。 例如,我们可以在application.yamlapplication.properties文件中定义一些属性:

james.employee.id = 2563

然后将该值注入到我们的bean中:

@Value("${james.employee.id}")
private String jamesEmpId;

我们也可以在SpEL中使用@Value。

8.

@DependsOn注释可以强制Spring容器在使用@DependsOn注释进行注释的bean之前初始化一个或多个bean。

通常,此行为是自动的。 仅当我们具有隐式依赖项时(例如,加载JDBC驱动程序),才需要它。

我们可以在任何直接或间接使用@Component注释的类上或在使用@Bean注释的工厂方法上使用@DependsOn注释。

@Configuration
public class AppConfig {@Bean@DependsOn(value = {"employee"})public Dependent dependent() {return new Dependent();}}

9.

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

@Component
@Scope("prototype")
public class Employee {}

10.

一个带有@Lookup注释的方法告诉Spring在调用它时返回该方法的返回类型的实例。 它对以下有用:

  • 将原型bean注入单例实例
  • 程序注入依赖

要了解如何将原型bean注入到singleton bean中,请随时参考本文。

上下文配置注释:

我们可以使用以下注释配置应用程序上下文:

1. @个人资料

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

@Component
@Profile("dev")
public class Employee {}

2.

使用此批注,我们可以指定一个或多个要导入的@Configuration类。

@Configuration
public class EmployeeConfig {@Beanpublic Employee employee() {return new Employee();}
}@Configuration
@Import(EmployeeConfig.class)
public class AppConfig {@Beanpublic Student student() {return new Student();}
}

这样,我们就可以在初始化应用程序上下文时显式指定AppConfig类。 它将自动导入在EmployeeConfig中定义的bean

3.

我们可以使用此批注将bean从applicationContext.xml文件加载到ApplicationContext中

@Configuration
@ImportResource({"classpath*:applicationContext.xml"})
public class AppConfig {
}

4.

此批注提供了一种方便的方法来定义用于应用程序设置的属性文件:

@Configuration
@PropertySource("classpath:appConfig.properties")
public class DatabaseConfig implements InitializingBean {@AutowiredEnvironment env;...void setDbConfig() {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"));}}

5.

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

@Configuration
@PropertySources({ @PropertySource("classpath:/student.properties"),@PropertySource("classpath:/employee.properties"),@PropertySource("classpath:/database.properties")
})
class AppConfig {}

从Java 8开始,我们只需使用重复注释功能即可实现相同功能,即直接指定多个@PropertySource注释。

结论:

在本文中,我们介绍了最常见的Spring核心注释。 我们可以将它们用于Bean接线或配置应用程序上下文。

翻译自: https://www.javacodegeeks.com/2019/05/spring-core-annotations.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/342926.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LoRaWAN的四大优势及适用领域

如今随着通信技术发展迅速&#xff0c;通信行业即将迈入5G时代。数据传输将会更为密集&#xff0c;数据的交换量也将会越来越庞大。尤其是针对M2M通讯&#xff0c;由于设备的部署范围通常更宽广&#xff0c;且无线设备必须避免频繁更换电池&#xff0c;LoRaWAN技术便就此诞生&a…

工业交换机单纤或双纤都只是占用一个端口吗?

相信很多朋友在购买工业交换机的时候&#xff0c;都会考虑使用现场的传输距离&#xff0c;然后再选择单模还是多模&#xff0c;是单纤还是双纤&#xff0c;那么&#xff0c;这个是占用一个端口的吗&#xff1f;接下来我们就跟随飞畅科技的小编一起来详细了解下吧&#xff01; …

物联网的十大应用场景,带你认识真正的物联网通讯技术

如今&#xff0c;“万物互联”不只是一种愿景&#xff0c;在很多实际的应用场景里面&#xff0c;已经实现了局部的物联网&#xff0c;如工业自动化、智慧农业、智能公交、高端酒店等场所。物联网是未来十年最具有市场前景的领域&#xff0c;相关的无线通讯技术也逐步出现。 在…

计算机静音图标无法更改怎么办,声音图标没了不要着急,用金山毒霸2011进行修复 - 金山安全专题 - 声音图标没了怎么办? - 安全专题...

声音图标没了是怎么回事儿?金山工程师最近发现较多的用户在论坛提问“电脑声音图标没了&#xff0c;任务栏没声音了”等等&#xff0c;检查发现这些电脑上托盘区音量图标消失&#xff0c;无法调整音量。控制面板里与音量、声卡调整相关的设置变灰&#xff0c;不可修改。请使用…

常见的无线传感器数据采集传输系统的三种组网

无线传感器数据采集传输系统&#xff0c;可以实现对温度&#xff0c;压力&#xff0c;气体&#xff0c;温湿度&#xff0c;液位&#xff0c;流量&#xff0c;光照&#xff0c;降雨量&#xff0c;振动&#xff0c;转速等数据参数的实时采集&#xff0c;无线传输&#xff0c;无线…

工业交换机和商用交换机对比

工业交换机是为了满足工业应用需求而专门设计的交换机&#xff0c;因为工业环境较为恶劣&#xff0c;且需要的性能也要比一般的交换机高。所以工业交换机要比商用交换机要的性能要稳定&#xff0c;需要耐受严苛的工作环境。工业交换机产品采用宽温设计&#xff0c;防护等级不低…

java中hashmap_HashMap如何在Java中工作

java中hashmap面试中最常见的问题是“ HashMap如何在Java中工作”&#xff0c;“ HashMap的获取和放置方法如何在内部工作”。 在这里&#xff0c;我试图通过一个简单的示例来解释内部功能。 而不是通过理论&#xff0c;我们将首先从示例开始&#xff0c;以便您可以更好地理解&…

LoRa、Sigfox和NB-IoT在物联网趋势中谁是你的最佳拍档?

无线通信技术是物联网的传输基础&#xff0c;随着智慧城市大应用成为热门发展&#xff0c;各种技术推陈出新&#xff0c;纷纷抢占物联网市场。在LPWAN技术里&#xff0c;最热门的莫过于LoRa、Sigfox和NB-IoT。在物联网趋势中&#xff0c;这三种技术各自具有什么优势?谁才会是你…

计算机教育影片观后感,2020青少年法治教育片沉重的爱观后感大全

2020青少年法治教育片沉重的爱观后感大全时间&#xff1a;2020-11-21 13:41:01 分类&#xff1a;读/观后感 | 2020青春正步走沉重的爱观后感 | Word文档下载2020青少年法治教育片沉重的爱观后感大全导语&#xff1a;做人是孩子的立身之本&#xff0c;欲使孩子成才&#xff0c…

电话光端机类型

通过之前的介绍&#xff0c;我们了解到电话光端机就是把传统的电话信号转换成光信号并在光纤上传输的设备&#xff0c;但是&#xff0c;电话光端机又是怎么分类的&#xff0c;具体有哪些类型呢&#xff1f;今天&#xff0c;飞畅科技的小编就来为大家详细介绍下电话光端机的类型…

Zigbee如何在智能家居中成为领先的连接技术?

ZigBee技术是一种近距离、低复杂度、低功耗、低速率、低成本的双向无线通讯技术。主要用于距离短、功耗低且传输速率不高的各种电子设备之间进行数据传输以及典型的有周期性数据、间歇性数据和低反应时间数据传输的应用。 ZigBee建立在802.15.4标准之上&#xff0c;它确定了可以…

计算机启动完成后操作系统负责管理的是,终极:如果计算机启动后无法进入系统,旧驱动程序会教您如何处理...

为什么计算机无法启动进入系统&#xff1f;如何解决开机后电脑无法进入系统的问题&#xff1f;以下编辑器将为您详细介绍如何解决启动后计算机无法进入系统的问题。众所周知&#xff0c;长时间使用计算机时&#xff0c;会出现一种或另一种问题。引导后无法进入系统的问题是最常…

业界对物联网技术最常见的三大误区解读

各行各业都在借助数字化东风进行转型&#xff0c;制造业也不例外。智能工厂、大数据、物联网、人工智能……新兴技术在制造业领域焕发着巨大价值。然而对于物联网技术&#xff0c;很多企业依然抱有观望&#xff0c;甚至谨慎的态度。现在我们一起看看业界对这种技术的最常见误区…

电话光端机应用范围解析!电话光端机主要应用在哪些领域?

电话光端机刚进入安防领域时&#xff0c;称得上是当时的新贵。由于那时光纤通信的应用还未普及&#xff0c;别说行业内许多人没有看到过光端机&#xff0c;只怕没听说过的人也不在少数。那时候的光端机是十分昂贵的&#xff0c;因此也显得十分神秘。当然&#xff0c;它的性能优…

Zigbee费尽心思做mesh网究竟在智能家居中有什么用?

在物联网蓬勃发展的浪潮下&#xff0c;智能家居的热度也随之不断升温。由于智能家居的安全、节能、舒适、便利、高效等诸多特点&#xff0c;越来越多的客户开始接受和开发智能家居单品和系统。在中国推广Zigbee技术的这几年里&#xff0c;我有幸看到来自中国的厂家在物联网和智…

为什么要使用工业以太网交换机?

以太网技术得到很大的提高&#xff0c;并且被公司和大学办公室所接受&#xff0c;现在正逐步的拓展有更多需求的工业环境应用。工业以太网交换机的的吸引力包括监视数据传输&#xff0c;被用来建立和配置设备的现存实用工具 &#xff0c;还有可以从某个中心位置可以安装控制设备…

java生日快乐_Java八岁生日快乐!

java生日快乐这是又一次漫长的旅程&#xff0c;但是昨天&#xff0c;恰好是Java 7发布两年零七个月零十八天之后&#xff0c;我们现在有了可用于生产的构建 Java 8可供下载 &#xff01; 这个新的主要版本包含一些新功能和增强功能&#xff0c;这些功能和增强功能可以提高现有…

物联网在医疗保健中的应用

数字健康革命分为四个部分&#xff0c;即&#xff1a; 1、 获取信息(互联网时代) 2、 相互访问(社交网络) 3、 接触自己(通过移动和可穿戴健康技术量化自我) 4、 了解每一个人(大数据的后续开发和应用) 有趣的是&#xff0c;这实际上是由五部分组成的数字革命&#xf…

详解 | 引起电源模块发热的4个主要原因

一摸电源模块的表面&#xff0c;热乎乎的&#xff0c;模块坏了&#xff1f;且慢&#xff0c;有一点发热&#xff0c;仅仅只是因为它正努力地工作着。但高温对电源模块的可靠性影响极其大&#xff01;基于电源模块热设计的知识&#xff0c;这一次&#xff0c;我们扒一扒引起电源…

计算机表格文件打不开,我的电脑表格文件都打不开了怎么回事,请高手支个招,谢谢!...

我的电脑表格文件都打不开了怎么回事&#xff0c;请高手支个招&#xff0c;谢谢&#xff01;以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;我的电脑表格文件都打不开了怎么回事&#xff0c…