안녕하세요 !
오늘은 Spring의 특징인 DI 방법 3가지를 알아보려고합니다.
DI가 아직 뭔지 잘 모르겠다 ! 하시는 분들은 이전 글을 참조하시면 좋을 것 같습니다.
[Spring / JAVA] 스프링 - DI ( Dependency Injection ) 의존성 주입
안녕하세요 ! ꉂꉂ(ᵔᗜᵔ*) 이번 글에서는 스프링의 특징 중 하나인 DI에 대해서 공부해보겠습니다. DI : Dependency Injection 객체간 의존성을 개발자가 객체 내부에서 직접 호출하는 연산자 대신 외
preparingforme-n-us.tistory.com
외부에서 객체를 생성해주는 방법에는 다음과 같은 세가지의 방법이 있습니다.
( xml만을 이용해서 객체 생성을 하는 방법은 이전 글에 설명해두었으니 참고해주세요 ! )
- Annotation을 활용해 xml 없이 객체 생성해주는 방법
- Annotation을 만들고, xml에서 Annotation을 가져와서 함께 쓰는 방법
- xml에서 객체 생성을 해준 뒤 Annotation에서 xml을 Import해서 쓰는 방법
그럼 xml 없이 Annotation을 사용하는 방법부터 보겠습니다 !
< Annotation >
파일은 다음과 같이 생성하고 시작하겠습니다.
ApplicationConfig.java 를 만들고
Annotation을 사용해서 기존에 xml을 사용할 때 필요했던 Configuration과 Bean을 선언해줍니다.
ApplicationConfig.java
package com.spring.app;
import java.util.ArrayList;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ApplicationConfig {
@Bean
public Student student1() {
ArrayList<String> hobbys = new ArrayList<String>();
hobbys.add("독서");
hobbys.add("음악");
Student student = new Student("김미미", 20, hobbys);
student.setGradeNum("1");
student.setClassNum("2");
return student;
}
@Bean
public Student student2() {
ArrayList<String> hobbys = new ArrayList<String>();
hobbys.add("영화");
hobbys.add("수영");
Student student = new Student("김쥬쥬", 24, hobbys);
student.setGradeNum("2");
student.setClassNum("6");
return student;
}
}
Student.java
package com.spring.app;
import java.util.ArrayList;
public class Student {
private String name;
private int age;
private String gradeNum;
private String classNum;
private ArrayList<String> hobbys;
public Student(String name, int age, ArrayList<String> hobbys) {
this.name = name;
this.age = age;
this.hobbys = hobbys;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGradeNum() {
return gradeNum;
}
public void setGradeNum(String gradeNum) {
this.gradeNum = gradeNum;
}
public String getClassNum() {
return classNum;
}
public void setClassNum(String classNum) {
this.classNum = classNum;
}
public ArrayList<String> getHobbys() {
return hobbys;
}
public void setHobbys(ArrayList<String> hobbys) {
this.hobbys = hobbys;
}
}
MainClass.java
package com.spring.app;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MainClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
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.getGradeNum());
System.out.println("반 : " + student1.getClassNum());
System.out.println("취미 : " + student1.getHobbys());
Student student2 = ctx.getBean("student2", Student.class);
System.out.println("이름 : " + student2.getName());
System.out.println("나이 : " + student2.getAge());
System.out.println("학년 : " + student2.getGradeNum());
System.out.println("반 : " + student2.getClassNum());
System.out.println("취미 : " + student2.getHobbys());
ctx.close();
}
}
ApplicationConfig.java 에서 @Configuration으로 Class를 만들고 @Bean을 써서 Student 객체 ( student1, student2 ) 를 만들어줬습니다.
MainClass.java에서 AnnotationConfigApplicationContext 를 사용해서 ApplicationConfig 클래스를 불러와줍니다.
student1과 2를 ctx.getBean()으로 가져와서 할당해줍니다.
< xml ← Annotation >
이번 방법은 파일 구성을 이렇게 만들어주고 시작하겠습니다 !
위 방법에서 했던 것처럼 Annotation을 활용할거기 때문에 ApplicationConfig.java를 만들어서 동일하게 작성한 후
xml에서 Annotation으로 작성한 객체를 받아오는 식으로 쓰겠습니다.
ApplicationConfig.java
package com.spring.app;
import java.util.ArrayList;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ApplicationConfig {
@Bean
public Student student1() {
ArrayList<String> hobbys = new ArrayList<String>();
hobbys.add("독서");
hobbys.add("음악");
Student student = new Student("김미미", 20, hobbys);
student.setGradeNum("1");
student.setClassNum("2");
return student;
}
}
Student.java는 위에 썼던 그대로 들고와주세요 !
MainClass.java
package com.spring.app;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class MainClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
AbstractApplicationContext ctx
= new GenericXmlApplicationContext("classpath:applicationCTX.xml");
Student student1 = ctx.getBean("student1", Student.class);
System.out.println("이름 : " + student1.getName());
System.out.println("나이 : " + student1.getAge());
System.out.println("학년 : " + student1.getGradeNum());
System.out.println("반 : " + student1.getClassNum());
System.out.println("취미 : " + student1.getHobbys());
Student student2 = ctx.getBean("student2", Student.class);
System.out.println("이름 : " + student2.getName());
System.out.println("나이 : " + student2.getAge());
System.out.println("학년 : " + student2.getGradeNum());
System.out.println("반 : " + student2.getClassNum());
System.out.println("취미 : " + student2.getHobbys());
ctx.close();
}
}
applicationCTX.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: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-3.1.xsd">
<context:annotation-config />
<bean class="com.spring.app.ApplicationConfig" />
<bean id="student2" class="com.spring.app.Student">
<constructor-arg>
<value>김쥬쥬</value>
</constructor-arg>
<constructor-arg>
<value>24</value>
</constructor-arg>
<constructor-arg>
<list>
<value>영화</value>
<value>수영</value>
</list>
</constructor-arg>
<property name="gradeNum" value="2" />
<property name="classNum" value="6" />
</bean>
</beans>
이런식으로 applicationCTX.xml 에서
<context:annotation-config />
<bean class="com.spring.app.ApplicationConfig" />
로 Annotation를 활용해 만들어준 ApplicationConfig.java를 가져와줍니다.
MainClass.java에서는 AbstractApplicationContext()를 사용해서 CTX를 불러와줍니다.
< Annotation ← xml >
파일 구성은 다음과 같습니다 !
이번엔 위에 했던 방법과 달리 xml에 Annotation을 불러오는게 아니라 xml에 Annotation을 가져와서 써보도록 하겠습니다.
ApplicationConfig.java
package com.spring.app;
import java.util.ArrayList;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
@Configuration
@ImportResource("classpath:applicationCTX.xml")
public class ApplicationConfig {
@Bean
public Student student1() {
ArrayList<String> hobbys = new ArrayList<String>();
hobbys.add("독서");
hobbys.add("음악");
Student student = new Student("김미미", 20, hobbys);
student.setGradeNum("1");
student.setClassNum("2");
return student;
}
}
Student.java는 위에 썼던 그대로 들고와주세요 !
MainClass.java
package com.spring.app;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class MainClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
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.getGradeNum());
System.out.println("반 : " + student1.getClassNum());
System.out.println("취미 : " + student1.getHobbys());
Student student2 = ctx.getBean("student2", Student.class);
System.out.println("이름 : " + student2.getName());
System.out.println("나이 : " + student2.getAge());
System.out.println("학년 : " + student2.getGradeNum());
System.out.println("반 : " + student2.getClassNum());
System.out.println("취미 : " + student2.getHobbys());
ctx.close();
}
}
applicationCTX.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="student2" class="com.spring.app.Student">
<constructor-arg>
<value>김쥬쥬</value>
</constructor-arg>
<constructor-arg>
<value>24</value>
</constructor-arg>
<constructor-arg>
<list>
<value>영화</value>
<value>수영</value>
</list>
</constructor-arg>
<property name="gradeNum" value="2" />
<property name="classNum" value="6" />
</bean>
</beans>
ApplicationConfig.java 에서
@ImportResource("classpath:applicationCTX.xml")
로 작성해둔 xml을 가져와줍니다.
MainClass.java에서는 AnnotationConfigApplicationContext를 이용해서 Annotation으로 작성한 ApplicationConfig 클래스를 가져와서 써주면 됩니다.
이렇게 작성해주면 나오는 출력문입니다.
오늘은 여기서 마치고 다음 글에서는 spring으로 데이터를 전달하는 방법을 배워보도록 하겠습니다 !
감사합니다 !
'JAVA > Spring' 카테고리의 다른 글
[ Spring / JAVA ] 스프링 게시판 만들기 (2) (0) | 2024.01.30 |
---|---|
[ Spring / JAVA ] 스프링 게시판 만들기 (1) (0) | 2024.01.28 |
[ Spring / JAVA ] 스프링 Request - 데이터 넘기는 방법 (2) | 2023.11.01 |
[Spring / JAVA] 스프링 - DI ( Dependency Injection ) 의존성 주입 (2) | 2023.10.24 |
[Spring / JAVA] 이클립스에서 Spring 설치 및 개발 환경 설정하기 (50) | 2023.10.23 |