
출처 | https://www.youtube.com/watch?v=L_-OoZ6YoT0&list=PLHpaQi-LiUCxVX_GuPu42vdAbcBz8Bvdc&index=4
org.springframework.context.annotation
Class AnnotationConfigApplicationContext
예제
package com.example.spring01;
import Exam.Book;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class SpringApplicationContextExam3 {
public static void main(String[] args) {
// AnnotationConfigApplicationContext생성자에는 base package가 들어간다.
// 패키지를 설정하면 밑에 패키지를 전부 읽어들인다. -> @Configuration를 찾은 뒤 인스턴스 생성
ApplicationContext context = new AnnotationConfigApplicationContext("com.example.spring01");
Book book1 = context.getBean("Book1", Book.class);
book1.setTitle("즐거운 spring boot");
book1.setPrice(5000);
System.out.println(book1.getTitle());
System.out.println(book1.getPrice());
// 기본적으로 Bean을 싱글턴으로 관리한다.
Book book11 = context.getBean("book1", Book.class);
System.out.println(book11.getTitle());
System.out.println(book11.getPrice());
}
}
config[패키지]--> ApplicaionConfig
package com.example.spring01.config;
import Exam.Book;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
// Java Config설정을 AnnotationConfigApplicationContext 읽어들인다.
// @Configuration 어노테이션을 붙여야 한다. ApplicationConfig에 대한 인스턴스를 만들어야한다.
@Configuration
public class ApplicationConfig {
public ApplicationConfig() {
System.out.println("ApplicationConfig()");
}
// <bean id = "book1" class="Exam.Book" ></bean>
// 메소드 이름 : id
// 리턴 타입 :
@Bean
public Book book1()
{
return new Book(); // exam.book
}
}



book2 추가한다.
package com.example.spring01;
import Exam.Book;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class SpringApplicationContextExam3 {
public static void main(String[] args) {
// AnnotationConfigApplicationContext생성자에는 base package가 들어간다.
// 패키지를 설정하면 밑에 패키지를 전부 읽어들인다. -> @Configuration를 찾은 뒤 인스턴스 생성
ApplicationContext context = new AnnotationConfigApplicationContext("com.example.spring01");
Book book1 = context.getBean("Book1", Book.class);
book1.setTitle("즐거운 spring boot");
book1.setPrice(5000);
System.out.println(book1.getTitle());
System.out.println(book1.getPrice());
// 기본적으로 Bean을 싱글턴으로 관리한다.
Book book11 = context.getBean("book1", Book.class);
System.out.println(book11.getTitle());
System.out.println(book11.getPrice());
Book book2 = context.getBean("book2", Book.class);
System.out.println(book2.getTitle());
}
}

추가적인 설정 후 ApplicationConfig
package com.example.spring01.config;
import Exam.Book;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
// Java Config설정을 AnnotationConfigApplicationContext 읽어들인다.
// @Configuration 어노테이션을 붙여야 한다. ApplicationConfig에 대한 인스턴스를 만들어야한다.
@Configuration
public class ApplicationConfig {
public ApplicationConfig() {
System.out.println("ApplicationConfig()");
}
// <bean id = "book1" class="Exam.Book" ></bean>
// 메소드 이름 : id
// 리턴 타입 :
@Bean
public Book book1()
{
return new Book(); // exam.book
}
@Bean
public Book book2()
{
Book book = new Book();
book.setTitle("즐거운 자바");
book.setPrice(5000);
return book;
}
}
다시 실행하면 
<property name = "title" value = "즐거운 자바"></property>
<property name = "price" value = "5000"></property>
@Bean
public Book book2()
{
Book book = new Book();
book.setTitle("즐거운 자바");
book.setPrice(5000);
return book;
}
}
같은 의미를 얘기한다.
<bean id = "myDao" class = "com.example.spring01.component.MyDao"></bean>
@Bean
public MyDao myDao()
{
return new MyDao();
}
같은 의미를 얘기한다.
<bean id = "myService" class = "com.example.spring01.component.MyService">
<!-- setMyDao -->
<property name=" myDao" ref = "myDao "></property>
</bean>
@Bean
public MyService myService(MyDao myDao)
{
MyService myService = new MyService();
myService.setMyDao(myDao);
return new MyService();
}
//이렇게 설정하면 이 부분이 아이디 만약에 설정하지 않았으면 메소드 이름이 아아디
@Bean(name = "myService2")
public MyService myService(MyDao myDao)
{
MyService myService = new MyService();
myService.setMyDao(myDao);
return new MyService();
}
package com.example.spring01.component;
import org.springframework.stereotype.Component;
// AnnotationConfigApplicationContext이 @Component를 찾아서 인스턴스를 생성한다.
//Component Scan 방식
// value에 있는 값이 id가 된다.
@Component(value = "myUtil")
public class MyUtil {
public MyUtil() {
System.out.println("Myutil");
}
public void print()
{
System.out.println("Myutil.print()");
}
}
package com.example.spring01;
import com.example.spring01.component.MyDao;
import com.example.spring01.component.MyService;
import com.example.spring01.component.MyUtil;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringApplicationExam2 {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
MyService myService = context.getBean("myService", MyService.class);
MyDao myDao = context.getBean("myDao", MyDao.class);
myService.service();
context.getBean("myDao",MyDao.class);
myDao.get();
context.getBean("myService2", MyService.class);
myService.service();
MyUtil myUtil = context.getBean("myUtil", MyUtil.class);
myUtil.print();
}
}
package com.example.spring01.config;
import Exam.Book;
import com.example.spring01.component.MyDao;
import com.example.spring01.component.MyService;
import com.example.spring01.component.MyUtil;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
// Java Config설정을 AnnotationConfigApplicationContext 읽어들인다.
// @Configuration 어노테이션을 붙여야 한다. ApplicationConfig에 대한 인스턴스를 만들어야한다.
@Configuration
public class ApplicationConfig {
public ApplicationConfig() {
System.out.println("ApplicationConfig()");
}
// <bean id = "book1" class="Exam.Book" ></bean>
// 메소드 이름 : id
// 리턴 타입 :
@Bean
public Book book1()
{
return new Book(); // exam.book
}
@Bean
public Book book2()
{
Book book = new Book();
book.setTitle("즐거운 자바");
book.setPrice(5000);
return book;
}
// <bean id = "myService" class = "com.example.spring01.component.MyService">
// <!-- setMyDao -->
// <property name=" myDao" ref = "myDao "></property>
// </bean>
//이렇게 설정하면 이 부분이 아이디 만약에 설정하지 않았으면 메소드 이름이 아아디
@Bean(name = "myService2")
public MyService myService(MyDao myDao)
{
MyService myService = new MyService();
myService.setMyDao(myDao);
return new MyService();
}
@Bean
public MyDao myDao()
{
return new MyDao();
}
// <bean id = "myDao" class = "com.example.spring01.component.MyDao"></bean> 같은 뜻
// @Bean
// public MyUtil myUtil()
// {
// return new MyUtil();
// }
}
package com.example.spring01.component;
public class MyService extends MyDao{
private MyDao myDao;
// setter 메소드 myDao 프로퍼티라고한다.
public void setMyDao(MyDao myDao) {
this.myDao = myDao;
}
public void service(){
System.out.println("MyService.service()");
// myDao를 주입하지 않았다면 NullPointException이 발생한다.
myDao.get();
}
}
package com.example.spring01.component;
import org.w3c.dom.ls.LSOutput;
public class MyDao {
public void get()
{
System.out.println("MyDao.get()");
}
}