最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring三種方法的注解自動注入問題

 更新時間:2022年12月28日 10:15:50   作者:良猿啊  
這篇文章主要介紹了Spring三種方法的注解自動注入問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Spring三種方法的注解自動注入

1 @Autowired注解

@Autowired是Spring提供的自動注入的方法,該注解可以放在變量和方法上,在bean+返回值類型的注解中,@Autowired還可以放在參數(shù)前;@Autowired默認的注入是根據(jù)類型注入,如果相同類型的bean有多個,可以配合@Qualifier使用,則會根據(jù)名字自動注入;除了配合@Qualifier使用之外,還可以在相同類型的多個bean中的其中一個加上@Primary注解,那么根據(jù)類型注入就會第一注入有@Primary注解的bean。

示例代碼:

@Repository("stuDao1")
public class StudentDaoImpl1 implements StudentDao {
}
@Primary
@Repository("stuDao2")
public class StudentDaoImpl2 implements StudentDao {
}
@Service("stuService")
public class StudentService {
	
	@Autowired	//從IOC容器中找到StudentDao類型的bean加入到studentDao中,AutoWired注入不調用set方法
	@Qualifier("stuDao")
	private StudentDao studentDao;
 
	//@Autowired	//也可以把AutoWired注解放到set方法上,并且會調用set方法
	public void setStudentDao(StudentDao studentDao) {
		this.studentDao = studentDao;
	}
}

2 @Resource

@Resource注解是Java規(guī)范(JSR250)提供的方法,該注解默認是根據(jù)bean的名字自動注入,如果沒有找到對應的名字,則會自動根據(jù)類型查找并注入,可以使用name和type來指定根據(jù)名字還是類型來查找;@Resource注解同樣可以使用@Primary。

示例代碼:

public class StudentService {
 
//	@Resource(name="stuDao1") //根據(jù)名字查找bean
	@Resource(type=StudentDao.class)    //根據(jù)類型查找bean
	private StudentDao studentDao;
 
//  @Resource    //放在方法上
	public void setStudentDao(StudentDao studentDao) {
		this.studentDao = studentDao;
	}
}

3 @Inject

@Inject注解也是Java規(guī)范(JSR330)提供的方法,該注解默認是根據(jù)bean的類型自動注入,不過使用此注解需要導入javax-Inject.jar包;使用方法和@Autowired差不多一樣,也可以配合@Qualifier和@Primary使用。

javax-Inject.jar下載地址

示例代碼

@Service("stuService")
public class StudentService {
 
//	@Inject
//	@Qualifier("stuDao2")
	private StudentDao studentDao;
 
	@Inject
	@Qualifier("stuDao2")
	public void setStudentDao(StudentDao studentDao) {
		this.studentDao = studentDao;
	}
 
}

Spring 注解版 屬性賦值 自動注入

spring的屬性賦值,給一個bean的屬性進行賦值,可以使用@Value注解。

該注解可以注入基本數(shù)值,字符串什么的@Value("zhangsan"),也可以結合SpEL表達式@Value("#{18+1}"),還可以讀取配置文件中的屬性@Value("${person.nickname}")(person.nickname,是外部配置文件的一個屬性名)。

Person.java(一個普通的bean)

package com.sixteen.entity;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;

@Data
public class Person {

? ? /**
? ? ?* @Value注解
? ? ?* 1. 基本數(shù)值都可注入
? ? ?* 2. SPEl表達式 #{}
? ? ?* 3. ${} 獲取配置文件中的值
? ? ?*/

? ? // 配置文件中的值默認加載進環(huán)境變量
? ? /**可以這樣在環(huán)境中取出
? ? ?* ApplicationContext context = new AnnotationConfigApplicationContext(SpringPropertiesValueConfig.class);
? ? ?* Environment environment = context.getEnvironment();
? ? ?* String property = environment.getProperty("person.nickname");
? ? ?* System.out.println(property);
? ? ?*/
? ? @Value("zhangsan")
? ? private String name;
? ? @Value("#{18+1}")
? ? private Integer age;

? ? @Value("${person.nickname}")
? ? private String nickename;
}

