@Configuration
@ComponentScan(
basePackages = "spring.basic"
)
public class DuplicatedBeanScanAppConfig {
@Bean(name = "userRepositoryImpl")
UserRepository userRepository() {
return new UserRepositoryImpl();
}
}
public class DuplicateBeanTest {
@Test
void duplicatedBeanTest() {
ApplicationContext ac = new AnnotationConfigApplicationContext(DuplicatedBeanScanAppConfig.class);
UserRepository userRepository = ac.getBean(UserRepository.class);
Assertions.assertThat(userRepository).isInstanceOf(UserRepository.class);
}
}
@SpringBootApplication
public class BasicApplication2 {
public static void main(String[] args) {
SpringApplication.run(BasicApplication2.class, args);
}
}
@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();
}
}
@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();
}
}
@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);
}
}
public class DuplicateInjectBeanTest {
@Test
void duplicatedInjectBeanTest() {
ApplicationContext ac = new AnnotationConfigApplicationContext(ScanAppConfig.class);
UserService userService = ac.getBean(UserService.class);
Assertions.assertThat(userService).isInstanceOf(UserService.class);
}
}
public interface Grade {
public String userGrade(User user);
}
@Component
public class SubGrade implements Grade{
@Override
public String userGrade(User user) {
if(user.getRank().equals("B")){
return "ADMIN";
} else {
return "USER";
}
}
}
@Component
public class MasterGrade implements Grade{
@Override
public String userGrade(User user) {
if(user.getRank().equals("A")) {
return "MASTER";
} else {
return "SUB";
}
}
}
@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);
}
}
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");
}
}