Spring_Spring Bean Configration File → Java로 작성하기

JW__1.7·2022년 10월 27일
0

Spring 공부일지

목록 보기
8/9

Spring Bean Configration File

Spring Bean Configration File 만들 때 xml 형식으로 Bean에 id를 주고 property에 속성값(Value)을 주고 데이터에 Setter Injection을 했다.

Spring Bean Configration File 형식


Spring Bean Configration File을 Java로 작성하기

Annotation (주석)

  • xml 설정이 너무 길어져서 그 대안으로 나타났다.
  • Class / Method / Field에 Annotation을 달아서 그 자체로 설정이 가능하다.
    (단, xml이 우선순위가 더 높다.)
  • @Annotation을 사용해서 데이터를 설정해준다.
  • Spring이 코드를 줄일 때 @Annotation을 사용해서 줄인다.

Annotation의 종류

1. @Configuration

  • Bean을 만드는 Java 파일
  • Spring Bean Configuration File과 하는 일이 같다.

2. @Bean

  • Bean을 만드는 메소드야.
  • 메소드이름이 Bean의 이름(id)
  • 반환타입이 Bean의 타입(class)
@Configuration
public class SpringBeanConfig {
	@Bean
	public Song song1() {
		Song song = new Song();
		song.setTitle("별보러가자");
		song.setGenre("발라드");
		return song;
	}
}    

Annotation 실행순서

  1. Annotation을 정의한다.
  2. 클래스에 Annotation을 배치한다.
  3. 코드가 실행되는 중에 Reflection을 이용해서 추가 정보를 획득하여 기능을 실시한다.

Reflection

프로그램이 실행 중에 자신의 구조와 동작을 검사/조사/수정하는 것이다. 이것을 이용하면 Annotation 지정만으로 원하는 클래스를 주입할 수 있다.


Java에서 만든 SpringBeanConfigrationFile을 xml에서 불러오기

  • Annotation은 활성화되지 않기 때문에 xml에 명시적으로 활성화을 해줘야 한다.
  • IDE에서 지원하며, 체크하면 자동으로 추가된다.

Spring Legacy Project - servlet-context.xml

아래쪽에 Namespaces 클릭하면 여러가지가 나타난다.
이 중에 context - http:www.springframework.org/schema/context를 체크하고, source로 돌아온다.


3. @Autowired

4. @Qualifier

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());
	}

}

실행값

0~100 사이의 랜덤 정수 5개
임의의 상장 3개
연락처(address, tel)

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();
	}

}

실행값

0개의 댓글