@Configuration
@Bean 메서드가 하나 이상 선언함을 나타냅니다. Spring 컨테이너에서 처리하여 Bean 정의를 생성합니다. @Configuration을 선언하므로서 Java 설정 파일을 만든다는 것을 의미합니다.
@Configuration
public class GamingConfiguation {
// Spring Bean(Spring에서 관리하는 것들을 의미) 정의 가능
@Bean
public GamingConsole game() {
var game = new PacmanGame();
return game;
}
@Bean
public GameRunner gameRunner(GamingConsole game) {
return new GameRunner(game);
}
}
Java 설정 파일에서는 메서드를 몇개든 정의 할 수 있고 이러한 메서드에 @Bean 어노테이션을 추가할 수 있습니다. 그러면 메서드로 반환되는 모든 값에 Spring이 Bean을 자동으로 생성합니다.
@ComponentScan
컴포넌트를 스캔할 특정 패키지를 ComponentScan을 통해서 정의합니다. 스캔할 패키지를 지정하거나 @ComponentScan을 넣기만 하면 되고 패키지를 지정안하면 현재 패키지만 스캔됩니다. 또한, 현재 패키지 뿐만아니라 하위 패키지까지 스캔을 하게됩니다.
@Configuration
@ComponentScan
public class TestContextLuncherApplication {
public static void main(String[] args) {
try (var context =
new AnnotationConfigApplicationContext
(TestContextLuncherApplication.class))
{
Arrays.stream(context.getBeanDefinitionNames())
.forEach(System.out::println);
}
}
}
@Component
어노테이션한 클래스가 컴포넌트임을 나타냅니다. @Component 클래스가 @ComponentScan에 속하면 Spring Bean이 생성됩니다.
@Component
public class PacmanGame implements GamingConsole {
@Override
public void up() {
System.out.println("위로 이동");
}
@Override
public void down() {
System.out.println("아래로 이동");
}
@Override
public void left() {
System.out.println("왼쪽으로 이동");
}
@Override
public void right() {
System.out.println("오른쪽으로 이동");
}
}
@Service
@Service 어노테이션한 클래스에 비지니스 로직이 있음을 나타내는 @Component의 한 종류입니다.
@Service
public class BussinessService {
// 비지니스 로직 ...
}
@Controller
@Controller 어노테이션한 클래스가 컨트롤러임을 나타내는 @Component로 웹컨트롤러를 예로 들 수 있습니다. 일반적으로 웹 애플리케이션과 REST API에서 컨트롤러를 정의하는 데 사용이 됩니다.
@Controller
public class ControllerClass {
// 컨트롤러 내용...
}
@Repository
@Repository 어노테이션한 클래스가 DB에서 데이터를 검색, 조작하는데 사용됩니다.
@Repository
public class MySqlDbDataService implements DataService {
// DB 검색, 조작
}
@Primary
여러 Bean이 단일 값 의존성이 자동 연결될 후보일 때 특정 Bean에 우선 순위를 부여해야 함을 나타냅니다.
@Component
@Primary
public class PrimaryComponent {
// 내용
}
@Qualifier
자동 연결 시 후보 Bean의 한정자 필드나 매개 변수에 사용됩니다.
@Component
@Qualifier("TestQualifier")
public class TestQualifierClass {
// 내용
}
사용 시 아래와 같이 사용합니다.
@Component
public class UseQualifier {
private TestQualifierClass test;
public TestQualifierClass (@Qualifier("TestQualifier") TestQualifierClass test) {
this.test = test;
}
}
@Primary는 일반적인 우선 순위를 정할 때 사용하고, @Qualifier는 아주 구체적이며 딱 이것만 사용하려고 할 때 @Qualifier를 사용합니다.
@Lazy
Spring Bean은 일반적으로 컨텍스트가 실행되는 대로 즉시 초기화됩니다. 하지만 Bean을 지연 초기화 하려고 한다면 @Lazy 어노테이션을 사용하면 됩니다.
@Component
@Lazy
class LazyClass {
// 내용
}
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
기본 값은 싱글톤으로 해당 빈을 몇번을 참조하더라도 같은 인스턴스가 실행됩니다. 하지만 프로토타입 스코프를 특정 컴포넌트에 정의하게 되면 해당 Bean을 참조할 때마다 인스턴스가 새로 만들어 집니다.
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Component
class PrototypeClass {
// 내용
}
@PostConstruct
의존성이 주입이 수행된 이후 초기화를 위해 실행될 메서드를 나타냅니다. 모든 의존성을 Bean에 주입 후 초기화 하려는 경우, 모든 의존성이 준비된 이후 DB에서 몇가지 값을 가져오는 경우에 사용됩니다.
@Component
class SomeClass {
@PostConstruct
public void initialize() {
someDependency.getReady();
}
}
@PreDestroy
컨테이너에서 인스턴스를 삭제하는 과정을 거치고 있음을 알려주는 콜백 알림을 수신하는 메서드를 나타냅니다. 보통 특정 Bean이 보유하고 있는 리소스를 해제하는 경우 사용이 됩니다. 컨테이너나 Spring IoC 컨텍스트에서 Bean이 삭제되기 전에 @PreDestroy 어노테이션이 붙은 메서드를 호출합니다.
@Component
class SomeClass {
@PreDestroy
public void cleanup() {
// 데이터 베이스 등에 연결 될 경우 종료를 위한 메소드
System.out.println("Clean up!");
}
}
@Named
CDI 어노테이션이며 @Component와 비슷합니다.
@Named
class NamedTestClass {
// 내용
}
@Inject
@AutoWired와 비슷합니다.
@Named
class InjectTestClass {
private DataService dataService;
@Inject
public void setDataService(DataService dataService) {
System.out.println("Setter Injection");
this.dataService = dataService;
}
}
'코딩 공부 > web & Java' 카테고리의 다른 글
[Spring] JPA (0) | 2023.10.17 |
---|---|
[Spring] SpringBoot Auto Configuration (0) | 2023.10.12 |
[Spring] 스테레오 타입 어노테이션 (0) | 2023.10.09 |
[Spring] Spring XML 설정 (1) | 2023.10.09 |
[Spring] Jakarta Contexts and Dependency injection (CDI) (1) | 2023.10.06 |