@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
<context:component-scan base-package="com.example.myapp" />
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
<beans>
<bean id="myBean" class="com.example.MyBean"/>
</beans>
@Component
@Component
어노테이션은 클래스를 Spring Bean으로 표시한다. 이 어노테이션이 붙은 클래스는 Spring의 ComponentScan 매커니즘에 의해 자동으로 Bean으로 등록된다.@Configuration
@Configuration
은 해당 클래스가 Bean 정의를 담고 있는 구성 클래스이다. 이 클래스 내에서 @Bean
어노테이션을 사용한 메서드를 정의하여 Bean을 생성하고 구성한다.@Bean
@Bean
어노테이션은 메서드 레벨에서 사용되며, 해당 메서드가 Bean 인스턴스를 생성하고 반환한다는 것을 나타낸다.@Configuration
어노테이션이 붙은 클래스 내부에서 사용@Autowired
는 의존성 주입을 위해 사용된다. Spring이 자동으로 의존성을 주입해야 하는 필드, 생성자 또는 메서드에 표시한다.@Autowired
가 붙은 필드나 메서드, 생성자에 대해 spring 컨테이너는 타입에 맞는 Bean을 자동으로 찾아 주입한다.@Service
public class MyService {
@Autowired
private MyRepository myRepository; // 필드 주입
@Autowired
public MyService(MyRepository myRepository) {
// 생성자 주입
}
}
가장 처음에는 Spring IoC 컨테이너가 만들어지는 과정이 일어난다.
Spring에서 Component Scan으로 Bean등록을 시작하는 과정이다.
위와 같이 Bean으로 등록할 수 있는 어노테이션들과 설정파일들을 읽어서 IoC 컨테이너 안에 Bean으로 등록시킨다.
그리고 의존 관계를 주입하기 전의 준비 단계로 객체의 생성이 일어난다.
생성자 주입이 동시에 일어나는 이유 :
@Controller
public class CocoController {
private final CocoService cocoService;
//생성자 주입
public CocoController(CocoService cocoService) {
this.cocoService = cocoService;
}
}
OR
@Controller
@RequiredArgsConstructor
public class CocoController {
private final CocoService cocoService;
}
controller와 service의 의존관계가 존재하지 않는다면, controller 클래스는 객체 생성이 불가능함.
@PostConstruct
/ @PreDestroy
사용<context:annotation-config></context:annotation-config>
추가InitializingBean
인터페이스의 afterPropertiesSet()
메소드 오버라이드init-method
속성으로 메소드 이름 지정@Bean(init-method="init")
지정@Configuration
class LifeCycleConfig {
@Bean(initMethod = "initialize", destroyMethod = "close")
public ExampleBean exampleBean() {
///
}
}
예시)
public class JwtProvider {
@Value("${jwt.secret.key}")
private String salt;
private Key SECRET_KEY;
@PostConstruct
protected void init(){
SECRET_KEY = Keys.hmacShaKeyFor(salt.getBytes(StandardCharsets.UTF_8));
}
salt값은 @Value 어노테이션을 통해 yml파일에서 주입이 됐고, init()
가 호출되는 시점에는 salt가 이미 주입이 되어 있어야함. 그래서 @PostConstruct
로 주입이 완료된 후에 호출이 되니까, salt를 안전하게 사용해서 초기화할 수 있음
또, @PostConstruct를 사용하면, 개발자는 명시적으로 초기화 메서드를 호출할 필요가 없다.
Bean의 생명주기, 즉 Bean이 생성되고, 존재하며, 파괴되는 범위 결정
@Service
@Scope("prototype")
public class MyPrototypeService {
// ...
}