[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)
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

[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;
}
