AnnotationConfigApplicationContext , JavaConfig, Component Scan

지환·2023년 9월 12일

Spring

목록 보기
2/7
post-thumbnail

출처 | https://www.youtube.com/watch?v=L_-OoZ6YoT0&list=PLHpaQi-LiUCxVX_GuPu42vdAbcBz8Bvdc&index=4

AnnotationConfigApplicationContext

  • Spring 3.0부터 등장
  • Annotation 기반 (Java Config, Component Scan)
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();
    }

MyUtil

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()");
    }
}

SpringApplicationExam2

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();



    }
}

ApplicationConfig

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();
//    }


}

MyService


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();
    }
}

MyDao

package com.example.spring01.component;

import org.w3c.dom.ls.LSOutput;

public class MyDao {
    public void get()
    {
        System.out.println("MyDao.get()");
    }
}
profile
아는만큼보인다.

0개의 댓글