Spring @Autowired 사용법에 대해서
스프링 자동 배선 주석을 이해하기 위해 스프링 3.0.x 참조 문서를 읽고 있습니다.
아래의 예를 이해할 수 없습니다.XML을 동작시키기 위해서 필요한 것이 있습니까?
예 1
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Autowired
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// ...
}
예 2
public class MovieRecommender {
private MovieCatalog movieCatalog;
private CustomerPreferenceDao customerPreferenceDao;
@Autowired
public void prepare(MovieCatalog movieCatalog,
CustomerPreferenceDao customerPreferenceDao) {
this.movieCatalog = movieCatalog;
this.customerPreferenceDao = customerPreferenceDao;
}
// ...
}
같은 인터페이스를 구현하여 같은 클래스를 사용하여2개의 클래스를 자동 배선하려면 어떻게 해야 합니까?
예제:
class Red implements Color
class Blue implements Color
class myMainClass{
@Autowired
private Color color;
draw(){
color.design();
}
}
어떤 설계 방식이 호출됩니까?블루가 아닌 레드 클래스의 디자인 방식을 호출하려면 어떻게 해야 하나요?
TL;DR
@Autowired
주석을 사용하면 XML 파일(또는 다른 방법)에서 직접 배선을 수행할 필요가 없어져 어디에 삽입해야 하는지, 어디에 삽입해야 하는지 찾을 수 있습니다.
상세설명
@Autowired
주석을 사용하면 주입할 내용을 다른 곳에서 건너뛸 수 있습니다.은 패음음음음고고고고고고고고고 assuming assuming assuming assuming assuming assuming assuming assuming 라고 가정합니다.com.mycompany.movies
XML(어플리케이션콘텍스트 파일)에 다음 태그를 붙여야 합니다.
<context:component-scan base-package="com.mycompany.movies" />
이 태그는 자동 스캔을 수행합니다.각에 올바른 이 붙어 요.@Component
콩의 ) (단순 콩의 경우)@Controller
제어의 ) (서블릿 제어의 경우)@Repository
)DAO
및 클래스 아래에 ).com.mycompany.movies
봄은 이 모든 것을 찾아서 각각의 콩을 만들 것이다.이것은 2개의 클래스 스캔으로 이루어집니다.첫 번째 스캔에서는 콩이 될 필요가 있는 클래스를 검색하고 필요한 주입을 맵합니다.두 번째 스캔에서는 콩을 주입합니다.물론 기존 XML 파일이나 클래스(또는 이 세 가지 조합)를 사용하여 콩을 정의할 수 있습니다.
@Autowired
주석은 주입이 필요한 스프링을 나타냅니다. ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.setMovieFinder
로) set
+ + @Autowired
(주석) 콩을 주입해야 합니다.두 번째 스캔에서는 스프링이 빈 타입을 검색합니다.MovieFinder
그런 콩을 발견하면 이 방법으로 주입합니다.만약 그런 콩 두 개를 발견하면, 당신은 그것을 얻을 것이다.Exception
을회 the the the 를 위해Exception
을할 수 .@Qualifier
주석을 붙이고 다음 방법으로 두 콩 중 어느 콩을 주입할지 지시합니다.
@Qualifier("redBean")
class Red implements Color {
// Class code here
}
@Qualifier("blueBean")
class Blue implements Color {
// Class code here
}
또는 XML 내의 빈을 선언하는 경우는, 다음과 같이 됩니다.
<bean id="redBean" class="com.mycompany.movies.Red"/>
<bean id="blueBean" class="com.mycompany.movies.Blue"/>
서서 @Autowired
(declaration)도 합니다.@Qualifier
의 콩 중 주사해야 합니다.
@Autowired
@Qualifier("redBean")
public void setColor(Color color) {
this.color = color;
}
개의(「주석」).@Autowired
★★★★★★★★★★★★★★★★★」@Qualifier
을 사용하면 .@Resource
하다
@Resource(name="redBean")
public void setColor(Color color) {
this.color = color;
}
@Resource
(이 답변의 첫 번째 설명에서 일부 추가 데이터를 읽을 수 있습니다.) 주석을 두 개 사용할 필요가 없으며 대신 주석 하나만 사용할 수 있습니다.
코멘트를 2개 더 추가하겠습니다.
- 것이 방법이 될 것 같아요.
@Inject
@Autowired
스프링에 특화되어 있지 않고 표준의 일부이기 때문입니다. - 하나의 은 '하다'를 입니다.
@Inject
@Autowired
이치노하면 주입된 할 수 있으며 응용 하려고 할 때 하여 늘을 할 수 .NullPointerException
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
업데이트: 그림을 완성하기 위해 다음 항목에 대한 새로운 질문을 작성했습니다.@Configuration
를 누릅니다
이 예에서는, 「같은 인터페이스를 실장하고 있는 클래스」라고 하는 것은 없습니다. MovieCatalog
으로, 「」입니다.CustomerPreferenceDao
른른른타타타다다을 사용하다
봄 2.x에서는 콩의 배선이 대부분 콩 ID 또는 이름을 통해 이루어졌습니다.이 기능은 Spring 3.x에서도 지원되지만 특정 유형의 콩 인스턴스가 1개 있는 경우가 많습니다.대부분의 서비스는 싱글톤입니다.그것들의 이름을 만드는 것은 지루하다.그래서 스프링은 "타입별 자동 배선"을 지원하기 시작했다.
예를 들어 필드, 메서드 및 컨스트럭터에 콩을 주입하기 위해 사용할 수 있는 다양한 방법이 있습니다.
XML에는 이미 Spring에 필요한 모든 정보가 포함되어 있습니다.이는 각 콩에 완전 수식 클래스 이름을 지정해야 하기 때문입니다.다만, 인터페이스에는 조금 주의할 필요가 있습니다.
이 자동 배선은 실패합니다.
@Autowired
public void prepare( Interface1 bean1, Interface1 bean2 ) { ... }
Java는 바이트 코드에 파라미터 이름을 유지하지 않기 때문에 Spring은 더 이상 두 콩을 구분할 수 없습니다.은 '이렇게 하다'를 사용하는 입니다.@Qualifier
:
@Autowired
public void prepare( @Qualifier("bean1") Interface1 bean1,
@Qualifier("bean2") Interface1 bean2 ) { ... }
네, Spring servlet context xml 파일을 설정하여 콩(클래스)을 정의하고 자동 주입을 수행할 수 있습니다.단, 스프링을 가동하려면 다른 구성을 수행해야 하며, 이를 위한 가장 좋은 방법은 튜토리얼을 그라운드 업하는 것입니다.
Spring을 설정하면 위의 예 1의 Spring servlet 컨텍스트xml 파일에서 다음 작업을 수행할 수 있습니다(com.movies 패키지 이름을 실제 패키지 이름으로 대체하고 이것이 서드파티 클래스인 경우 적절한 jar 파일이 클래스 경로에 있는지 확인하십시오).
<beans:bean id="movieFinder" class="com.movies.MovieFinder" />
아니면 MovieFinder 클래스에 원시적인 가치를 가진 컨스트럭터가 있다면 이렇게 할 수 있습니다.
<beans:bean id="movieFinder" class="com.movies.MovieFinder" >
<beans:constructor-arg value="100" />
</beans:bean>
MovieFinder 클래스에 컨스트럭터가 다른 클래스를 기다리고 있다면 이런 작업을 할 수 있습니다.
<beans:bean id="movieFinder" class="com.movies.MovieFinder" >
<beans:constructor-arg ref="otherBeanRef" />
</beans:bean>
... 여기서 'otherBeanRef'는 예상 클래스에 대한 참조가 있는 다른 빈입니다.
언급URL : https://stackoverflow.com/questions/19414734/understanding-spring-autowired-usage
'programing' 카테고리의 다른 글
스트림을 열지 못했습니다.HTTP 래퍼에서는 쓰기 가능한 연결이 지원되지 않습니다. (0) | 2022.10.18 |
---|---|
Vue 3에서 Vuex를 사용할 수 없음 (0) | 2022.10.08 |
MariaDB Bugs?LIKE Escape (0) | 2022.10.08 |
nullable 열은 insert 문에 null 값을 사용하지 않는 이유는 무엇입니까? (0) | 2022.10.08 |
소켓 '/tmp/mysql.sock'을 통해 로컬 MySQL 서버에 연결할 수 없습니다. (0) | 2022.10.08 |