생성자 or setter 로 DI 가능
객체 만드는 방법 <bean> 태그 이용 id =>변수명, class => 객체의 클래스 이름(패키지까지)
setter는 어떻게? <property> 태그 이용 id가 setter 되야 하니깐 name을 setExam이라고 해야하지만, set을 생략하고 소문자로 -> name="exam" value 와 ref 2가지가 있는데 클래스가 ref형식인지 value인지 따져서 적으면 됨
ApplicationContext context = new classpathxmlApplicationContext ("") -> 객체 만들어주는 new생성자와 같음 classpathxmlApplicationContext -> xml 위치를 class로 알려줄 때
스프링 라이브러리를 가져와야 한다 -> Maven project 이든 gradle 이든으로 바꿔줘야 된다? -> Maven pom파일이 만들어지는데, 그 파일 중간 부분에 직접 <dependencies> 태그 추가해줘야 함 -> ctrl+s 저장해주면 알아서 다양한 라이브러리가 설치되어짐
만약 xml 설명서를 잘 읽었다면 객체 보따리를 만들어줄텐데 이게 바로 IOC( 인버스 어쩌구) 그리고 만든 객체명, 이름(변수)에 관해 (위에 context).getBean("Bean의 이름=변수명") 이름은 나중에 타입을 지정해서 귀찮으니깐 그냥 자료형으로 .getBean(객체 클래스or인터페이스 이름.class)으로 꺼내는 게 편함
생성자를 통한 것 -> xml에 <constructor-arg>태그, 속성은 index(순서) , value(위에 설명한 대로 값 의미함), type(float, int) 같은 것 있음 이게 너무 번거로워서 <bean> 태그안에 xmls:p 라는 것을 사용할 수 있음 구성요소의 namespace에서 p 설정해주면 사용가능 <bean> 태그에 속성으로 p:kor="10" 으로 설정
콜렉션 생성과 목록 DI ArrayList가 대표적인 콜렉션 context.getBean add 는 생성자와 비슷 -> <constructor-arg> 태그 밑에 <list><bean><ref></list> 식으로 해도 됨 하지만 귀찮 -> p했던 것처럼 util 사용 -> <util:list list-class="java.util.ArrayList> 하면 알아서 객체까지 만들어짐
DI 하는 property 즉,setter 대신에 코드 setExam 이라는 코드안에 injection 하기 위해 대신 @Autowired 사용 ==> 객체 만들어지면 @Autowired 있으면 실행해주는 것 물론 뒤져봐야 한다는 xml 안의 코드가 필요함 -> 새로운 namespace 인 context 필요 -> <context:annotation-config /> 추가
그럼 @Autowired 는 어떤 근거로 매개변수를 받아들였는가? 자동으로 되는 Autowired 조심해서 사용할 근거가 있음 -> 참조할 수 있는 클래스명으로 찾는 거임 그럼 클래스가 2개면? -> 못찾음 ( <bean id ,classs> -> @Autowired 밑에 @Qulifier("(이름)") 해주면 클래스는 자동으로, 이름은 @Qulifier 를 통해 찾음으로써 정상작동 가능
이전에는setter 위에 @Autowired 썻지만 기본생성자 위에 써도되고 그냥 필드위에 써도 상관없음 ==> 필드위에 @Autowired 썻을 때는 기본생성자로 생성됨 setter 위에 쓰면 기본생성자 생성 + setter 쪽 생성
필드위에 @Autowired 썼을 때, 기본생성자가 만약 없다면 다른 생성자 있어도 @Autowired 가 실행안됨 그래서 기본생성자 아닌 다른 생성자에 @Autowired 있으면 실행은 됨, 하지만 @Qulifier는 쓰지 못하는데, 그거는 파라미터가 존재하는 생성자의 경우 여러 파라미터를 받아들일 수 있기 때문에 각 파라미터마다 @Qulifier 설정해야함