1. resources/application.xml 작성
매우 원시적인 방법으로 Bean으로 등록할 클래스를 작성한 후에,
다음과 같이 application.xml에서 Bean으로 등록함.
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 빈을 등록하는 예시 -->
<bean id="userService" class="com.example.UserService">
<!-- 빈에 프로퍼티 설정 예시 (옵션) -->
<property name="userRepository" ref="userRepository"/>
</bean>
<bean id="userRepository" class="com.example.UserRepository"/>
</beans>
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
// 스프링 컨테이너를 생성하고 XML 설정 파일을 로드합니다.
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
// 등록된 Bean을 가져옵니다.
// @Autowired 가 없으니 이런 방식으로 주입해야 함.
UserService userService = context.getBean(UserService.class);
// UserService의 메서드를 호출합니다.
String message = userService.sayHello("John");
System.out.println(message);
}
}
2. resources/application.xml, component-scan
1번과 다르게 Java Annotation을 이용해서 자바 코드 내에서 Bean 정의.
대신 어떤 Root Directory에서 부터 Bean Component를 찾을지에 대한 내용을
application.xml에서 정의해야 함.
정의한 경로를 기준으로 하위 디렉토리의 클래스 중 @Component가 붙어있는 클래스를 Bean으로 등록.
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 여기서 Component Scan 위치를 정의 -->
<context:component-scan base-package="com.example.project" />
</beans>
// BookRepository.java
package com.example.project.repository;
import org.springframework.stereotype.Repository;
@Repository
public class BookRepository {
}
// BookService.java
package com.example.project.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class BookService {
@Autowired
BookRepository bookRepository;
public void setBookRepository(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
}
3. Java Config 작성.
1번 방법의 Java 코드 버전이라고 생각하면 된다.
Config 클래스에서 각 Bean으로 등록할 클래스들을 생성하고
해당 Config 클래스를 AnnotationConfigApplicationContext에 등록함.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ApplicationConfig {
@Bean
public BookRepository bookRepository() {
return new BookRepository();
}
@Bean
public BookService bookService(BookRepository bookRepository) {
BookService bookService = new BookService();
// 의존성 주입 setter 이용
bookService.setBookRepository(bookRepository);
return bookService;
}
}
public class DemoApplication {
public static void main(String[] args) {
// 직접 ApplicationConfig.java 클래스를 등록함.
ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
}
}
4. Java Config, ComponentScan
2번 방법의 Java 코드 버전이라고 생각하면 된다.
어떤 Root Directory에서 부터 Bean Component를 찾을지에 대한 내용을
@ComponentScan 속성을 이용해서 정의함.
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackageClasses = SpringApplication.class) // 최상단 메인 클래스
public class ApplicationConfig {
}
5. Spring Boot
4번 방식을 미리 세팅한 Annotation을 이용.
@SpringBootApplication 자체가 @ComponentScan 어노테이션을 내포하고 있기 때문에 해당 어노테이션을 기준으로 하위 디렉토리의 @Compoent 가 붙은 클래스를 모두 @Bean으로 등록한다.
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
'Spring Boot' 카테고리의 다른 글
SpEL - Spring Expression Language (0) | 2023.07.29 |
---|---|
Spring Boot AOP (0) | 2023.07.29 |
Spring Logging System (0) | 2023.07.29 |
Spring Boot 외부 설정법 (0) | 2023.07.28 |
Spring Boot HTTP2 적용 (0) | 2023.07.28 |