亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

關(guān)于spring boot中幾種注入方法的一些個人看法

 更新時間:2019年07月21日 11:21:18   作者:xsDao  
這篇文章主要給大家介紹了關(guān)于spring boot中幾種注入方法的一些個人看法,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

最近在知乎上面看到一篇關(guān)于程序員面試的問題,面試官問我們一般有幾種注入的方法,這幾種注入的方法分別在什么時候運用比合理,當(dāng)時我看到這個時候懵逼了,由于我自己也是剛剛接觸springboot不久,所以就自己在平時運用的上面總結(jié)了一些知識點常用的幾種springboot的注入方法,由于我是一個小萌新,所只要是能夠起道注入的方法的注解我都列出來,有可能會有錯,希望大家能夠及時提出來我來解決:

  1. @Autowired
  2. @Resource
  3. @Component
  4. @Configuration
  5. @Qualifie
  6. @Bean
  7. ........

這幾種常用的嗎?難道還有什么其他的?當(dāng)然有,下面我總結(jié)了一下自己對于這幾種注入的看法和認(rèn)識。
首先是我們使用頻率較為高的@Autowired:

這個注解可能是我們使用頻率較為頻繁的一個注解的了,幾乎在剛剛?cè)腴T的時候,我們都會使用這個注釋,那么@Autowired 注釋的工作原理是什么呢?

第一:其實在啟動spring IoC時,容器自動裝載了一個AutowiredAnnotationBeanPostProcessor后置處理器,當(dāng)容器掃描到@Autowied、@Resource或@Inject時,就會在IoC容器自動查找需要的bean,并裝配給該對象的屬性

 <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> 

第二:@Autowired 注釋,它可以對類成員變量、方法及構(gòu)造函數(shù)進行標(biāo)注,完成自動裝配的工作。 通過 @Autowired的使用來消除 set ,get方法。在使用@Autowired之前,我們對一個bean配置起屬性時,是這用用的

<property name="屬性名" value=" 屬性值"/> 

通過這種方式來,配置比較繁瑣,而且代碼比較多。在Spring 2.5 引入了 @Autowired 注釋
我們平常直接引用的時候很少注意這些,只是自己寫好了一個方法或者springboot自動配置好的一個方法我們要在另一個類中去調(diào)用,這個時候,我們就會采用該注釋,例如:我已經(jīng)寫好一個工具類,此時,我需要在其他類中調(diào)用該工具類的方法:

/*
這是要被調(diào)用的類
*/
@Repository("userRepository")
 public class UserRepositoryImps implements UserRepository{
 
  @Override
  public void save() {
   System.out.println("UserRepositoryImps save is success");
  }
 }

已調(diào)用的類

 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.proc.bean.repository.UserRepository;
 /*
 方法注入的類
 */
 @Service
 public class UserService {
 
  @Autowired
  private UserRepository userRepository;
  
  public void save(){
   userRepository.save();
  }
 }

接著我們開始聊一下@Resource這個注解:

第一:@Resource(這個注解屬于J2EE的),默認(rèn)按照名稱進行裝配,名稱可以通過name屬性進行指定,如果沒有指定name屬性,當(dāng)注解寫在字段上時,默認(rèn)取字段名進行安裝名稱查找,如果注解寫在setter方法上默認(rèn)取屬性名進行裝配。當(dāng)找不到與名稱匹配的bean時才按照類型進行裝配。但是需要注意的是,如果name屬性一旦指定,就只會按照名稱進行裝配。

第二:可以用在方法、屬性、類上,通過CommonAnnotationBeanPostProcessor類實現(xiàn)依賴注入 與@AutoWired一致。但可以指定name屬性來指定beanName,但如果name對應(yīng)的bean不存在,則會拋出異常,且沒有required屬性。
當(dāng)作用在類上面的時候:可以用來指定name

 @Resource(name = "testMapper")
 private TestMapper testMapper;

第三:@Autowired默認(rèn)按類型裝配(這個注解是屬業(yè)spring的),默認(rèn)情況下必須要求依賴對象必須存在,如果要允許null 值,可以設(shè)置它的required屬性為false

 @Autowired() 
 private StudentDao studentDao;

來,繼續(xù)往下走,開始擼@Component這個注解:

第一:@Component泛指組件,當(dāng)組件不好歸類的時候,我們可以使用這個注解進行標(biāo)注。

