Spring : DI

지환·2023년 12월 19일

Spring

목록 보기
5/7
post-thumbnail

[TestController]


public class TestController {
    Logger logger = LoggerFactory.getLogger(TestController.class);
    //@Autowired
    TestLogic testLogic = null;
    //setter객체 주입법 코드이다
    public void setTestLogic(TestLogic testLogic){
        this.testLogic = testLogic;
    }
    public String testList(){
        System.out.println("TestController testList()호출");
        List<Map<String,Object>> list = null;
        list = testLogic.testList();
        logger.info("list : "+list.toString());
        return "OK";
    }
}
  • ApplicationContext가 @Autowired를 만나면 먼저 로딩시킨다.(Configuration & Bean)

    • ApplicationContext는 이렇게 등록된 빈을 관리해준다.
    • xml문서 대신 자바 클래스를 통해서 필요한 객체를 미리 등록해준다.
    • 이렇게 진행한다면 클래스를 통해서 필요한 객체를 미리 등록해준다.
    • 추가적으로 싱글톤으로 미리 로딩된다.
  • BeanFactory : getBean()이 호출되기 전까지 로딩되지 않는다.


예시

[duckInfo.txt]

rubber=com.example.demo.di.RubberDuck
wood=com.example.demo.di.WoodDuck

이 파일을 실행해보자.

[DuckMain ]


public class DuckMain {

    public static void main(String[] args) {
        //고무오리 타입이 호출되도록 해보시오.
        Duck duck = Duck.getDuck(1);
        if(duck instanceof RubberDuck){
            System.out.println("RubberDuck");
        }
        Duck duck2 = Duck.getDuck(1.0);
        if(duck2 instanceof WoodDuck){
            System.out.println("WoodDuck");
        }
    }
}

[Duck]

public abstract class Duck {
	FlyBehavior flyBehavior = null;
	QuackBehavior quackBehavior = null;

	public Duck() {
	}

    static Duck getDuck(int i){//객체를 제공하는 쪽
        //메소드로 객체를 제공하는 쪽이 변경할 코드가 적다!!!
        return new RubberDuck();
    }
    static Duck getDuck(double d){//객체를 제공하는 쪽
        return new WoodDuck();
    }
    @SuppressWarnings("deprecation")
    static Object getObject(String key) throws Exception{
        Properties p = new Properties();
        //duckInfo.txt를 읽어서 Properties저장함
        p.load(new FileReader("duckInfo.txt"));
        // Class는 클래스 설계도를 얻어내는 클래스
        Class<?> clazz = Class.forName(p.getProperty(key));//rubber, wood
        return clazz.newInstance();
    }	
}

1.rubber=com.example.demo.di.RubberDuck

2.wood=com.example.demo.di.WoodDuck

  • static Duck getDuck을 통해서 이미 메모리에 로딩 되어있었다.(이른 인스턴스화)

Test 버전

[TestController]

public class TestController {
    Logger logger = LoggerFactory.getLogger(TestController.class);
    //@Autowired
    TestLogic testLogic = null;
    //setter객체 주입법 코드이다
    public void setTestLogic(TestLogic testLogic){
        this.testLogic = testLogic;
    }
    public String testList(){
        System.out.println("TestController testList()호출");
        List<Map<String,Object>> list = null;
        list = testLogic.testList();
        logger.info("list : "+list.toString());
        return "OK";
    }
}

[TestLogic]

public class TestLogic {
    Logger logger = LoggerFactory.getLogger(TestLogic.class);
    TestDao testDao = null;

    public void setTestDao(TestDao testDao) {
        this.testDao = testDao;
    }

    public List<Map<String, Object>> testList() {
        System.out.println("TestLogic testList()호출");
        List<Map<String, Object>> list = new ArrayList<>();
        list = testDao.testList();
        return list;
    }

}

[TestDao]

public class TestDao {
    Logger logger = LoggerFactory.getLogger(TestDao.class);

    public List<Map<String, Object>> testList() {
        System.out.println("TestDao testList()호출");
        return new ArrayList<>();
    }
}

공통적인 특징을 볼 수 있다.

TestController 클래스에서 testLogic을 쓰고 싶다면?

  • 전역변수에 TestLogic testLogic = null

  • Setter 메소드 호출

 TestLogic testLogic = null;
 
  public void setTestLogic(TestLogic testLogic){
        this.testLogic = testLogic;
    }
  • 이 부분에서 객체주입이 발생하고 객체주입을 받으면, TestLogic.메소드() 사용가능

profile
아는만큼보인다.

0개의 댓글