2014-10-05 191 views
0

这是一个简单的数字猜测的例子来演示Java EE 7中的依赖注入。我不太明白的是Game.java中的两个注入字段,“maxNumber”和“randomNumber”。我知道它们可以被注入,因为在Generator.java中有两个@produce方法,@Produce int next()和@Produce int getMaxNumber()。在这个例子中通过@Produce注释的依赖注入

但是,方法名称“next()”与Game.java中注入的“randumNumber”不匹配。这是如何工作的?

此外,我试着在Generator.java中将“getMaxNumber()”更改为其他“getMMMaxNumber()”。该程序仍然正常工作。所以,我真的不明白这两个字段是如何从Generator.java注入Game.java的。

请帮忙理解这一点。非常感谢。

Game.java

package org.jboss.as.quickstarts.numberguess; 
@SuppressWarnings("serial") 
@Named 
@SessionScoped 
public class Game implements Serializable { 
/** 
* The number that the user needs to guess 
*/ 
private int number; 

/** 
* The users latest guess 
*/ 
private int guess; 

/** 
* The smallest number guessed so far (so we can track the valid guess range). 
*/ 
private int smallest; 

/** 
* The largest number guessed so far 
*/ 
private int biggest; 

/** 
* The number of guesses remaining 
*/ 
private int remainingGuesses; 

/** 
* The maximum number we should ask them to guess 
*/ 
@Inject 
@MaxNumber 
private int maxNumber; 

/** 
* The random number to guess 
*/ 
@Inject 
@Random 
Instance<Integer> randomNumber; 

public Game() { 
} 

public int getNumber() { 
    return number; 
} 

public int getGuess() { 
    return guess; 
} 

public void setGuess(int guess) { 
    this.guess = guess; 
} 

public int getSmallest() { 
    return smallest; 
} 

public int getBiggest() { 
    return biggest; 
} 

public int getRemainingGuesses() { 
    return remainingGuesses; 
} 


@PostConstruct 
public void reset() { 
    this.smallest = 0; 
    this.guess = 0; 
    this.remainingGuesses = 10; 
    this.biggest = maxNumber; 
    this.number = randomNumber.get(); 
} 
} 

Generator.java

@SuppressWarnings("serial") 
@ApplicationScoped 
public class Generator implements Serializable { 

private java.util.Random random = new java.util.Random(System.currentTimeMillis()); 

private int maxNumber = 100; 

java.util.Random getRandom() { 
    return random; 
} 

@Produces 
@Random 
int next() { 
    // a number between 1 and 100 
    return getRandom().nextInt(maxNumber - 1) + 1; 
} 

@Produces 
@MaxNumber 
int getMaxNumber() { 
    return maxNumber; 
} 
} 

MaxNumber.java

@Target({ TYPE, METHOD, PARAMETER, FIELD }) 
@Retention(RUNTIME) 
@Documented 
@Qualifier 
public @interface MaxNumber { 

} 

Random.java

@Target({ TYPE, METHOD, PARAMETER, FIELD }) 
@Retention(RUNTIME) 
@Documented 
@Qualifier 
public @interface Random { 

} 

回答

0

注射不是通过方法名称完成的,而是两个值的区别在于它们的限定符@Random@MaxNumber。 -annotated方法的相应方法名称不相关,它们只需要返回一个匹配类型。