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