객체 생성과 @Component
console 부분 주석처리
객체 생성을 위한 설정하기
패키지를 지정해주지 않으면 오류가 뜬다.
패키지를 생성하는 코드를 xml에 넣어줘도 에러가 발생하게 된다,.
그럴 경우 객체를 호출할 때 class로 해야 한다.
id로 호출할 경우 @component에 ()를 추가해 id를 적어준다.
NewlecExam 객체 만들기
setting.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd">
<context:component-scan base-package="spring.di.ui, spring.di.entity" />
<!-- Exam exam = new NewIecExam(); -->
<!-- <bean id="exam1" class="spring.di.entity.NewIecExam" p:kor="10" p:eng="10" />
<bean id="exam2" class="spring.di.entity.NewIecExam" p:kor="20" p:eng="20" /> -->
<!--
<bean id="exam" class="spring.di.entity.NewIecExam" >
<constructor-arg name="kor" value="10" />
<constructor-arg name="math" value="10" />
<constructor-arg name="com" value="10" />
<constructor-arg name="eng" value="10" />
</bean>
-->
<!-- ExamConsole console = new InlineExamConsole(); -->
<!-- <bean id="console" class="spring.di.ui.InlineExamConsole" >
console.setExam(exam);
<property name="exam" ref="exam" />
</bean> -->
<!-- 컬랙션 실제로 객체를 만드는 능력 -->
<!-- <util:list id="exams" list-class="java.util.ArrayList">
<bean class="spring.di.entity.NewIecExam" p:kor="1" p:eng="1" /> 직접생성
<ref bean="exam" /> 위에 참조
</util:list> -->
<!-- ArrayList를 생성자로 넘기는 방식 -->
<!-- <bean id="exams" class="java.util.ArrayList">
<constructor-arg>
<list>
<bean class="spring.di.entity.NewIecExam" p:kor="10" p:eng="10" /> 직접생성
<ref bean="exam" /> 위에 참조
</list>
</constructor-arg>
</bean> -->
</beans>
Program.java
package spring.di;
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import spring.di.entity.Exam;
import spring.di.entity.NewIecExam;
import spring.di.ui.ExamConsole;
import spring.di.ui.GridExamConsole;
import spring.di.ui.InlineExamConsole;
public class Program {
public static void main(String[] args) {
/* 스프링에게 지시하는 방법으로 코드를 변경
* Exam exam = new NewIecExam();
* Exam exam = new NewIecExam(10,10,10,10);
* ExamConsole console = new GridExamConsole();
*
* console.setExam(exam);
*/
//지시서 읽어들이기
ApplicationContext context = new ClassPathXmlApplicationContext("spring/di/setting.xml");
//Exam exam = context.getBean(Exam.class);
//System.out.println(exam.toString());
ExamConsole console = (ExamConsole) context.getBean("console"); //id로 꺼내기
//ExamConsole console = context.getBean(ExamConsole.class); //(가르키는 인터페이스 형식에 찹조하는 객체를 찾아준다.) 클래스명으로 가져오기
console.print();
//List<Exam> exams = (List<Exam>) context.getBean("exams"); //new ArrayList<>();
//exams.add(new NewIecExam(1,1,1,1));
//for(Exam e : exams)
// System.out.println(e);
}
}
InlineExamConsole.java
package spring.di.ui;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import spring.di.entity.Exam;
@Component("console")
public class InlineExamConsole implements ExamConsole {
@Autowired
//@Qualifier("exam2")
private Exam exam;
public InlineExamConsole() {
System.out.println("constructor");
}
public InlineExamConsole(Exam exam) {
System.out.println("overloaded constructor");
this.exam = exam;
}
@Override
public void print() {
if(exam == null)
System.out.printf("total is %d, avg is %f\n ", 0, 0.0);
else
System.out.printf("total is %d, avg is %f\n ", exam.total(), exam.avg());
}
@Override
public void setExam(Exam exam) {
System.out.println("setter");
this.exam = exam;
}
}
NewIecExam.java
package spring.di.entity;
import org.springframework.stereotype.Component;
@Component
public class NewIecExam implements Exam {
private int kor;
private int eng;
private int math;
private int com;
//생성자
public NewIecExam() {
// TODO Auto-generated constructor stub
}
//생성자 오버로드
public NewIecExam(int kor, int eng, int math, int com) {
super();
this.kor = kor;
this.eng = eng;
this.math = math;
this.com = com;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
public int getCom() {
return com;
}
public void setCom(int com) {
this.com = com;
}
@Override
public int total() {
// TODO Auto-generated method stub
return kor+eng+math+com;
}
@Override
public float avg() {
// TODO Auto-generated method stub
return total() / 4.0f;
}
@Override
public String toString() {
return "NewIecExam [kor=" + kor + ", eng=" + eng + ", math=" + math + ", com=" + com + "]";
}
}
@Component의 종류
@Component에서 초기값 설정하기
@Value 어노테이션 사용
@Controller @Service @Repository는 컴포넌트와 같지만 역할로서의 의미가 부여되고 있는
@Component 어노테이션이다. -> 역할을 명시화 할 수 있다.
Java Configuration
java 코드에서 설정을 심어놓고 xml에 있는 설정을 지웠었다.
Spring을 사용할 경우 설정을 선택하는 것이 좋다. xml로만 할 건지 어노테이션으로만 할건지 선택해야 한다.
어노테이션으로만 작성하기
xml. 파일 자체를 java파일로 바꾸기
@baen 사용
지시서 작성방식의 변경
Program.java에서 지시서 읽어 들이는 코드 변경
Program.java
package spring.di;
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import spring.di.entity.Exam;
import spring.di.entity.NewIecExam;
import spring.di.ui.ExamConsole;
import spring.di.ui.GridExamConsole;
import spring.di.ui.InlineExamConsole;
public class Program {
public static void main(String[] args) {
/* 스프링에게 지시하는 방법으로 코드를 변경
* Exam exam = new NewIecExam();
* Exam exam = new NewIecExam(10,10,10,10);
* ExamConsole console = new GridExamConsole();
*
* console.setExam(exam);
*/
//지시서 읽어들이기
ApplicationContext context = new AnnotationConfigApplicationContext(NewlecDIConfig.class);
//new ClassPathXmlApplicationContext("spring/di/setting.xml");
//Exam exam = context.getBean(Exam.class);
//System.out.println(exam.toString());
ExamConsole console = (ExamConsole) context.getBean("console"); //id로 꺼내기
//ExamConsole console = context.getBean(ExamConsole.class); //(가르키는 인터페이스 형식에 찹조하는 객체를 찾아준다.) 클래스명으로 가져오기
console.print();
//List<Exam> exams = (List<Exam>) context.getBean("exams"); //new ArrayList<>();
//exams.add(new NewIecExam(1,1,1,1));
//for(Exam e : exams)
// System.out.println(e);
}
}
NewlecDIConfig.java
package spring.di;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import spring.di.entity.Exam;
import spring.di.entity.NewIecExam;
@ComponentScan("spring.di.ui")
@Configuration
public class NewlecDIConfig {
@Bean
public Exam exam() {
return new NewIecExam();
}
}