기술적인 문제나 공통적인 관심사 처리(공통 로그 처리등의 기술지원 @Bean)
문제 발생시 해당 위치를 정확하게 파악 하기 쉽다.
클레스에 @Configuration 설정후 매서드에 @Bean 등록
(@Configuration이라고 하면 설정파일을 만들기 위한 애노테이션 or Bean을 등록하기 위한 애노테이션이다.)
@Configuration
public class PasswordConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
@SpringBootTest
public class PasswordEncoderTest {
@Autowired
PasswordEncoder passwordEncoder;
@Test
@DisplayName("수동 등록한 passwordEncoder를 주입 받아와 문자열 암호화")
void test1() {
String password = "Robbie's password";
// 암호화
String encodePassword = passwordEncoder.encode(password);
System.out.println("encodePassword = " + encodePassword);
String inputPassword = "Robbie";
// 복호화를 통해 암호화된 비밀번호와 비교
boolean matches = passwordEncoder.matches(inputPassword, encodePassword);
System.out.println("matches = " + matches); // 암호화할 때 사용된 값과 다른 문자열과 비교했기 때문에 false
}
}
public interface Food {
void eat();
}
...
@Component
public class Chicken implements Food {
@Override
public void eat() {
System.out.println("치킨을 먹습니다.");
}
}
...
@Component
public class Pizza implements Food {
@Override
public void eat() {
System.out.println("피자를 먹습니다.");
}
}
하나의 인터베이스에 구현체 클래스를 2개 만든후 @Bean으로 등록 했을때 인터페이스는 직접 @Autowired가 불가능하다.
1) 구현체를 직접 등록한다
@SpringBootTest
public class BeanTest {
@Autowired
Food pizza;
@Test
void test1(){
food.eat();
}
}
2) 구현체에 @Primary를 사용한다. 그러면 같은 타입의 구현체가 여러게 있더라도 우선적으로 @Primary가 적용되어 있는 객체를 주입해준다.
@Component
@Primary
public class Chicken implements Food {
@Override
public void eat() {
System.out.println("치킨을 먹습니다.");
}
}
...
@SpringBootTest
public class BeanTest {
@Autowired
Food food;
@Test
void test1(){
food.eat();
}
}
3) @Qualifier를 사용해 원하는 구현체를 들고온다.
@Component
@Qualifier("pizza")
public class Pizza implements Food {
@Override
public void eat() {
System.out.println("피자를 먹습니다.");
}
}
...
@SpringBootTest
public class BeanTest {
@Autowired
@Qualifier("pizza")
Food food;
@Test
@DisplayName("Primary 와 Qualifier 의 우선순위 확인 ")
void test1(){
food.eat();
}
}
@Primary와 @Qualifier중 우선순위는 @Qualifier이다.(@Primary는 범용적으로 사용하는 곳에,@Qualifier는 지역적으로 사용하는 곳에 사용해준다.) 스프링은 대부분의 우선순위가 좁은 범위이다