Spring Bean Configration File 만들 때 xml 형식으로 Bean에 id를 주고 property에 속성값(Value)을 주고 데이터에 Setter Injection
을 했다.
Spring Bean Configration File 형식
- xml 설정이 너무 길어져서 그 대안으로 나타났다.
- Class / Method / Field에 Annotation을 달아서 그 자체로 설정이 가능하다.
(단, xml이 우선순위가 더 높다.)@Annotation
을 사용해서 데이터를 설정해준다.- Spring이 코드를 줄일 때 @Annotation을 사용해서 줄인다.
- Bean을 만드는 Java 파일
- Spring Bean Configuration File과 하는 일이 같다.
- Bean을 만드는 메소드야.
- 메소드이름이 Bean의
이름(id)
- 반환타입이 Bean의
타입(class)
@Configuration
public class SpringBeanConfig {
@Bean
public Song song1() {
Song song = new Song();
song.setTitle("별보러가자");
song.setGenre("발라드");
return song;
}
}
Reflection
을 이용해서 추가 정보를 획득하여 기능을 실시한다.프로그램이 실행 중에 자신의 구조와 동작을 검사/조사/수정하는 것이다. 이것을 이용하면 Annotation 지정만으로 원하는 클래스를 주입할 수 있다.
Spring Legacy Project -
servlet-context.xml
아래쪽에 Namespaces 클릭하면 여러가지가 나타난다.
이 중에 context - http:www.springframework.org/schema/context
를 체크하고, source로 돌아온다.
Singer.java
package com.gdu.app01.javal01;
public class Singer {
// field
private String name;
private Song song;
// constructor
public Singer() {
}
public Singer(String name, Song song) {
super();
this.name = name;
this.song = song;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Song getSong() {
return song;
}
public void setSong(Song song) {
this.song = song;
}
}
Song.java
package com.gdu.app01.javal01;
public class Song {
// field
private String title;
private String genre;
// constructor
public Song() {
}
public Song(String title, String genre) {
super();
this.title = title;
this.genre = genre;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getGenre() {
return genre;
}
public void setGenre(String genre) {
this.genre = genre;
}
}
SpringBeanConfig.java
package com.gdu.app01.javal01;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringBeanConfig {
// 메소드 하나당 Bean 하나를 맡아서 생성한다.
/*
<bean id="song1" class="Song">
<property name="title" value="제목1"/>
<property name="genre" value="장르1"/>
</bean>
*/
@Bean
public Song song1() {
Song song = new Song();
song.setTitle("제목1");
song.setGenre("장르1");
return song;
}
/*
<bean id="song2" class="Song">
<property name="title" value="제목2"/>
<property name="genre" value="장르2"/>
</bean>
*/
@Bean(name="song2") // @Bean에 name값을 지정하면 id로 사용된다.
public Song sadjksfd1() { // 메소드이름은 아무거나 적어도 된다.
Song song = new Song();
song.setTitle("제목2");
song.setGenre("장르2");
return song;
}
/*
<bean id="song3" class="Song">
<property name="title" value="제목3"/>
<property name="genre" value="장르3"/>
</bean>
*/
@Bean
public Song song3() {
return new Song("제목3", "장르3");
}
// 미션
// song1를 가지는 singer1을 만들어 보자
// setter injection
@Bean
public Singer singer1() {
Singer singer = new Singer();
singer.setName("singer1");
singer.setSong(song1());
return singer;
}
// song2를 가지는 singer2을 만들어 보자
// setter injection
@Bean(name="singer2")
public Singer qdse() {
Singer singer = new Singer();
singer.setName("singer2");
singer.setSong(sadjksfd1());
return singer;
}
// song3를 가지는 singer3을 만들어 보자
// setter injection
@Bean
public Singer singer3() {
return new Singer("singer3", song3());
}
}
SpringMain.java
package com.gdu.app01.javal01;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
public class SpringMain {
public static void main(String[] args) {
AbstractApplicationContext ctx = new AnnotationConfigApplicationContext(SpringBeanConfig.class);
Singer s1 = ctx.getBean("singer1", Singer.class);
System.out.println(s1.getName());
System.out.println(s1.getSong().getTitle());
System.out.println(s1.getSong().getGenre());
Singer s2 = ctx.getBean("singer2", Singer.class);
System.out.println(s2.getName());
System.out.println(s2.getSong().getTitle());
System.out.println(s2.getSong().getGenre());
Singer s3 = ctx.getBean("singer3", Singer.class);
System.out.println(s3.getName());
System.out.println(s3.getSong().getTitle());
System.out.println(s3.getSong().getGenre());
}
}
실행값
Student,java
package com.gdu.app01.javal02;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class Student {
private List<Integer> scores; // 0~100 사이의 랜덤 정수 5개
private Set<String> awards; // 임의의 상장 3개
private Map<String, String> contact; // 연락처(address, tel)
// getter/setter
public List<Integer> getScores() {
return scores;
}
public void setScores(List<Integer> scores) {
this.scores = scores;
}
public Set<String> getAwards() {
return awards;
}
public void setAwards(Set<String> awards) {
this.awards = awards;
}
public Map<String, String> getContact() {
return contact;
}
public void setContact(Map<String, String> contact) {
this.contact = contact;
}
}
SpringBeanConfig,java
<bean id="stud" class="Student">
: 메소드이름 stud( )
이 bean이다.
package com.gdu.app01.javal02;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringBeanConfig {
@Bean
public Student stud( ) {
// List
List<Integer> scores = new ArrayList<Integer>();
for(int cnt = 0; cnt < 5; cnt++) {
scores.add( (int)(Math.random() * 101 + 0) ); // 0부터 101개의 난수가 발생 : 0 ~ 100
}
// Set
Set<String> awards = new HashSet<String>();
awards.add("개근상");
awards.add("장려상");
awards.add("우수상");
// Map
Map<String, String> contact = new HashMap<String, String>();
contact.put("address", "서울");
contact.put("tel", "02-123-4567");
Student student = new Student();
student.setScores(scores);
student.setAwards(awards);
student.setContact(contact);
return student;
}
}
SpringMain,java
package com.gdu.app01.javal02;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
public class SpringMain {
public static void main(String[] args) {
AbstractApplicationContext ctx = new AnnotationConfigApplicationContext(SpringBeanConfig.class);
Student student = ctx.getBean("stud", Student.class);
System.out.println(student.getScores());
System.out.println(student.getAwards());
System.out.println(student.getContact());
ctx.close();
}
}
실행값