07 스프링 빈 자동설정
p79(좌측이미지) - src/main/java/spring/basic/service/UserServiceImpl
@Component
public class UserServiceImpl implements UserService {
private static Long defaultUserId = 0L;
private final UserRepository userRepository;
@Autowired
public UserServiceImpl(@Qualifier("userRepositoryImpl") UserRepository userRepository) {
this.userRepository = userRepository;
}
// @Autowired
// public UserServiceImpl(UserRepository userRepository) {
// this.userRepository = userRepository;
// }
@Override
public void join(User user) {
user.setUserId(++defaultUserId);
userRepository.save(user);
}
@Override
public List<User> getUsers() {
return userRepository.getUsers();
}
@Override
public Optional<User> getUserByUserId(Long userId) {
return userRepository.getUserByUserId(userId);
}
}
p79(우측이미지) - src/main/java/spring/basic/repository/UserRepositoryImpl
@Component
public class UserRepositoryImpl implements UserRepository {
private static ConcurrentMap<Long, User> users = new ConcurrentHashMap<>();
@Override
public void save(User user) {
users.put(user.getUserId(), user);
}
@Override
public List<User> getUsers() {
return new ArrayList<>(users.values());
}
@Override
public Optional<User> getUserByUserId(Long userId) {
return users.values().stream().filter(user -> user.getUserId().equals(userId)).findAny();
}
}
p80 - src/main/java/spring/basic/ScanAppConfig
@Configuration
@ComponentScan(
basePackages = "spring.basic"
)
public class ScanAppConfig {
@Bean(initMethod = "init", destroyMethod = "destroy")
public LifeCycleBeanWithConfiguration lifeCycleBeanWithConfiguration(){
return new LifeCycleBeanWithConfiguration();
}
}
p84 - src/main/java/spring/basic/FilterConfig
@Configuration
@ComponentScan(
basePackages = "spring.basic", // 이 패키지 이하에서 스캔
includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = CustomInclude.class), // 특정 애노테이션이 붙은 클래스만 포함
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = CustomExclude.class) // 특정 애노테이션이 붙은 클래스는 제외
)
public class FilterConfig {
}
p85 - src/main/test/java/spring/basic/FilterConfigTest
class FilterConfigTest {
@Test
void FilterConfigScanTest() {
ApplicationContext ac = new AnnotationConfigApplicationContext(FilterConfig.class);
IncludedService includedService = ac.getBean(IncludedService.class);
Assertions.assertThat(includedService).isInstanceOf(IncludedService.class);
includedService.doSomething();
// ExcludedRepository는 빈으로 등록되지 않아야 함
assertThrows(NoSuchBeanDefinitionException.class, () -> {
ac.getBean(ExcludedRepository.class);
});
}
}
p87(좌측상단) - src/main/java/spring/basic/DuplicatedBeanScanAppConfig
@Configuration
@ComponentScan(
basePackages = "spring.basic"
)
public class DuplicatedBeanScanAppConfig {
@Bean(name = "userRepositoryImpl")
UserRepository userRepository() {
return new UserRepositoryImpl();
}
}
p87(우측상단) - src/main/test/java/spring/basic/DuplicatedBeanTest
public class DuplicateBeanTest {
@Test
void duplicatedBeanTest() {
ApplicationContext ac = new AnnotationConfigApplicationContext(DuplicatedBeanScanAppConfig.class);
UserRepository userRepository = ac.getBean(UserRepository.class);
Assertions.assertThat(userRepository).isInstanceOf(UserRepository.class);
}
}
p88 - src/main/java/spring/basic/BasicApplication2
@SpringBootApplication
public class BasicApplication2 {
public static void main(String[] args) {
SpringApplication.run(BasicApplication2.class, args);
}
}
p92(좌측이미지) - src/main/java/spring/basic/repository/UserRepositoryImpl2
@Component
@Qualifier("userRepositoryImpl2")
public class UserRepositoryImpl2 implements UserRepository {
private static ConcurrentMap<Long, User> users = new ConcurrentHashMap<>();
@Override
public void save(User user) {
users.put(user.getUserId(), user);
}
@Override
public List<User> getUsers() {
return new ArrayList<>(users.values());
}
@Override
public Optional<User> getUserByUserId(Long userId) {
return users.values().stream().filter(user -> user.getUserId().equals(userId)).findAny();
}
}
p92(우측이미지) - src/main/java/spring/basic/repository/UserRepositoryImpl
@Component
@Qualifier("userRepositoryImpl")
public class UserRepositoryImpl implements UserRepository {
private static ConcurrentMap<Long, User> users = new ConcurrentHashMap<>();
@Override
public void save(User user) {
users.put(user.getUserId(), user);
}
@Override
public List<User> getUsers() {
return new ArrayList<>(users.values());
}
@Override
public Optional<User> getUserByUserId(Long userId) {
return users.values().stream().filter(user -> user.getUserId().equals(userId)).findAny();
}
}
p93 - src/main/java/spring/basic/service/UserServiceImpl
@Component
public class UserServiceImpl implements UserService {
private static Long defaultUserId = 0L;
private final UserRepository userRepository;
@Autowired
public UserServiceImpl(@Qualifier("userRepositoryImpl") UserRepository userRepository) {
this.userRepository = userRepository;
}
// @Autowired
// public UserServiceImpl(UserRepository userRepository) {
// this.userRepository = userRepository;
// }
@Override
public void join(User user) {
user.setUserId(++defaultUserId);
userRepository.save(user);
}
@Override
public List<User> getUsers() {
return userRepository.getUsers();
}
@Override
public Optional<User> getUserByUserId(Long userId) {
return userRepository.getUserByUserId(userId);
}
}
p94 - src/test/java/spring/basic/service/DuplicatedInjectBeanTest
public class DuplicateInjectBeanTest {
@Test
void duplicatedInjectBeanTest() {
ApplicationContext ac = new AnnotationConfigApplicationContext(ScanAppConfig.class);
UserService userService = ac.getBean(UserService.class);
Assertions.assertThat(userService).isInstanceOf(UserService.class);
}
}
p96(우측이미지) - src/main/java/spring/basic/util/Grade
public interface Grade {
public String userGrade(User user);
}
p96(가운데이미지) - src/main/java/spring/basic/util/SubGrade
@Component
public class SubGrade implements Grade{
@Override
public String userGrade(User user) {
if(user.getRank().equals("B")){
return "ADMIN";
} else {
return "USER";
}
}
}
p96(좌측이미지) - src/main/java/spring/basic/util/MasterGrade
@Component
public class MasterGrade implements Grade{
@Override
public String userGrade(User user) {
if(user.getRank().equals("A")) {
return "MASTER";
} else {
return "SUB";
}
}
}
p97, 99 - src/main/java/spring/basic/service/GradeService
@Component
public class GradeService {
private final Map<String, Grade> grades;
@Autowired
public GradeService(Map<String, Grade> grades) {
this.grades = grades;
}
public String getGrade(User user, String gradeName) {
System.out.println("grades = " + grades);
Grade grade = grades.get(gradeName);
return grade.userGrade(user);
}
}
p98 - src/test/java/spring/basic/service/GradeServiceTest
class GradeServiceTest {
@Test
void getGrade() {
ApplicationContext ac = new AnnotationConfigApplicationContext(ScanAppConfig.class);
GradeService gradeService = ac.getBean(GradeService.class);
User user = new User(1l, "NAME", "A", LocalDate.now(), LocalDate.now());
String gradeInfo = gradeService.getGrade(user, "masterGrade");
Assertions.assertThat(gradeInfo).isEqualTo("MASTER");
User user2 = new User(2L, "NAME2", "B", LocalDate.now(), LocalDate.now());
String gradeInfo2 = gradeService.getGrade(user2, "subGrade");
Assertions.assertThat(gradeInfo2).isEqualTo("ADMIN");
}
}
Last updated