SpringPropertiesValueConfig.java(配置類)

package com.sixteen.config;

import com.sixteen.entity.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

//使用@PropertySource導入外部配置文件,在bean里用@Value注解(@Value("${person.nickname}"))進行屬性賦值
@PropertySource(value = {"classpath:person.properties"})
@Configuration
public class SpringPropertiesValueConfig {

? ? @Bean
? ? public Person person(){
? ? ? ? return new Person();
? ? }
}

person.properties(外部配置文件)

person.nickname="xiaosan"

這樣就可以給實體類(bean)的屬性進行賦值了,在springboot中讀取外部配置文件的值時,還可以使用@ConfigurationProperties,這個注解之后再詳細說,也可以百度查詢資料,不過一般用于需要賦值的屬性過多時可以考慮,因為這一個注解就可以將所有屬性賦值,而不像@Value需要在每個屬性上加上。

自動注入(又被叫做DI注入)即在一個組件中如果想用另一個組件就可以注入想用的組件(因為spring接管了所有的bean和組件,所以想要用別的bean或者組件就得從IOC容器中獲?。?。最典型的例子就是,在service層需要調用dao層方法(或者叫做mapper)這個時候就可以采用自動注入。

此時使用的配置文件和上面的配置文件不一樣

SpringAutowiredConfig,java

package com.sixteen.config;

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

/**
?* @Autowired 自動注入
?*
?* @Autowired
?* private YyyMapper mapper;
?* 1) 默認按照類型去容器中找對應的組件,找到就賦值 context.getBean(SpringService.class);
?* 2) 如果找到多個相同類型的組件,再將屬性的名稱(mapper)作為組件id去容器查找 context.getBean("mapper")
?* @Qualifier(),傳入bean的id,可以指定注入的bean,而不是用屬性名
?*
?* 自動裝配默認裝配好,如果找不到組件,就報錯
?* 也可以設置@Autowired(require=false),如果找不到裝配的組件就不裝配,也不會報錯
?*
?* 可以使用@Primary注解,使裝配首選為該bean,使用此注解時可再用@Qualifier()
?* ?XxxService{
?* ? ? ?YyyMapeer mapper;
?* ?}
?*/

@Configuration
@ComponentScan(basePackages = {"com.sixteen.service","com.sixteen.mapper"})
public class SpringAutowiredConfig {
}

SpringService.java(service層)

package com.sixteen.service;

import com.sixteen.mapper.SpringMapper;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class SpringService {

? ? @Autowired
? ? private SpringMapper mapper;
}

SpringMapper.java

package com.sixteen.mapper;

import org.springframework.stereotype.Repository;

@Repository
public class SpringMapper {
}

一般情況這樣注入是沒問題的,但如果你想自動注入的組件/bean有多個在IOC容器時,那么就有可能注入的不是你所想要的,具體規(guī)則如下:

/**
?* @Autowired 自動注入
?*
?* @Autowired
?* private YyyMapper mapper;
?* 1) 默認按照類型去容器中找對應的組件,找到就賦值 context.getBean(SpringService.class);
?* 2) 如果找到多個相同類型的組件,再將屬性的名稱(mapper)作為組件id去容器查找 context.getBean("mapper")
?* @Qualifier(),傳入bean的id,可以指定注入的bean,而不是用屬性名
?*
?* 自動裝配默認裝配好,如果找不到組件,就報錯
?* 也可以設置@Autowired(require=false),如果找不到裝配的組件就不裝配,也不會報錯
?*
?* 可以使用@Primary注解,使裝配首選為該bean,使用此注解時可再用@Qualifier()
?* ?XxxService{
?* ? ? ?YyyMapeer mapper;
?* ?}
?*/

像service層中屬性這樣寫的話,@Autowired private SpringMapper mapper;,如果IOC容器中有不止一個SpringMapper這種組件,那么就會根據(jù)mapper這個臨時起的屬性名,作為bean的id去IOC容器中查找是否有組件,所以在必要時,一個屬性的名稱不要隨意起變量名。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Gateway+Swagger2配置聚合文檔方式

    Gateway+Swagger2配置聚合文檔方式

    這篇文章主要介紹了Gateway+Swagger2配置聚合文檔方式,具有很好的參考價值,希望對大家有所幫助。
    2023-03-03
  • OpenTelemetry初識及調用鏈Trace詳解

    OpenTelemetry初識及調用鏈Trace詳解

    這篇文章主要為為大家介紹了OpenTelemetry初識及調用鏈Trace詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Java枚舉_動力節(jié)點Java學院整理

    Java枚舉_動力節(jié)點Java學院整理

    enum 的全稱為 enumeration, 是 JDK 5 中引入的新特性,存放在 java.lang 包中。這篇文章給大家介紹Java枚舉相關知識,需要的的朋友參考下
    2017-04-04
  • Springboot和Jpa實現(xiàn)學生CRUD操作代碼實例

    Springboot和Jpa實現(xiàn)學生CRUD操作代碼實例

    這篇文章主要介紹了Springboot和Jpa實現(xiàn)學生CRUD操作代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • java  hibernate使用注解來定義聯(lián)合主鍵

    java hibernate使用注解來定義聯(lián)合主鍵

    這篇文章主要介紹了java hibernate使用注解來定義聯(lián)合主鍵的相關資料,需要的朋友可以參考下
    2017-01-01
  • Spring?Boot實現(xiàn)web.xml功能示例詳解

    Spring?Boot實現(xiàn)web.xml功能示例詳解

    這篇文章主要介紹了Spring?Boot實現(xiàn)web.xml功能,通過本文介紹我們了解到,在Spring Boot應用中,我們可以通過注解和編程兩種方式實現(xiàn)web.xml的功能,包括如何創(chuàng)建及注冊Servlet、Filter以及Listener等,需要的朋友可以參考下
    2023-09-09
  • 利用EasyPOI實現(xiàn)多sheet和列數(shù)的動態(tài)生成

    利用EasyPOI實現(xiàn)多sheet和列數(shù)的動態(tài)生成

    EasyPoi功能如同名字,主打的功能就是容易,讓一個沒見接觸過poi的人員就可以方便的寫出Excel導出,Excel導入等功能,本文主要來講講如何利用EasyPOI實現(xiàn)多sheet和列數(shù)的動態(tài)生成,需要的可以了解下
    2025-03-03
  • eclipse創(chuàng)建項目沒有dynamic web的解決方法

    eclipse創(chuàng)建項目沒有dynamic web的解決方法

    最近上課要用到eclipse,要用到Dynamic web project.但是我下載的版本上沒有.接下來就帶大家了解 eclipse創(chuàng)建項目沒有dynamic web的解決方法,文中有非常詳細的圖文示例,需要的朋友可以參考下
    2021-06-06
  • springboot編程式事務TransactionTemplate的使用說明

    springboot編程式事務TransactionTemplate的使用說明

    這篇文章主要介紹了springboot編程式事務TransactionTemplate的使用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java數(shù)據(jù)結構之數(shù)組(動力節(jié)點之Java學院整理)

    Java數(shù)據(jù)結構之數(shù)組(動力節(jié)點之Java學院整理)

    這篇文章主要介紹了Java數(shù)據(jù)結構之數(shù)組(動力節(jié)點之Java學院整理)的相關資料,包括創(chuàng)建和內存分配,數(shù)組封裝后的使用等,需要的朋友參考下吧
    2017-04-04

最新評論

永春县| 玉山县| 南靖县| 财经| 十堰市| 洛川县| 柞水县| 宁城县| 莒南县| 西畴县| 天峨县| 灵台县| 磴口县| 库车县| 林芝县| 叙永县| 蓬溪县| 江都市| 东至县| 区。| 临夏市| 澄迈县| 梅州市| 新郑市| 长垣县| 都兰县| 西林县| 安阳县| 井研县| 翼城县| 中方县| 来安县| 灵山县| 丘北县| 尉犁县| 历史| 松滋市| 潞西市| 广河县| 阿图什市| 邮箱|