๋น ์ด๋?
- ์คํ๋ง IoC ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌ ํ๋ ๊ฐ์ฒด
- ์คํ๋ง IoC ์ปจํ ์ด๋๋? BeanFactory ๋ฅผ ํ์ฅํ๋ ApplicationContext๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค.
- ์ปจํ ์ด๋๊ฐ ํ๋ ์ผ : ๋น ์ค์ ์์ค๋ก ๋ถํฐ ๋น ์ ์๋ฅผ ์ฝ์ด๋ค์ด๊ณ , ๋น์ ๊ตฌ์ฑํ๊ณ ์ ๊ณตํ๋ค.
- ( ๋น ์ธ์คํด์ค ์์ฑ, ์์กด ๊ด๊ณ ์ค์ , ๋น ์ ๊ณต)
- ์ฅ์
1. ์์กด์ฑ ๊ด๋ฆฌ
2. ์ค์ฝํ
- ์ฑ๊ธํค (๊ธฐ๋ณธ๊ฐ) : ํ๋์ ๊ฐ์ฒด๋ง ์ฌ์ฉ -> ๋น ๋ฅธ ์ฑ๋ฅ
- ํ๋กํ ํ์ : ๋งค๋ฒ ๋ค๋ฅธ ๊ฐ์ฒด
3. ๋ผ์ดํ์ฌ์ดํด ์ธํฐํ์ด์ค
- ๋น ๋ฑ๋ก ํ๋ ๋ฐฉ๋ฒ ๋๊ฐ์ง
1. ๊ณ ์ ์ ์ธ ๋ฐฉ์์ ๋น ๋ฑ๋ก ๋ฐฉ๋ฒ - ApplicationContext (XML)
<Application.xml>
<?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="bookService"
class="com.example.sspringaplicationcontext.BookService">
<property name="bookRepository" ref="bookRepository"/>
</bean>
<!--property name="setter์ ์ด๋ฆ" ref="์ฐธ์กฐํ ๋น์ id"
์ฃผ์ ๋จ์ถํค!
1. ์ค ๋จ์ : ctrl + /
2. ๋ธ๋ญ ๋จ์ : ctrl + shift +
aa-->
<bean id="bookRepository"
class="com.example.sspringaplicationcontext.BookRepository">
</bean>
</beans>
๋จ์ : ์ผ์ผํ ํ๋ํ๋ ๋น์ ๋ฑ๋กํด์ผ ํ๋ค๋ ๋ถํธํจ์ด ์๋ค.
2. ์ด๋ ธํ ์ด์ ์ ์ด์ฉํ ๋น ๋ฑ๋ก ๋ฐฉ๋ฒ ( Java )
<BookService.class>
package com.example.sspringaplicationcontext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service /*Component๋ฅผ ํ์ฅํ ๋น์ผ๋ก ๋ฑ๋ก๊ฐ๋ฅํ annotation*/
public class BookService {
@Autowired /*์์กด์ฑ ์ฃผ์
์ ์ํ annotation*/
BookRepository bookRepository;
public void setBookRepository(BookRepository bookRepository){
this.bookRepository = bookRepository;
}
}
๋น ์ค์ Annotation
@Component
- @Repository
- @Service
- @Controller
์๋ฐ ๋น ์ค์ ํ์ผ - - ApplicationContext (Java)
<Application.class>
package com.example.sspringaplicationcontext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.awt.print.Book;
@Configuration //์ด๊ฒ์ ๋น ์ค์ ํ์ผ ์ด๋ค~ ํ์ํ๊ธฐ ์ํด @Configuration์ ๋ฑ๋กํด์ค๋ค.
public class ApplicationConfig {
//๋น ๋ฑ๋ก
@Bean
public BookRepository bookRepository(){
return new BookRepository();
}
@Bean
public BookService bookService(){
BookService bookService = new BookService();
bookService.setBookRepository(bookRepository()); //์์กด์ฑ ์ฃผ์
์ง์ ํด์ฃผ๊ธฐ
return bookService;
}
}
์ด๋ ๊ฒ ์๋ฐ๋ก ๋ง๋ ํ์ผ์ ์ด๋ป๊ฒ ApplicationContext๋ก ์ฌ์ฉํ๋๊ฐ?
ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
<DemoApplication.class>
package com.example.sspringaplicationcontext;
import javafx.application.Application;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Arrays;
public class DemoApplication {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
String[] beanDefinitionNames = context.getBeanDefinitionNames();
System.out.println(Arrays.toString(beanDefinitionNames));
BookService bookService = (BookService) context.getBean("bookService");
System.out.println(bookService.bookRepository != null);
}
}
์๋ฐ ๋น ์ค์ ํ์ผ์์ ์์กด์ฑ์ ์ง์ ์ฃผ์ ํด์ค๋ ๋๊ณ , ์๋๋ฉด @Autowired๋ฅผ ์ฌ์ฉํด๋ ๋๋ค.
์์กด์ฑ ์ฃผ์ : @Autowired
<Application.class>
package com.example.sspringaplicationcontext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.awt.print.Book;
@Configuration //์ด๊ฒ์ ๋น ์ค์ ํ์ผ ์ด๋ค~ ํ์ํ๊ธฐ ์ํด @Configuration์ ๋ฑ๋กํด์ค๋ค.
public class ApplicationConfig {
//๋น ๋ฑ๋ก
@Bean
public BookRepository bookRepository(){
return new BookRepository();
}
@Bean
public BookService bookService(){
//์ง์ ์ฃผ์
ํด์ค ๋ถ๋ถ ์ญ์ ํ๊ณ !
//BookService bookService = new BookService();
//bookService.setBookRepository(bookRepository());
return bookService;
}
}
package com.example.sspringaplicationcontext;
import org.springframework.beans.factory.annotation.Autowired;
public class BookService {
@Autowired //์ด๋ ๊ฒ ํด์ค๋ ์์กด์ฑ์ด ์๋์ผ๋ก ์ฃผ์
์ด ๋๋ค.
BookRepository bookRepository;
public void setBookRepository(BookRepository bookRepository){
this.bookRepository = bookRepository;
}
}
์๋ ์ฌ์ง์ผ๋ก ์๋์ผ๋ก ์์กด์ฑ์ด ์ฃผ์ ์ด ๋๊ฑธ ํ์ธ ํ ์ ์๋ค.
์ปดํฌ๋ํธ ์ค์บ ์ค์
1. XML ์ค์
<Application.xml>
<?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">
<context:component-scan base-package="com.example.sspringaplicationcontext"/>
<!-- "com.example.sspringaplicationcontext" ์ด ํจํค์ง๋ก ๋ถํฐ ๋น์ ์ค์บ๋์ ํด์ ๋น์ผ๋ก ๋ฑ๋กํ๊ฒ ๋ค. -->
</beans>
ํจํค์ง ์ดํ๋ก ๋ถํฐ ์ด๋ ธํ ์ด์ ์ ์ค์บ๋ํด์ ๋น์ผ๋ก ๋ฑ๋ก์ ํด์ฃผ๋ ๊ฒ์ด๋ค.
2. ์๋ฐ ์ค์
<ApplicationConfig.class>
@Configuration
@ComponentScan(basePackageClasses = DemoApplication.class)
//ํด๋์ค๊ฐ ์์นํ๊ณณ์ผ๋ก ๋ถํฐ ์ปดํฌ๋ํธ ์ค์บ๋์ ํด๋ผ.
//(๋ชจ๋ ํด๋์ค์ ๋ถ์ด์๋ ์ด๋
ธํ
์ด์
์ ์ฐพ์์ ๋น์ผ๋ก ๋ฑ๋ก์ํด๋ผ.
public class ApplicationConfig {
}
์ด์ ๋น์ ์ผ์ผํ ๋ฑ๋กํ๊ธฐ ๊ท์ฐฎ๋ค. ์๋์ผ๋ก ๋ฑ๋กํด์ฃผ๋ @ComponentScan ์ ์ฌ์ฉํด๋ผ.