IoC
: 스프링 컨테이너가 자바 객체를 생성 및 관리
객체 제어의 권한이 스프링에게 있어 제어의 역전(=역제어)
싱글톤 형태로 스프링 컨테이너에서 관리
* 스프링 컨테이너(IoC 컨테이너) = ApplicationContext
1) 스프링 컨테이너는 @Configuration이 붙은 클래스를 설정정보르 토대로 @Bean이 적힌 메소드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다.
2) 스프링 컨테이너에 등록된 객체를 Spring Bean이라고 함
3) 스프링 컨테이너는 다양한 형식의 설정정보를 받아드릴 수 있게 유연하게 설계됨(자바코드,XML,Grovy 등)
4) BeanDefinition이라는 인터페이스가 빈 설정 메타정보 기반으로 스프링 빈을 생성하며 스프링 컨테이너는 여기에 의존한다.
XML방식 출처 :
https://chori84.tistory.com/14#recentComments
* 스프링과 싱글톤
모든 의존성 객체를 스프링이 실행될 때 다 만들어주고 필요한 곳에 주입시켜줌으로 Bean들이 생성되며 싱글톤 패턴의 특징을 가지며 개발자가 컨트롤이 하는 것이 아닌 스프링에게 맡긴다.
예제
@Component
public class Base64Encoder implements IEncode{
/*
* 받은 메세지를 Base64 인코딩해서 그값을 String으로 리턴
*/
public String encode(String message){
return Base64.getEncoder().encodeToString(message.getBytes());
}
}
@Component("UrlEncoder")
public class UrlEncoder implements IEncode{
/*
* 받은 메세지를 Url 인코딩해서 그값을 String으로 리턴
*/
public String encode(String message){
try {
return URLEncoder.encode(message,"UTF-8"); // 인코딩 방식
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
}
public class Encode {
// 외부에서 iencode에 주입하였기 때문에 의존성 주입이라 불림
// 객체를 가지고 있음
private IEncode iencode;
// public Encode(){
// // DI적용 후에는 코드를 건들이지 않고 재사용
// // this.iecode = new Base64Encoder();
// //this.iencode = new UrlEncoder();
// }
// DI 적용
// 생성자에서 외부에서 주입할 객체를 추상화하여 받는다
public Encode(@Qualifier("UrlEncoder") IEncode iencode){
this.iencode = iencode;
}
public void setIEncode(IEncode iencode){
this.iencode = iencode;
}
public String encode(String message){
return iencode.encode(message);
}
}
@Component
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext context;
/*
* ApplicationContext
* :
*/
// 스프링에서 ApplicationContexts 주입
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
public static ApplicationContext getApplicationContext(){
return context;
}
}
* ApplicationContextAware는 setApplciationConext()를 가지는 인터페이스이다.
스프링 IoC 컨테이너 클래스 및 Spring에서 사용하는 어노테이션
@SpringBootApplication
public class DiiocApplication {
/*
* @SpringBootApplication
* : 메인 메소드가 선언된 클래스에 선언되는 어노테이션
* 스프링 부트의 기본적인 설정
* 해당 어노테이션 안에 @SpringBootConfiguration, @EnableAutoConfiguration 선언
* 주요 기능 어노테이션 : @SpringBootApplication = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan
*/
/*
* @ComponentScan
* : @Component 어노테이션 및 @Service, @Repository, @Controller
* 등의 어노테이션을 스캔하여 Bean으로 등록 (= 개발자 지정)
*/
/*
* @EnableAutoConfiguration
* : 사전에 정의한 라이브러리들을 Bean으로 등록(= 라이브러리의 클래스로 자동 지정)
* ex) Denpedencies에 적용된 spring-boot-autoconfigure /spring.factories에 별도로 정의된 객체
*/
/*
* @SpringBootConfiguration
* : 자바 설정파일임을 마킹하는 어노테이션
* ex) @Configuration
*/
/*ㅌ
/*
* @Qualifier
* : 특정한 객체에 이름 지정하여 Bean 등록시 싱글톤 방식의 단점인 다형성 가능하게 만듬
*/
public static void main(String[] args) {
SpringApplication.run(DiiocApplication.class, args);
//
ApplicationContext context = ApplicationContextProvider.getApplicationContext();
System.out.println("Bean Count : "+context.getBeanDefinitionCount());
System.out.println("Bean length : "+context.getBeanDefinitionNames().length);
for(String beanName : context.getBeanDefinitionNames()){
System.out.println("beanName : " + beanName +
"\n" + "className : " + context.getBean(beanName).getClass().getName());
}
String url = "www.naver.com/books/it?page=10&size=20";
/* Base64Encoder base64Encoder = context.getBean(Base64Encoder.class);
UrlEncoder urlEncoder = context.getBean(UrlEncoder.class);
Encode encode = new Encode(base64Encoder);
String result = encode.encode(url);
System.out.println("url base64 : "+result);
System.out.println("=====================");
encode.setIEncode(urlEncoder);
result = encode.encode(url);
System.out.println("url url: "+result);
Encode encodeQual = context.getBean(Encode.class);
result = encodeQual.encode(url);
System.out.println("url Qual: "+result);*/
Encode encodeBase = context.getBean("Base",Encode.class);
String resultBase = encodeBase.encode(url);
System.out.println("url Base: "+resultBase);
}
}
@Configuration
class AppConfig{
@Bean("Base")
public Encode encode(Base64Encoder base64Encoder){
return new Encode(base64Encoder);
}
@Bean("Url")
public Encode encode(UrlEncoder urlEncoder){
return new Encode(urlEncoder);
}
}
'Spring > 1-1. DI,IOC,Bean' 카테고리의 다른 글
DI(Dependency Injection)의존성 주입 (0) | 2022.09.09 |
---|