javascript
Spring核心注释
介紹:
org.springframework.beans.factory.annotation和org.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注釋。 同樣,在這里,容器將不會加載注入的依賴項,直到我們收到第一個用戶請求
它還接受一個可選的布爾參數值 ,默認值設置為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.yaml或application.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核心注释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Excel换行显示的2种方法Excel换
- 下一篇: 使用Spring Boot 2使用OAu