애너테이션 사용
애너테이션이란
스프링 애너테이션(Annotation)
기존에 XML에서 하던 빈 설정을 애너테이션을 이용해서 자바 코드에서 설정하는 방법
기능이 복잡해짐에 따라 XML에서 설정하는 것보다 유지 보수가 유리하다.
현재 애플리케이션 개발 시 XML 설정 방법과 애너테이션 방법을 혼합해서 사용한다.
@Configuration
app-context.xml 하고 같은 일을 하는 클래스이다.
실전문제
app-context.xml 이 없는 ver
Song.java
package com.koreait.spring;
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;
}
// method
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;
}
public void songInfo() {
System.out.println(title + "(" + genre + ")");
}
}
title genre 필드를 만들고 getter setter, 그리고 generate Constructor using fiends 까지 해준다
singer.java
package com.koreait.spring;
public class Singer {
// field
private String name;
private Song song;
//constructor
public Singer() {
// TODO Auto-generated constructor stub
}
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;
}
public void singInfo() {
System.out.println("이름:" + name );
song.songInfo();
}
}
private Song song
해줌으로써 songInfo(); 를 가져온다
Java 스타일 메인
package com.koreait.spring;
public class MainClass {
public static void main(String[] args) {
Song song = new Song();
song.setTitle("Dynamite");
song.setGenre("댄스");
Singer singer =new Singer();
singer.setName("BTS");
singer.setSong(song);
singer.singInfo();
}
}
Spring Style Main
AppContext.java
중요!! xml 을 대신한다.
package com.koreait.spring;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
// 애너테이션 사용
/*
* @Configuration
*
* : 나는 app-context.xml 하고 같은일을 하는 클래스 이다..
*
*/
@Configuration
public class AppContext {
// 메소드 하나당 Bean을 하나 씩 만듭니다.
// Bean 을 만드는 메소드들은 @ 애너테이션을 추가해야 한다.
/*
* <bean id="song1" class="com.koreait.spring.Song">
*
* <property name="title" value="Dynamite" />
* <property name="genre" value="댄스" />
* </bean>
*
* 아래 메소드를 위 <bean> 태그와 같은 일을 한다.
*
*/
@Bean // 이 메소드는 Bean 을 만드는 메소드 입니다.
public Song song1() {
Song song = new Song(); // <bean id="song1" class="com.koreait.spring.Song">
song.setTitle("Dynamite1"); // <property name="title" value="Dynamite" />
song.setGenre("댄스1"); // <property name="genre" value="댄스" />
return song;
}
/*
<bean id="song2" class="com.koreait.spring.Song">
<constructor-arg value="Dynamite" />
<constructor-arg value="댄스" />
</bean>
아래 메소드는 위 <bean> 태그와 같은 일을 한다.
*/
@Bean(name="song2") // @Bean(name="bean의 id")
public Song zzzzz() { // 메소드의 이름 zzzz는 사용되지 않아요.
return new Song("Dynamite2", "댄스2");
}
/*
<bean id="singer1" class="com.koreait.spring.Singer">
<property name="name" value="BTS" />
<property name="song" ref="song1" />
</bean>
아래 메소드는 위 <bean> 태그와 같은 일을 한다.
*/
@Bean
public Singer singer1() {
Singer singer = new Singer();
singer.setName("BTS3");
singer.setSong(song1()); // public Song song1(){} 메소드를 호출하면 song1 이라는 Bean 이 반환됩니다.
return singer;
}
/*
<bean id="singer2" class="com.koreait.spring.Singer">
<constructor-arg value="BTS" />
<constructor-arg ref="song2" />
</bean>
아래 메소드는 위 <bean> 태그와 같은 일을 한다.
*/
@Bean
public Singer singer2() {
return new Singer("BTS4", zzzzz()); // public Song zzzzz(){} 메소드를 호출하면 song2 라는 Bean 이 반환
}
}
SpringMainClass.java
package com.koreait.spring;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
public class SpringMainClass {
public static void main(String[] args) {
// @Configuration 애너테이션을 추가한 AppContext.java 를
// 처리하는 클래스는 AnnotationConfigApplicationContext 입니다.
// AnnotationConfigApplicationContext 클래스는 AbstractApplicationContext 클래스의 서브클래스 입니다.
AbstractApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class);
Song s1 = ctx.getBean("song1", Song.class);
Song s2 = ctx.getBean("song2", Song.class);
s1.songInfo();
s2.songInfo();
Singer gasu1 = ctx.getBean("singer1", Singer.class);
Singer gasu2 = ctx.getBean("singer2", Singer.class);
gasu1.singInfo();
gasu2.singInfo();
ctx.close();
}
}
AbstractApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class);
부분 중요