일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Oracle
- IntelliJ
- JVM
- Spring Boot
- Design Patterns
- Gradle
- springboot
- 요리
- Spring
- it
- devops
- Spring Batch
- Web Server
- java
- ubuntu
- elasticsearch
- laravel
- redis
- ReactJS
- AWS
- Git
- db
- jenkins
- javascript
- MySQL
- linux
- tool
- 맛집
- php
- jsp
- Today
- Total
아무거나
[spring] DI 설정 방법 본문
[spring] DI 설정 방법
(1) xml파일을 이용한 DI 설정 방법
[Student.java]
public class Student {
private String name;
private int age;
private ArrayList<String> hobbys;
private double height;
private double weight;
// 필드 5개중에 3개(name, age, hobbys)를 초기화해주고 2개를 setter를 이용하고 있다.
public Student(String name, int age, ArrayList<String> hobbys) {
this.name = name;
this.age = age;
this.hobbys = hobbys;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setHobbys(ArrayList<String> hobbys) {
this.hobbys = hobbys;
}
public void setHeight(double height) {
this.height = height;
}
public void setWeight(double weight) {
this.weight = weight;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public ArrayList<String> getHobbys() {
return hobbys;
}
public double getHeight() {
return height;
}
public double getWeight() {
return weight;
}
}
[StudentInfo.java]
public class StudentInfo {
private Student student;
public StudentInfo() {
// TODO Auto-generated constructor stub
}
public void setStudent(Student student) {
this.student = student;
}
public Student getStudent() {
return student;
}
}
[StudentInfo.java]
public class Family {
String papaName;
String mamiName;
String sisterName;
String brotherName;
// 4개의 필드중에 2개만 생성자에서 초기화 해주고 있다. 나머지는 setter에서 처리한다.
public Family(String papaName, String mamiName) {
this.papaName = papaName;
this.mamiName = mamiName;
}
public Family(String papaName, String mamiName) {
this.papaName = papaName;
this.mamiName = mamiName;
}
public String getPapaName() {
return papaName;
}
public void setPapaName(String papaName) {
this.papaName = papaName;
}
public String getMamiName() {
return mamiName;
}
public void setMamiName(String mamiName) {
this.mamiName = mamiName;
}
public String getSisterName() {
return sisterName;
}
public void setSisterName(String sisterName) {
this.sisterName = sisterName;
}
public String getBrotherName() {
return brotherName;
}
public void setBrotherName(String brotherName) {
this.brotherName = brotherName;
}
}
[applicationCTX.xml]
....
<bean id="student1" class="com.javalec.ex.Student">
<constructor-arg value="홍길동" />
<constructor-arg value="10" />
<constructor-arg>
<list>
<value>수영</value>
<value>요리</value>
</list>
</constructor-arg>
<property name="height">
<value>187</value>
</property>
<property name="weight" value="84" />
</bean>
<bean id="sutudentInfo1" class="com.javalec.ex.StudentInfo">
<property name="student">
<ref bean="student1"/> <!-- 해당 소스 위에 있는 student1을 레퍼런스 하고 있다. -->
</property>
</bean>
....
[applicationCTX1.xml]
....
<bean id="student3" class="com.javalec.ex.Student">
<constructor-arg value="홍길자" />
<constructor-arg value="8" />
<constructor-arg>
<list>
<value>줄넘기</value>
<value>공기놀이</value>
</list>
</constructor-arg>
<property name="height">
<value>126</value>
</property>
<property name="weight" value="21" />
</bean>
<bean id="family" class="com.javalec.ex.Family" c:papaName="홍아빠" c:mamiName="홈엄마" p:sisterName="홍누나">
<property name="brotherName" value="홍오빠" />
</bean>
....
* <bean id="family" class="com.javalec.ex.Family" c:papaName="홍아빠" c:mamiName="홈엄마" p:sisterName="홍누나"> 는
namespace인 c와 p가 있다고 명시하는것이다.
-> 우리가 어떤 객체를 빈객체를 생성할때 생성자에서 사용할꺼면 constructor-arg를 사용했고
setter이용하여 설정하면 property를 사용했다.
하지만 위에 2개의 방법도 싫고 간단하게 쓴다면 namespace를 사용한다
ex) c:papaName="홍길동" // c <- constructor-arg, papaName는 필드이름, ""안에 있는것은 기초데이터
[MainClass.java]
public class MainClass {
public static void main(String[] args) {
String configLocation1 = "classpath:applicationCTX.xml";
String configLocation2 = "classpath:applicationCTX1.xml";
// 컨테이너 생성할때 스프링 설정 파일이 다수일경우 아래와 같이 쓸 수 있다.
AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLocation1, configLocation2);
Student student1 = ctx.getBean("student1", Student.class);
System.out.println(student1.getName()); //홍길동
System.out.println(student1.getHobbys()); // 수영, 요리
StudentInfo studentInfo = ctx.getBean("sutudentInfo1", StudentInfo.class);
Student student2 = studentInfo.getStudent(); //student1 == student2
System.out.println(student2.getName()); //홍길동
System.out.println(student2.getHobbys()); // 수영, 요리
if(student1.equals(student2)) {
System.out.println("student1 == student2");
}
Student student3 = ctx.getBean("student3", Student.class);
System.out.println(student3.getName());
if(student1.equals(student3)) {
System.out.println("student1 == student3");
} else {
System.out.println("student1 != student3");
}
Family family = ctx.getBean("family", Family.class);
System.out.println(family.getPapaName());
System.out.println(family.getMamiName());
System.out.println(family.getSisterName());
System.out.println(family.getBrotherName());
ctx.close();
}
}
(2) java를 이용한 DI 설정
@Configuration : 이 클래스는 스프링 설정에 사용되는 클래스이다. 라고 명시해 주는 어노테이션
@Bean : 객체 생성
[Student.java]
public class Student {
private String name;
private int age;
private ArrayList<String> hobbys;
private double height;
private double weight;
public Student(String name, int age, ArrayList<String> hobbys) {
this.name = name;
this.age = age;
this.hobbys = hobbys;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setHobbys(ArrayList<String> hobbys) {
this.hobbys = hobbys;
}
public void setHeight(double height) {
this.height = height;
}
public void setWeight(double weight) {
this.weight = weight;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public ArrayList<String> getHobbys() {
return hobbys;
}
public double getHeight() {
return height;
}
public double getWeight() {
return weight;
}
}
[ApplicationConfig.java]
@Configuration // 스프링 설정 파일로 쓰일 녀석이라고 알리는 어노테이션 설정
public class ApplicationConfig {
@Bean // bean 생성
public Student student1() { // Student.java(Student타입)의 studnet1을 생성한다.
ArrayList<String> hobbys = new ArrayList<String>();
hobbys.add("수영");
hobbys.add("요리");
Student student = new Student("홍길동", 20, hobbys);
student.setHeight(180);
student.setWeight(80);
return student;
}
@Bean
public Student student2() {
ArrayList<String> hobbys = new ArrayList<String>();
hobbys.add("독서");
hobbys.add("음악감상");
Student student = new Student("홍길순", 18, hobbys);
student.setHeight(170);
student.setWeight(55);
return student;
}
}
[MainClass.java]
public class MainClass {
public static void main(String[] args) {
// 자바파일을 이용하면 AnnotationConfigApplicationContext을 사용한다.
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ApplicationConfig.class);
Student student1 = ctx.getBean("student1", Student.class);
System.out.println("이름 : " + student1.getName());
System.out.println("나이 : " + student1.getAge());
System.out.println("취미 : " + student1.getHobbys());
System.out.println("신장 : " + student1.getHeight());
System.out.println("몸무게 : " + student1.getWeight());
Student student2 = ctx.getBean("student2", Student.class);
System.out.println("이름 : " + student2.getName());
System.out.println("나이 : " + student2.getAge());
System.out.println("취미 : " + student2.getHobbys());
System.out.println("신장 : " + student2.getHeight());
System.out.println("몸무게 : " + student2.getWeight());
ctx.close();
}
}
*** java파일 안으로 xml파일을 갖고 들어올때
@Configuration
@ImportResource("classpath:applicationCTX.xml") // 리소스를 import를 한다.
public class ApplicationConfig {
....
}
---> 즉, XML파일에 JAVA파일을 포함시켜 사용한다거나 JAVA파일에 XML파일을 포함시켜 사용할 수 있다.
'Java & Kotlin > Spring' 카테고리의 다른 글
[spring] 외부 파일을 이용한 설정 (0) | 2019.12.25 |
---|---|
[spring] 생명주기(life cycle)와 범위 (0) | 2019.12.25 |
[spring] DI(Dependency Injection) 활용 (0) | 2019.12.25 |
[spring] DI(Dependency Injection) - 2 (0) | 2019.12.25 |
[spring] DI(Dependency Injection) - 1 (0) | 2019.12.25 |