Guice: μžμ‹ μΈμ ν„°μ˜ 잘λͺ»λœ 였λ₯˜ λ©”μ‹œμ§€

에 λ§Œλ“  2014λ…„ 11μ›” 07일  Β·  11μ½”λ©˜νŠΈ  Β·  좜처: google/guice

μžμ‹ 인젝터가 있고 λΆ€λͺ¨ 인젝터에 μžμ‹μ— μ •μ˜λœ 바인딩 값을 μš”μ²­ν•˜λ©΄ "이미 ν•˜λ‚˜ μ΄μƒμ˜ μžμ‹ 인젝터에 κ΅¬μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€" 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

"ν•˜μœ„ 인젝터에 κ΅¬μ„±λ˜μ–΄ μžˆμ§€λ§Œ ...에 λŒ€ν•œ κ΅¬ν˜„μ΄ λ°”μΈλ”©λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€"라고 λ§ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

λ‹€μŒμ€ μƒ˜ν”Œ μ½”λ“œμž…λ‹ˆλ‹€.

import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;

public class GuiceBug {

    public static void main(String[] args) {
        Injector i1 = Guice.createInjector();
        Injector i2 = i1.createChildInjector(
                new AbstractModule() {
                        <strong i="8">@Override</strong>
                        protected void configure() {
                            bind(IStuff.class).to(Stuff.class);
                        }
                    });
        i1.getInstance(IStuff.class);
    }

    static interface IStuff {}

    static class Stuff implements IStuff {}
}
Exception in thread "main" com.google.inject.ConfigurationException: Guice configuration errors:

1) Unable to create binding for org.enercoop.test.GuiceBug$IStuff. It was already configured on one or more child injectors or private modules
    bound at org.enercoop.test.GuiceBug$1.configure(GuiceBug.java:15)
  If it was in a PrivateModule, did you forget to expose the binding?
  while locating org.enercoop.test.GuiceBug$IStuff

1 error
    at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1004)
    at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:961)
    at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1013)
    at GuiceBug.main(GuiceBug.java:18)

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

@laurentmartelli κ°€ 이 였λ₯˜μ— λŒ€ν•΄ μ˜³μ•˜λ‹€κ³  μƒκ°ν•˜μ§€ μ•Šμ„ 수 μ—†μŠ΅λ‹ˆλ‹€.

  • bind 호좜 μ‹œ 이 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.
  • bind ν˜ΈμΆœμ„ 주석 μ²˜λ¦¬ν•˜λ©΄ " No implementation for ... was bound "κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

바인딩이 λ„ˆλ¬΄ 많으면 μ–΄λ–»κ²Œ 바인딩 ν•˜λ‚˜λ₯Ό μ œκ±°ν•˜κ³  μΆ©λΆ„ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆκΉŒ?

λͺ¨λ“  11 λŒ“κΈ€

μ˜€ν•΄μ˜ μ†Œμ§€κ°€ μžˆλ‹€κ³  λ§ν•˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ? 였λ₯˜λŠ” μ •ν™•ν•©λ‹ˆλ‹€. μžμ‹μ— λ°”μΈλ”©λ˜μ–΄ 있기 λ•Œλ¬Έμ— λΆ€λͺ¨λ‘œλΆ€ν„° 바인딩을 κ°€μ Έμ˜¬ 수 μ—†μŠ΅λ‹ˆλ‹€. "κ΅¬ν˜„μ΄ λ°”μΈλ”©λ˜μ§€ μ•ŠμŒ"으둜 μ΄λ„λŠ” 것은 더 μ˜€ν•΄μ˜ μ†Œμ§€κ°€ μžˆλŠ” κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ ν•˜λ‚˜λŠ” _was_ λ°”μΈλ”©λ˜μ–΄ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. 단지 λ‹€λ₯Έ μœ„μΉ˜μ— μžˆμŠ΅λ‹ˆλ‹€.

" 이미 κ΅¬μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€"라고 λ§ν•˜λ©΄ 그렇지 μ•Šμ€ 두 번 κ΅¬μ„±λ˜μ—ˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. λ‹€λ₯Έ μœ„μΉ˜μ—μ„œ κ΅¬μ„±λ˜μ—ˆμŒμ„ μ•”μ‹œν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λΆ€λͺ¨μ™€ μžμ‹ λͺ¨λ‘μ—μ„œ 바인딩을 κ΅¬μ„±ν•˜λ©΄ "...에 λŒ€ν•œ 바인딩이 이미 ...에 κ΅¬μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€."도 ν‘œμ‹œλ©λ‹ˆλ‹€.

당신이 ν•˜λ‚˜μ˜ 사과λ₯Ό 가지고 있고 λˆ„κ΅°κ°€κ°€ κ·Έ 사과λ₯Ό κ°€μ Έκ°„λ‹€λ©΄, 당신이 그것을 μ–»μœΌλ €κ³  ν•  λ•Œ κ²°κ³ΌλŠ” "당신은 ν•  수 μ—†μŠ΅λ‹ˆλ‹€, λˆ„κ΅°κ°€κ°€ 이미 사과λ₯Ό κ°€μ Έκ°”μŠ΅λ‹ˆλ‹€"μž…λ‹ˆλ‹€. μ‚¬κ³ΌλŠ” 두 번 먹지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€. 당신이 그것을 μ–»μœΌλ €κ³  ν•  λ•Œ(당신을 μœ„ν•΄ 처음으둜, 총 두 번째둜), 당신은 그것이 이미 μ‚¬μš©λ˜μ—ˆλ‹€λŠ” 말을 λ“£μŠ΅λ‹ˆλ‹€.

