Spring Camp 2013 / Track B Session 2
Java Configuration은 Spring 3.0과 함께 등장했습니다. 초기에는 '이게 뭐야?' 싶은 정도로 제대로된 모습을 갖춘 상태가 아니었습니다. 뒤돌아보면 스프링 1.0 시절의 XML을 보는것 같았지요. (웃음)
하지만 3.1이 발표되며 상황이 바뀌었습니다. XML 설정을 대체할 정도로 성장했을 뿐만 아니라 더 많은 것들을 할 수 있게 되었거든요.
이 시간에는 Spring을 사용하는 대표적인 예제 PetClinic(https://github.com/arawn/spring-petclinic)을 Java Configuration으로 재구성한 모습을 코드로 보여드립니다. 그리고 제가 보는 Java Configuration의 매력요소를 공유합니다.
210. configuration
@Configuration
public class Config {
@Bean
public MemberService memberService() {
return new MemberServiceImpl();
}
@Bean
public MemberRepository memberRepository() {
return new MemberRepositoryImpl();
}
}
295. 기본!
@Configuration
public class MemberConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl();
}
@Bean
public MemberRepository memberRepository() {
return new MemberRepositoryImpl();
}
}
302. 기본!
@Configuration
public class MemberConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl();
}
@Bean
public MemberRepository memberRepository() {
return new MemberRepositoryImpl();
}
}
309. 기본!
@Configuration
public class MemberConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl();
}
@Bean
public MemberRepository memberRepository() {
return new MemberRepositoryImpl();
}
}
316. 빈
@Configuration
public class MemberConfig {
@Autowired
private Environment environment;
@Value(${app.name})
private String appName;
@Bean
public MemberService memberService() {
return new MemberServiceImpl();
}
@Bean
public MemberRepository memberRepository() {
return new MemberRepositoryImpl();
}
}
323. 빈
@Configuration
public class MemberConfig {
@Autowired
private Environment environment;
@Value(${app.name})
private String appName;
@Bean
public MemberService memberService() {
return new MemberServiceImpl();
}
@Bean
public MemberRepository memberRepository() {
return new MemberRepositoryImpl();
}
}
329. 주입
@Configuration
public class AppConfig {
@Bean
public ClinicService clinicService() {
return new ClinicServiceImpl();
}
@Bean
public PetTypeFormatter petTypeFormatter() {
return new PetTypeFormatter( ? );
}
}
335. 주입
public class PetTypeFormatter implements FormatterPetType {
@Configuration
private final ClinicService clinicService;
public class AppConfig {
public PetTypeFormatter(ClinicService clinicService) {
@Bean
this.clinicService = clinicService;
public ClinicService clinicService() {
}
return new ClinicServiceImpl();
// implementation elided for clarity
}
}
@Bean
public PetTypeFormatter petTypeFormatter() {
return new PetTypeFormatter( ? );
}
}
341. 주입
@Configuration
public class AppConfig {
@Bean
public ClinicService clinicService() {
return new ClinicServiceImpl();
}
@Bean
public PetTypeFormatter petTypeFormatter() {
return new PetTypeFormatter( ? );
}
}
351. Call
@Configuration
public class AppConfig {
@Bean
public ClinicService clinicService() {
return new ClinicServiceImpl();
}
@Bean
public PetTypeFormatter petTypeFormatter() {
return new PetTypeFormatter( clinicService() );
}
}
361. Parameter
@Configuration
public class AppConfig {
@Bean
public ClinicService clinicService() {
return new ClinicServiceImpl();
}
@Bean
public PetTypeFormatter petTypeFormatter(ClinicService clinicService) {
return new PetTypeFormatter( clinicService );
}
}
659. 선택
public class DataAccessConfig {
@Configuration
@Profile({Profiles.JPA, Profiles.SPRING_DATA_JPA})
@Import({ DataAccessConfig.JPARepositoryConfig.class
, DataAccessConfig.SpringDataJPARepositoryConfig.class })
public static class JPAConfig { … }
public class Profiles {
@Configuration
@Profile(Profiles.JPA)
public static final String JPA = jpa;
@ComponentScan(basePackages = petclinic.repository.jpa)
public static final String SPRING_DATA_JPA =
public static class JPARepositoryConfig { … } spring-data-jpa;
public static final String JDBC = jdbc;
@Configuration
}@Profile(Profiles.SPRING_DATA_JPA)
@EnableJpaRepositories(basePackages = petclinic.repository.springdatajpa)
public static class SpringDataJPARepositoryConfig { … }
@Configuration
@Profile(Profiles.JDBC)
@ComponentScan(basePackages = petclinic.repository.jdbc)
public static class JdbcConfig { … }
}