spring 注释_Spring核心注释

spring 注释

介绍:

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

Spring注解

在本教程中,我们将探索所有这些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

spring 注释

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

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

相关文章

Struts2 <s:debug/> 标签无法显示

首先&#xff0c;确保在 JSP 页面中引入 Struts2 的标签库&#xff1a; <% taglib uri"/struts-tags" prefix"s"%>在 Struts 2 项目中需要查看值栈&#xff08;Value Stack &#xff09;的内容&#xff0c;但是在 JSP 页面中添加了 <s:debug/&g…

JSTL/EL表达式/Struts2标签/OGNL表达式

文章目录JSTL EL表达式Struts 标签 OGNL表达式JSTL EL表达式 JSTL 只能用在 JSP 文件中&#xff0c;不可以在 XML 和 HTML 文件中使用&#xff0c;不可以用在 JS 语境中&#xff0c;不可以用在 Java 的语境中。在 JSP 文件中&#xff0c;JSTL 标签可以使用在 HTML 标签的属…

spring 注释_Spring @Value注释

spring 注释介绍&#xff1a; Spring Value批注用于将值注入变量和方法参数。 我们可以读取spring环境变量或系统变量。 它还支持SpEL。 在本快速教程中&#xff0c;我们将探讨如何使用Spring Value批注。 建立&#xff1a; 让我们首先在app.properties文件中定义一些属性&am…

Struts2标签学习笔记

文章目录Struts2 标签是干什么的Struts2 标签可以使用在哪里关于标签的属性常用的标签s:property调用方法s:iterator遍历Integer类型的Lists:selects:ifs:form自动填写表单项的值s:textfields:includes:submits:checkboxs:radios:action示例代码s:dates:url示例代码s:set示例代…

maven依赖范围_Maven依赖范围

maven依赖范围介绍&#xff1a; 管理依赖关系是Maven的核心功能。 定义Maven依赖项时&#xff0c; scope属性定义了该依赖项在不同的Maven生命周期阶段&#xff08;例如build&#xff0c;test和run&#xff09;上的可见性。 依赖范围限制了任何项目中依赖的传递性&#xff0c;…

雅加达poi_雅加达EE:干净的板岩

雅加达poi该公告雅加达EE不能使用javax。*名称空间是个好消息&#xff0c;并提供雅加达EE用干净的石板上构建和创新企业级Java的未来。 原始提案 可以预见&#xff0c; javax。*和jakarta。*名称空间将在Java EE 8之后共存&#xff0c;随着它的发展&#xff0c; jakarta。*名称…

Struts2的配置文件struts.xml的模板

文章目录模板标签说明packageactionresult模板 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2…

Struts2的配置文件web.xml的模板

<?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns"http://xmlns.jcp.org/xml/ns/javaee"xsi:schemaLocation"http://xmlns.jcp.org/xml/ns/javaee http://…

cassandra数据备份_Cassandra中的数据建模

cassandra数据备份在关系数据模型中&#xff0c;我们为域中的每个对象建模关系/表。 对于Cassandra&#xff0c;情况并非如此。本文将详细介绍在Cassandra中进行数据建模时需要考虑的所有方面。 以下是Cassandra数据建模的粗略概述。 从上图可以看出&#xff0c; 概念数据建模…

Struts2项目中的JSP如何访问Session对象

Struts2 项目中&#xff0c;Session 对象存放在 ValueStack 的 context 对象中&#xff0c;context 是 Map 对象&#xff0c;那么要从 context 对象中获取到 Session 对象&#xff0c;就要指定 key 值。我们查看 ValueStack 的内容&#xff1a; 从 ValueStack 显示的内容可以知…

pom.xml中pom全称_摆脱pom XML…几乎

pom.xml中pom全称介绍 POM文件是XML格式的文件&#xff0c;声明性地描述了要使用Maven构建的Java项目的构建结构。 维护大型Java项目的POM XML文件通常很麻烦。 XML是冗长的&#xff0c;POM的结构也需要维护冗余信息。 多次对工件进行命名是多余的&#xff0c;在groupId和artif…

IntelliJ IDEA for Mac中Maven菜单用法详解

Reload project 你如果修改了 pom.xml 文件&#xff0c;可以点击这个按钮重载 Maven 项目&#xff0c;重载过程会引入新的依赖&#xff0c;会删除不需要的依赖。 Generate Sources and Update Folders 这个按钮是将 src/main/resources 和 src/test/resources 的资源文件编译…

sql 注射_只能在测试中注射吗?

sql 注射本文是关于测试设计和可测试性的一些想法。 我们与我的儿子讨论了一些问题&#xff0c;他的儿子是Java的初级开发人员&#xff0c;目前在匈牙利的EPAM&#xff08;我工作的同一家公司&#xff0c;但在另一家公司工作&#xff09;受雇并学习。 本文中的所有内容都是很好…

IntelliJ IDEA查看方法在哪里被调用(Method Usage Search/Method Call Hierarchy)

文章目录Usage SearchCall Hierarchy区别Usage Search 搜索使用的地方&#xff0c;快捷键如下&#xff1a; 你可以把光标移到方法名称处&#xff0c;然后点击右键&#xff0c;找到 Find Usages 菜单项&#xff0c;意思是“找到使用它的地方”。 例如我要查看哪些地方调用 f…

java编程学习方法_在线学习Java编程的最佳方法

java编程学习方法1.简介 Java是使用最广泛的编程语言之一。 根据Github的最新报告 &#xff0c;Java被列为仅次于JavaScript的第二大最常用的编程语言。 掌握Java的人有很多话题。 好消息是&#xff0c;您可以在线找到很多内容。 在这篇文章中&#xff0c;我们将对所有这些主题…

hibernate 标识符_Hibernate中的标识符

hibernate 标识符Hibernate中的标识符为实体的主键属性建模。 它有助于我们唯一地标识JPA实体。 每个实体都必须定义一个标识符。 同样&#xff0c;它可以是简单的也可以是复合的。 我们可以通过几种方式定义一个Hibernate标识符。 在本教程中&#xff0c;我们将学习如何做。 …

java中延迟_Java中的延迟分配

java中延迟程序员本质上是懒惰的&#xff0c;而similis simili gaudet就像程序是懒惰的一样。 您听说过延迟加载吗&#xff1f; 还是懒惰的单身人士&#xff1f; &#xff08;不过&#xff0c;我个人更喜欢单一麦芽版本。&#xff09;如果使用Scala或Kotlin&#xff08;这也是一…

camel apache_短款Apache Camel K

camel apache您可能已经看到我们在Camel K周围的Apache Camel社区中所做的工作。 Nicola于半年前在他的博客中介绍了Camel K &#xff0c; 就在几个月前&#xff0c;我们正在讨论一个新项目&#xff0c;该项目可以作为Apache Camel的一部分启动。 一个有可能改变人们处理集成方…

java 栈 队列 接口_Java队列接口

java 栈 队列 接口介绍&#xff1a; 队列是FIFO&#xff08;先进先出&#xff09;抽象数据类型&#xff08;ADT&#xff09;。 换句话说&#xff0c;按插入顺序将元素删除。 java.util.Queue是Java 中的接口&#xff0c;并且从java.util.Collection扩展。 一些常用的Queue实现…

jakarta ee_Jakarta EE 8状态

jakarta ee遵循Jakarta EE的人们可能知道即将发布的Jakarta EE 8在功能上将与Java EE 8等效。其原因是我们想证明从Oracle的传输已经完成&#xff0c;并且我们能够产生这些流程&#xff0c;规范&#xff0c;测试套件以及通过Eclipse Foundation的兼容实现。 到目前为止&#x…