이것은 λ™μΌν•©λ‹ˆλ‹€. (아직 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 바인딩을 κ°€μ Έμ˜€λŠ” λ°©λ²•μœΌλ‘œ) λΆ€λͺ¨μ— λŒ€ν•œ 바인딩을 λ§Œλ“€λ €κ³  ν•˜λ©΄ κ²°κ³ΌλŠ” μžμ‹ 인젝터에 이미 κ΅¬μ„±λ˜μ–΄ 있기 λ•Œλ¬Έμ— 바인딩을 λ§Œλ“€ 수 μ—†λ‹€λŠ” λ©”μ‹œμ§€κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

λ‚˜λŠ” λ‹Ήμ‹ μ˜ μš”μ μ„ μ΄ν•΄ν•˜μ§€λ§Œ " μžμ‹ μΈμ ν„°μ˜ μš”μ†Œκ°€ λΆ€λͺ¨μ—κ²Œ ν‘œμ‹œλ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—" μ—¬μ „νžˆ ν˜Όλž€μŠ€λŸ½μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ λΆ€λͺ¨λ‘œλΆ€ν„° μ •μ˜λ˜μ§€ μ•Šμ€ 무언가λ₯Ό μ›ν•˜λ©΄ μžμ‹μ— μ •μ˜λ˜κ±°λ‚˜ μ •μ˜λ˜μ§€ μ•Šμ€ 것이 μ•„λ‹ˆλΌ κ·Έ λ•Œλ¬Έμ— μ‹€νŒ¨ν•©λ‹ˆλ‹€.

그것은 잘λͺ»λœ κ²ƒμž…λ‹ˆλ‹€. μžμ‹μ— μ •μ˜λ˜μ–΄ 있기 λ•Œλ¬Έμ— μ •ν™•ν•˜κ²Œ μ‹€νŒ¨ν•©λ‹ˆλ‹€. λΆ€λͺ¨μ— μ •μ˜λ˜μ§€ μ•Šμ€ 경우 바인딩은 λŸ°νƒ€μž„μ— Just-In-Time λ°”μΈλ”©μœΌλ‘œ μƒμ„±λ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 바인딩이 이미 μžμ‹μ— μ‘΄μž¬ν•˜κ³  GuiceλŠ” λΆ€λͺ¨μ™€ μžμ‹ λͺ¨λ‘μ—μ„œ 바인딩을 ν—ˆμš©ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— just-in-time 바인딩을 λ§Œλ“€ 수 μ—†μŠ΅λ‹ˆλ‹€.

@laurentmartelli κ°€ 이 였λ₯˜μ— λŒ€ν•΄ μ˜³μ•˜λ‹€κ³  μƒκ°ν•˜μ§€ μ•Šμ„ 수 μ—†μŠ΅λ‹ˆλ‹€.

  • bind 호좜 μ‹œ 이 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.
  • bind ν˜ΈμΆœμ„ 주석 μ²˜λ¦¬ν•˜λ©΄ " No implementation for ... was bound "κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

바인딩이 λ„ˆλ¬΄ 많으면 μ–΄λ–»κ²Œ 바인딩 ν•˜λ‚˜λ₯Ό μ œκ±°ν•˜κ³  μΆ©λΆ„ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆκΉŒ?

참고둜 μ €λŠ” 이것이 맀우 ν˜Όλž€μŠ€λŸ½μŠ΅λ‹ˆλ‹€.

NB μ°¨μΌλ“œ 인젝터 λŠ” 맀우 ν˜Όλž€μŠ€λŸ½μŠ΅λ‹ˆλ‹€. λ‚΄λΆ€μ μœΌλ‘œ μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ €κ³  λ…Έλ ₯ν•©λ‹ˆλ‹€.

예, 였λ₯˜ λ©”μ‹œμ§€κ°€ ν˜Όλž€μŠ€λŸ½μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이제 인터넷 검색을 톡해 이 였λ₯˜μ— λŒ€ν•΄ μ„€λͺ…ν•˜κ³  μ‚¬λžŒλ“€μ΄ 문ꡬ에도 λΆˆκ΅¬ν•˜κ³  문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. @laurentmartelli κ°μ‚¬ν•©λ‹ˆλ‹€!

+ 1개

μ €μ—κ²Œλ„ ν˜Όλž€μŠ€λŸ¬μ› μŠ΅λ‹ˆλ‹€. 이 토둠에 λŒ€ν•œ 인터넷 검색이 μ‹€μ œ 원인을 μ°ΎλŠ” κ°€μž₯ λΉ λ₯Έ λ°©λ²•μ΄μ—ˆκΈ° λ•Œλ¬Έμ— λ©”μ‹œμ§€μ— 이 토둠에 λŒ€ν•œ 링크가 μžˆμ„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