Ref. Spring Framework Documentation v.5.3.16
📌 이 글에서는 공식문서의 The IoC Container 부분만 다룹니다.
org.springframework.context.ApplicationContext
인터페이스는 Spring IoC 컨테이너를 나타내며 빈의 인스턴스화, 구성 및 조합을 담당합니다. 컨테이너는 구성 메타데이터를 읽어 인스턴스화, 구성 및 어셈블할 개체에 대한 지침을 얻습니다. 구성 메타데이터는 XML, Java 주석 또는 Java 코드로 표시됩니다. 이를 통해 응용 프로그램을 구성하는 개체와 이러한 개체 간의 풍부한 상호 종속성을 표현할 수 있습니다.ApplicationContext
인터페이스의 여러 구현이 Spring과 함께 제공됩니다. 독립 실행형 응용 프로그램에서는 ClassPathXmlApplicationContext
또는 FileSystemXmlApplicationContext
의 인스턴스를 만드는 것이 일반적입니다.ApplicationContext
가 생성되고 초기화된 후 완전히 구성되고 실행 가능한 시스템 또는 애플리케이션을 갖게 됩니다.<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
BeanDefinition
객체로 표시됩니다.id
속성, name
속성 또는 둘 다를 사용하여 빈 식별자를 지정합니다.id
속성을 사용하면 정확히 하나의 id를 지정할 수 있습니다. 일반적으로 이러한 이름은 영어나 숫자('myBean', 'someService' 등)이지만 특수 문자도 포함할 수 있습니다.name
속성에 지정할 수도 있습니다.Bean Naming Conventions
빈 이름은 소문자로 시작하고 카멜 케이스 표기법을 사용합니다. 이러한 이름의 예로는 accountManager, accountService, userDao, loginController 등이 있습니다.
<bean id="exampleBean" class="examples.ExampleBean"/>
<bean name="anotherExample" class="examples.ExampleBeanTwo"/>
factory-method
라는 속성을 사용하여 팩토리 메소드 자체의 이름을 지정하십시오.factory-method
를 지정하는 방법을 보여줍니다. 이 예에서 createInstance()
메서드는 정적 메서드여야 합니다.<bean id="clientService"
class="examples.ClientService"
factory-method="createInstance"/>
public class ClientService {
private static ClientService clientService = new ClientService();
private ClientService() {}
public static ClientService createInstance() {
return clientService;
}
}
class
속성을 비워두고 factory-bean
속성에서 객체를 생성하기 위해 호출될 인스턴스 메소드를 포함하는 현재(또는 상위 또는 상위) 컨테이너의 빈 이름을 지정하십시오.factory-method
속성으로 팩토리 메서드 자체의 이름을 설정합니다. <!-- the factory bean, which contains a method called createInstance() -->
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
<!-- inject any dependencies required by this locator bean -->
</bean>
<!-- the bean to be created via the factory bean -->
<bean id="clientService"
factory-bean="serviceLocator"
factory-method="createClientServiceInstance"/>
public class DefaultServiceLocator {
private static ClientService clientService = new ClientServiceImpl();
public ClientService createClientServiceInstance() {
return clientService;
}
}
BeanFactory.getType
호출입니다.public class SimpleMovieLister {
// the SimpleMovieLister has a dependency on a MovieFinder
private final MovieFinder movieFinder;
// a constructor so that the Spring container can inject a MovieFinder
public SimpleMovieLister(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// business logic that actually uses the injected MovieFinder is omitted...
}
public class SimpleMovieLister {
// the SimpleMovieLister has a dependency on the MovieFinder
private MovieFinder movieFinder;
// a setter method so that the Spring container can inject a MovieFinder
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// business logic that actually uses the injected MovieFinder is omitted...
}
ApplicationContext
는 모든 빈을 설명하는 구성 메타데이터로 생성되고 초기화됩니다. 구성 메타데이터는 XML, Java 코드 또는 주석으로 지정할 수 있습니다.ApplicationContext
를 사용하는 경우에만 사용할 수 있습니다.Scope | Description |
---|---|
singleton | (Default) 각 Spring IoC 컨테이너에 대한 단일 객체 인스턴스에 대한 단일 bean definition의 범위를 지정합니다. |
prototype | 단일 bean definition의 범위를 임의의 수의 개체 인스턴스로 지정합니다. |
request | 단일 bean definition의 범위를 단일 HTTP 요청의 수명 주기로 지정합니다. 즉, 각 HTTP 요청에는 단일 bean definition의 뒤에서 생성된 빈의 고유한 인스턴스가 있습니다. web-aware Spring ApplicationContext의 컨텍스트에서만 유효합니다. |
session | 단일 bean definition의 범위를 HTTP Session의 수명 주기로 지정합니다. web-aware Spring ApplicationContext의 컨텍스트에서만 유효합니다. |
application | 단일 bean definition의 범위를 ServletContext의 수명 주기로 지정합니다. web-aware Spring ApplicationContext의 컨텍스트에서만 유효합니다. |
websocket | 단일 bean definition의 범위를 WebSocket의 수명 주기로 지정합니다. web-aware Spring ApplicationContext의 컨텍스트에서만 유효합니다. |
@Required
어노테이션은 다음 예제와 같이 빈 속성 setter 메서드에 적용됩니다.
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Required
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// ...
}
NullPointerException
등을 방지하여 명시적인 실패를 허용합니다.다음 예제와 같이 @Autowired
어노테이션을 생성자에 적용할 수 있습니다.
public class MovieRecommender {
private final CustomerPreferenceDao customerPreferenceDao;
@Autowired
public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {
this.customerPreferenceDao = customerPreferenceDao;
}
// ...
}
@Autowired
어노테이션은 더 이상 필요하지 않습니다.@Autowired
어노테이션을 달아야 합니다.@Primary
어노테이션을 사용하는 것입니다.@Primary
는 단일값 종속성에 autowiring 될 후보로 여러 빈이 존재할 경우 우선순위를 부여해야 함을 나타냅니다.@Configuration
public class MovieConfiguration {
@Bean
@Primary
public MovieCatalog firstMovieCatalog() { ... }
@Bean
public MovieCatalog secondMovieCatalog() { ... }
// ...
}
public class MovieRecommender {
@Autowired
private MovieCatalog movieCatalog;
// ...
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean class="example.SimpleMovieCatalog" primary="true">
<!-- inject any dependencies required by this bean -->
</bean>
<bean class="example.SimpleMovieCatalog">
<!-- inject any dependencies required by this bean -->
</bean>
<bean id="movieRecommender" class="example.MovieRecommender"/>
</beans>
MovieRecommender
가 firstMovieCatalog
와 autowired 됩니다.
@Qualifier
어노테이션을 사용할 수 있습니다.public class MovieRecommender {
@Autowired
@Qualifier("main")
private MovieCatalog movieCatalog;
// ...
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean class="example.SimpleMovieCatalog">
<qualifier value="main"/>
<!-- inject any dependencies required by this bean -->
</bean>
<bean class="example.SimpleMovieCatalog">
<qualifier value="action"/>
<!-- inject any dependencies required by this bean -->
</bean>
<bean id="movieRecommender" class="example.MovieRecommender"/>
</beans>
@Resource
어노테이션(javax.annotation.Resource
)을 사용한 injection도 지원합니다.@Resource
는 name
속성을 사용합니다. 기본적으로 Spring은 해당 값을 주입할 빈 이름으로 해석합니다.public class SimpleMovieLister {
private MovieFinder movieFinder;
@Resource(name="myMovieFinder")
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
}
이름을 명시적으로 지정하지 않으면 기본 이름은 필드 이름 또는 setter 메서드에서 파생됩니다.
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Resource
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
}
@Value
는 일반적으로 외부 속성을 주입하는 데 사용됩니다.@Component
public class MovieRecommender {
private final String catalog;
public MovieRecommender(@Value("${catalog.name}") String catalog) {
this.catalog = catalog;
}
}
@PostConstruct
@PostConstruct
어노테이션을 설정한 init 메소드는 WAS가 띄워질 때 실행됩니다.@PreDestroy
public class CachingMovieLister {
@PostConstruct
public void populateMovieCache() {
// populates the movie cache upon initialization...
}
@PreDestroy
public void clearMovieCache() {
// clears the movie cache upon destruction...
}
}
@Component
), AspectJ 유형 표현식 또는 고유한 사용자 정의 필터 기준을 사용하여 컨테이너에 등록된 bean 정의가 있는 클래스를 선택할 수 있습니다.@Repository
주석은 리포지토리(데이터 액세스 개체 또는 DAO라고도 함)의 역할 또는 스테레오타입을 수행하는 모든 클래스에 대한 마커입니다.@Component
, @Service
및 @Controller
와 같은 추가 스테레오타입 주석을 제공합니다.@Component
는 모든 Spring 관리 구성 요소에 대한 일반 스테레오타입입니다.@Repository
, @Service
및 @Controller
는 보다 구체적인 사용 사례를 위한 @Component
의 전문화입니다(각각 지속성, 서비스 및 프레젠테이션 계층에서).@Component
로 구성 요소 클래스에 주석을 달 수 있지만 대신 @Repository
, @Service
또는 @Controller
로 주석을 추가하면 클래스가 도구로 처리하거나 측면과 연결하는 데 더 적합합니다.