@Autowired是否负责嵌套自动装配?

时间:2017-01-26 11:30:36

标签: spring dependency-injection

我有以下组件,分为两个不同的文件:

@echo off
Color 9B & Mode con cols=90 lines=5
Title "%~nx0" for Multi-files VirusTotal Uploader by Hackoo 2017
:::::::::::::::::::::::::::::::::::::::::
:: Automatically check & get admin rights
:::::::::::::::::::::::::::::::::::::::::
Set TmpLogFile=%tmp%\TmpLog.txt
If Exist %TmpLogFile% Del %TmpLogFile%
REM  --> Check for permissions
Reg query "HKU\S-1-5-19\Environment" >%TmpLogFile% 2>&1
REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
Echo.
ECHO                      **************************************
ECHO                       Running Admin shell... Please wait...
ECHO                      **************************************

    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    set params = %*:"=""
    echo UAC.ShellExecute "cmd.exe", "/c ""%~s0"" %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs"
    del "%temp%\getadmin.vbs"
    exit /B

:gotAdmin
::::::::::::::::::::::::::::
::START
::::::::::::::::::::::::::::
Title "%~nx0" for Multi-files VirusTotal Uploader by Hackoo 2017
:Main
Mode con cols=90 lines=3 & color 9E
Set "VirusTotalUploaderTool=%ProgramFiles%\VirusTotalUploader2\VirusTotalUploader2.2.exe"
If Not Exist "%VirusTotalUploaderTool%" ( Call:Downloading )
Set "Files_List2Upload=%~dp0ListFiles.txt"
echo(
echo           Creating a list of all *.exe files located on your temporary folder ...
Timeout /t 4 /NoBreak>nul
Dir /b /s /A:-D  "%Temp%\*.exe" > "%Files_List2Upload%"
If Not Exist "%Files_List2Upload%" ( Goto :Error )
For /f "delims=" %%f in ('Type "%Files_List2Upload%"') Do (
    Call:Upload2VirusTotal "%%~f"
)
Taskkill /im "VirusTotalUploader2.2.exe" /f >nul 2>&1
Exit
::*********************************************************************************
:Upload2VirusTotal <File>
Title "%~nx0" for Multi-files VirusTotal Uploader by Hackoo 2017
Cls
Set "File2Upload=%~1"
echo(
echo     Please wait a while ! Uploading file "%~nx1" to VirusTotal is in progress ...
Start "" "%VirusTotalUploaderTool%" "%File2Upload%"
Timeout /t 10 /nobreak>nul
exit /b
::*********************************************************************************
:Downloading
Title Downloading VirusTotal Uploader Tool v2.2 by Hackoo 2017
Set "URL=https://www.virustotal.com/static/bin/vtuploader2.2.exe"
Rem Create "MyDownload" folder in the temporary folder
set "MyDownload_Folder=%temp%\MyDownload"
If Not Exist "%MyDownload_Folder%" MD "%MyDownload_Folder%"
Set "Setup_File=%MyDownload_Folder%\vtuploader2.2.exe"
echo(
echo       Please wait a while ! downloading "vtuploader2.2.exe" is in progress ...
Rem Downloading vtuploader2.2.exe to the temporary folder
Call :Download "%URL%" "%Setup_File%"
cls
Color 9A 
Title Installing "vtuploader2.2.exe" is in progress ...
echo(
echo                 Installing "vtuploader2.2.exe" is in progress ...
Rem Silent installation of vtuploader2.2.exe the uploading tool
Call :Install_Silently %Setup_File% 
Rem Removing the download folder
Call :Clean %MyDownload_Folder%
Goto Main
::*********************************************************************************
:Download <url> <File>
Powershell.exe -command "(New-Object System.Net.WebClient).DownloadFile('%1','%2')"
exit /b
::*********************************************************************************
:Install_Silently <Setup_File>
"%~1" /S
exit /b
::*********************************************************************************
:Clean <Folder_Setup>
RD "%~1" /S /Q >nul
exit /b
::*********************************************************************************
:Error
cls & Color 4C
echo(
echo   The file "%Files_List2Upload%" dos not exist !
Pause>nul
exit /b
::*********************************************************************************

以下配置文件:

@Component
public class Chauffeur {
    Car car;

    public Chauffeur(Car car){
        this.car = car;
    }

    public void go(){
        System.out.println("Chauffeur");
        car.drive();
    }
}

@Component
public class Car{  
    public void drive() {
        System.out.println("Drive car");
    }
}

以及以下测试:

@Configuration
@ComponentScan
public class DriveableConfiguration {
}

上面的所有类都在同一个包中,测试正在通过。

在测试中,我使用@Autowired注释了@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes=DriveableConfiguration.class) public class DriveableTest { @Autowired Chauffeur chauffeur; @Test public void chauffeurTest(){ chauffeur.go(); } } ,这意味着Spring容器会在没有开发人员需要显式实例化它的情况下创建Chauffeur实例。 现在,Chauffer的构造函数需要Car的实例,因此该类没有默认构造函数。尽管如此,容器会创建它,在构造函数中注入所需的实例。

@Autowired对容器的说法是用它可以提供的任何(组件,豆)实例化元素,构造函数中包含的参数是什么?如果是这样,在什么情况下需要使用@Autowired来注释构造函数?

1 个答案:

答案 0 :(得分:1)

仅在您使用Spring 4.3+时。在这种情况下,如果你有一个非默认构造函数,构造函数上的@Autowired是可选的。

您可以查看示例here

  

从4.3开始,您不再需要在这样的单构造函数场景中指定显式注入注释。对于那些根本不带任何容器注释的类来说,这是特别优雅的,例如在以编程方式注册时

对于低于4.3的版本,您将抛出异常:

  

容器将抛出异常以查找默认值   构造函数,除非您明确指出autowire模式   bean定义设置中的“构造函数”(例如,在XML中)