第二:@component (把普通pojo實例化到spring容器中,相當(dāng)于配置文件中的<bean id="" class=""/>)泛指各種組件,就是說當(dāng)我們的類不屬于各種歸類的時候(不屬于@Controller、@Services等的時候),我們就可以使用@Component來標(biāo)注這個類。

例如下面的這個例子

注意:這個只能作用于類上面

package cn.com.scitc.security;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.stereotype.Component;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@Component("myLoginSuccessHandler")
public class MyLoginSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
 private Logger logger = LoggerFactory.getLogger(getClass());

 @Autowired
 private ObjectMapper objectMapper;

 @Override
 public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException {
  response.setContentType("application/json;charset=UTF-8");

  logger.info("登錄成功");

  PrintWriter out = response.getWriter();
  out.write(objectMapper.writeValueAsString("登錄成功"));
  out.flush();
  out.close();

 }
}

看了這么多,是不是有點累了,不行接著擼@Configuration的注解:

首先我們先明白從Spring3.0,@Configuration用于定義配置類,可替換xml配置文件,被注解的類內(nèi)部包含有一個或多個被@Bean注解的方法,這些方法將會被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext類進行掃描,并用于構(gòu)建bean定義,初始化Spring容器。

在使用的時候需要注意:

1.@Configuration不可以是final類型;

2.@Configuration不可以是匿名類;

3.嵌套的configuration必須是靜態(tài)類。

下面講解詳細的使用

第一:用@Configuration加載spring

1.1、@Configuration配置spring并啟動spring容器

1.2、@Configuration啟動容器+@Bean注冊Bean

1.3、@Configuration啟動容器+@Component注冊Bean

1.4、使用 AnnotationConfigApplicationContext 注冊 AppContext 類的兩種方法

1.5、配置Web應(yīng)用程序(web.xml中配置AnnotationConfigApplicationContext)

第二:組合多個配置類

2.1、在@configuration中引入spring的xml配置文件

2.2、在@configuration中引入其它注解配置

2.3、@configuration嵌套(嵌套的Configuration必須是靜態(tài)類)

2.4、@EnableXXX注解

2.5、@Profile邏輯組配置

2.6、使用外部變量

下面講解一個比較常用的例子:不知道各位大佬的在用在SpringBoot 中使用Security安全框架的時候會出現(xiàn)一個默認(rèn)的登錄界面,但是我們一般不回去用哪個登錄界面,這時候我們就應(yīng)該自己去寫一個登錄的界面以及后端的實行方法,那么這個時候,@configuration就派上用場了,話不多說,直接上例子:

package cn.com.scitc.config;

import org.springframework.boot.web.server.ConfigurableWebServerFactory;
import org.springframework.boot.web.server.ErrorPage;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;

@Configuration
public class ErrorConfigurar {
 /**
  * 自定義錯誤頁面
  * @return
  */
 @Bean
 public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer() {

  return (factory -> {
   ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/404");
   ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR,"/500");
   ErrorPage errorPage403 = new ErrorPage(HttpStatus.FORBIDDEN,"/403");
   factory.addErrorPages(errorPage404);
   factory.addErrorPages(errorPage403);
   factory.addErrorPages(errorPage500);
  });
 }
}

注意:該注釋也是用于全局的,所以定義在類上面。

接下來來一個就比較簡單的@Qualifier了,這個注解在我認(rèn)為就是@Autowired的小弟,它一般和@Autowired一起用,當(dāng) @Autowired() 不帶參數(shù)的時候@Qualifie就可以帶上參數(shù)。Qualifier限定描述符除了能根據(jù)名字進行注入,更能進行更細粒度的控制如何選擇候選者。

 @Autowired() 
 @Qualifie("/studentDao")
 private StudentDao studentDao;

現(xiàn)在繼續(xù)擼一個叫@Bean的注解;

很多人就會問@Bean為什么可以當(dāng)做注入來用呢?在剛剛開始的時候我也是認(rèn)為@Bean就是封裝一個POJO類而已,可是后面我覺得它是可以用來當(dāng)做注入注解來使用的。

首先,@Bean可理解為用spring的時候xml里面的<bean>標(biāo)簽;

其次,@Bean是一個方法級別上的注解,主要用在@Configuration注解的類里,也可以用在@Component注解的類里,添加的bean的id為方法名;

@Configuration
public class AppConfig {

 @Bean
 public TransferService transferService() {
  return new TransferServiceImpl();
 }

}

再接著:@bean 也可以依賴其他任意數(shù)量的bean,如果TransferService 依賴 AccountRepository,我們可以通過方法參數(shù)實現(xiàn)這個依賴;

@Bean
 public TransferService transferService(AccountRepository accountRepository) {
  return new TransferServiceImpl(accountRepository);
 }

最后講一下,指定bean的scope

使用@Scope注解來指定使用@Bean定義的bean

@Scope("prototype")

設(shè)置@Scope的屬性proxyMode來指定,默認(rèn)是ScopedProxyMode.NO, 你可以指定為默認(rèn)是ScopedProxyMode.INTERFACES或者默認(rèn)是ScopedProxyMode.TARGET_CLASS。

@Bean
@SessionScope
public StuPreferences stuPreferences() {
 return new StuPreferences();
}

@Bean
public Service StuService() {
 StuService service = new SimpleStuService();
 
 service.setStuPreferences(StuPreferences());
 return service;
}

通過上面的說明,就足以說明這是可以用來注入的。

最后,我們來探討一下private final修飾的變量可以被用來作為注入你們覺得可以嗎?

試想,在一個大的項目中,幾乎所有的引用都是用public、@Bean等相應(yīng)的方法注入,那么就會造成代碼的耦合度較高,造成了項目的維護困難,那么久只有被項目經(jīng)理K一頓啦。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Java實現(xiàn)學(xué)生信息管理系統(tǒng)(借助Array?List)

    Java實現(xiàn)學(xué)生信息管理系統(tǒng)(借助Array?List)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)學(xué)生信息管理系統(tǒng),借助Array?List,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • SpringMVC多個文件上傳及上傳后立即顯示圖片功能

    SpringMVC多個文件上傳及上傳后立即顯示圖片功能

    這篇文章主要介紹了SpringMVC多個文件上傳及上傳后立即顯示圖片功能,非常不錯,具有參考借鑒價值功能,需要的朋友可以參考下
    2017-10-10
  • springcloud gateway 映射失效的解決方案

    springcloud gateway 映射失效的解決方案

    這篇文章主要介紹了springcloud gateway 映射失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java實現(xiàn)的猜數(shù)字游戲示例

    Java實現(xiàn)的猜數(shù)字游戲示例

    這篇文章主要介紹了Java實現(xiàn)的猜數(shù)字游戲,涉及Java數(shù)學(xué)運算與判斷相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06
  • Java將文件上傳到ftp服務(wù)器

    Java將文件上傳到ftp服務(wù)器

    這篇文章主要為大家詳細介紹了Java將文件上傳到ftp服務(wù)器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • SparkSQL快速入門教程

    SparkSQL快速入門教程

    Spark?SQL是Spark用于結(jié)構(gòu)化數(shù)據(jù)(structured?data)處理的Spark模塊,今天通過本文給大家介紹SparkSQL快速入門教程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2022-02-02
  • 解決SpringBoot @value注解取不到值的問題

    解決SpringBoot @value注解取不到值的問題

    這篇文章主要介紹了解決SpringBoot @value注解取不到值的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java使用Zxing二維碼生成的簡單示例

    Java使用Zxing二維碼生成的簡單示例

    ZXing是一個開源的,用Java實現(xiàn)的多種格式的1D/2D條碼圖像處理庫,下面這篇文章主要給大家介紹了關(guān)于Java使用Zxing二維碼生成的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • 使用java數(shù)組 封裝自己的數(shù)組操作示例

    使用java數(shù)組 封裝自己的數(shù)組操作示例

    這篇文章主要介紹了使用java數(shù)組 封裝自己的數(shù)組操作,結(jié)合實例形式分析了java數(shù)組索引、遍歷等相關(guān)封裝操作技巧與注意事項,需要的朋友可以參考下
    2020-03-03
  • java線程池工作隊列飽和策略代碼示例

    java線程池工作隊列飽和策略代碼示例

    這篇文章主要介紹了java線程池工作隊列飽和策略代碼示例,涉及線程池的簡單介紹,工作隊列飽和策略的分析及代碼示例,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11

最新評論