묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
코드를 똑같이 따라쳤는데 사용자 등록 빈 전체가 안 나와요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]직접 등록한 빈에서 이렇게만 나옵니다.AppConfig 설정 정보의 모든 메서드들이 나오지 않고 클래스만 나오네요.name = appConfig object=hello.core.AppConfig@3cce5371
-
미해결스프링 핵심 원리 - 기본편
강의 관련 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요. 강의를 들으며 헷갈리는 부분 질문 남깁니다. 회원을 가입하고 조회할 수 있다. 회원은 일반과 VIP 두 가지 등급이 있다.회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다. (미확정)먼저 회원은 가입하고 조회할 수 있는 기능이 있고 이를 역할과 구현으로 구분하기 위해 역할인 MemberService와 구현인 MemberServiceImpl을 생성했다고 이해했습니다. 그 다음부터 헷갈리기 시작하는데요. 여기서부터 질문입니다. MemberRepository 라는 interface를 생성했는데. 일단 저는 Repository를 현업에서 거의 사용한 적이 없어서 명칭부터가 익숙치 않았는데요. 제가 이해하기로는 주로 외부와의(DB) 통신을 담당하는 친구로 DAO와 유사한 역할을 하는 것으로 이해했습니다. 맞나요? 다만, 자체 DB를 구축할지 외부시스템과 연동할지 정해지지 않았기 때문에 Interface로 생성한거고, 만약 정해져 있다면 굳이 Interface로 생성하지 않아도 될 것 같은데 맞나요? 제가 현업에서 일하면서 Service와 DAO를 연결할때는 보통 같은 기능명칭을 사용했는데 여기서는 join을 save로, findMember를 findById로 사용하더라구요. 명칭을 다르게 하는 이유가있나요?
-
미해결스프링 핵심 원리 - 기본편
컴포넌트 이름을 같게 해도 에러가 뜨지 않아요 ㅠ (자동)
MemberServiceImpl, OrderServiceImpl 이름을둘다 service로 이름을 설정했는데AutoAppConfigTest 에서 돌려봐도 테스트가 통과하고에러가 뜨질 않네요왜 이럴까요? 영한님 강의 너무 잘 듣고 있습니다 좋은 강의 찍어주셔서 감사합니다!
-
해결됨자바 기초부터 마스터하기 with 은종쌤 (Do it 자바 프로그래밍 입문) - Part 2(마스터편)
synchronized 과정
public synchronized String lendBook() throws InterruptedException{ while (bookList.size() == 0) { wait(); } String book = bookList.remove(0); System.out.println(Thread.currentThread() + " 학생이 책을 빌렸습니다."); return book; } 위 코드의 경우 synchronized method로 처리하였습니다.이 경우 shared resource(예제의 경우 this 객체)에 접근하는 3개의 thread에 대해서도 하나의 쓰레드가 차지한 경우 lock을 걸고 사용이 끝나면 다음 쓰레드가 사용하는 과정을 거치나요? (이러한 과정이 굉장히 빨라서 동시에 일어나는 것 처럼 보일 뿐)
-
해결됨스프링 핵심 원리 - 기본편
@Autowired 필드 명, @Qualifier, @Primary 강의에서 오류가 저는 BeanDefinitionTest에서 납니다ㅠ
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]선생님 저는 BasicScan 테스트가 아니라 엉뚱한 곳에서 오류가 납니다 ㅠorg.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'orderService' defined in class path resource [appConfig.xml]: Unsatisfied dependency expressed through constructor parameter 1: Ambiguous argument values for parameter of type [hello.core.discount.DiscountPolicy] - did you specify the correct bean references as arguments? 빈이 2개 일 경우 첫번째 방법으로 @Autowired 생성자에서 파라미터명을 rateDiscountPolicy로 바꾸는 방법을 따라했는데 왜 저런 오류가 날까요? AppConfig.xml<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="memberService" class="hello.core.member.MemberServiceImpl"> <constructor-arg name="memberRepository" ref="memberRepository" /> </bean> <bean id="memberRepository" class="hello.core.member.MemoryMemberRepository" /> <bean id="orderService" class="hello.core.order.OrderServiceImpl"> <constructor-arg name="memberRepository" ref="memberRepository" /> <constructor-arg name="discountPolicy" ref="discountPolicy" /> </bean> <bean id="discountPolicy" class="hello.core.discount.RateDiscountPolicy" /> </beans> OrderServiceImplpackage hello.core.order; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountPolicy; import hello.core.discount.RateDiscountPolicy; import hello.core.member.Member; import hello.core.member.MemberRepository; import hello.core.member.MemoryMemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component //@RequiredArgsConstructor 롬복 public class OrderServiceImpl implements OrderService{ private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy rateDiscountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = rateDiscountPolicy; } @Override public Order createOrder(Long memberId, String itemName, int itemPrice) { Member member = memberRepository.findById(memberId); int discountPrice = discountPolicy.discount(member, itemPrice); return new Order(memberId,itemName,itemPrice,discountPrice); // 최종 생성된 주문을 반환 } //테스트용 public MemberRepository getMemberRepository(){ return memberRepository; } } BeanDefinitionTestpackage hello.core.beandefinition; import hello.core.AppConfig; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.GenericXmlApplicationContext; public class BeanDefinitionTest { //AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); GenericXmlApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml"); @Test @DisplayName("Bean 설정 메타정보 확인") void findApplicationBean(){ String[] beanDefinitionNames = ac.getBeanDefinitionNames(); for (String beanDefinitionName : beanDefinitionNames) { BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName); if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){ System.out.println("beanDefinitionName = " + beanDefinitionName + "beanDefinition = " + beanDefinition); } } } } package hello.core.xml; import hello.core.member.MemberService; import org.junit.jupiter.api.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.GenericXmlApplicationContext; import static org.assertj.core.api.Assertions.assertThat; public class XmlAppContext { @Test void xmlAppContext(){ ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml"); MemberService memberService = ac.getBean("memberService", MemberService.class); assertThat(memberService).isInstanceOf(MemberService.class); } }
-
미해결스프링 핵심 원리 - 기본편
MemberRepository의 주소값이 똑같은이유가 싱글톤 때문인가요?
안녕하세요 강의 잘 듣고있습니다 다름이아니라 memberRepository1(), memberRepository2() 둘의 메서드의 value값의 주소가 사진처럼 똑같은데요 이게 싱글톤이라서 주소를 공유하기때문에 주소값이 똑같은건가요?
-
미해결스프링 핵심 원리 - 기본편
@Component로 자동 빈 등록시 생성자가 2개인 경우 생성자를 선택하여 Bean을 생성할 수 있나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요.강의 내용중 궁금증이 있어 질문 올립니다.만약 @Component로 자동 빈 등록시 빈으로 등록될 class에 생성자가 2개인 경우생성자를 선택하여 Bean을 생성할 수 있나요?예를 들면 아래와 같습니다.@Componentpublic class MemberServiceImpl implements MemberService {private final MemberRepository memberRepository;@Autowiredpublic MemberServiceImpl(MemberRepository memberRepository) {this.memberRepository = memberRepository;}/* MemberRepository 객체를 인자로 2개 받는 생성자를 호출 가능한지? */@Autowiredpublic MemberServiceImpl(MemberRepository memberRepository1, MemberRepository memberRepository2) {this.memberRepository = memberRepository;}} getBean 으로 빈 조회를 할때MemberServiceImpl memberService = ac.getBean("memberService", MemberServiceImpl.class); MemberServiceImpl 클래스의 두번째 생성자(인자값 두개)를 호출하여 생성하는 방법이 있나요?@Bean 메서드를 만들어서 강제로 new MemberServiceImpl(MemberRepository memberRepository1, MemberRepository memberRepository2);위 방식으로 하면 될것 같은데 혹시 @Bean을 사용하지 않고 생성하는 다른 방법이 있을까요?
-
미해결스프링 핵심 원리 - 기본편
@RequiredArgsConstructor 과 @Qualifier은 동시 사용이 되지 않는 건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]강의를 수강하다가 궁금한 것이 있어 질문드립니다.이전 롬복 강의에 이어 @Qualifier 사용 코딩하니 롬복과 @Qualifier 이 동시에 되지 않는 것으로 판단됩니다.같이 사용할 수 있는 방법은 없는 것인가요?@Qualifier 사용을 위해서는 @AutoWired로 생성자 주입을 해야하는 것인가요? 실무에서는 어떻게 하시는지 궁금합니다.
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
MyFileWriter 클래스 선언 질문
처음에 MyFileWriter 클래스를 null 로 선언하고 Try 문안에서 new 키워드를 사용한 이유는 무엇인지 궁금합니다 !!public static void main(String[] args){ MyFileWriter writer = new MyFileWriter(); try{ writer.write("아이스크림이 먹고 싶어요"); }catch (Exception e){ e.printStackTrace(); }finally { try { writer.close(); } catch (Exception e) { throw new RuntimeException(e); } }이런식으로 사용하는 것과 무슨 차이가 있는지 궁금합니다 !
-
미해결스프링 핵심 원리 - 기본편
웹스코프와 프로토타입스코프의 차이점
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]둘 다 요청 후에는 삭제되는 거 같은데 차이점을 모르겠습니다.
-
미해결스프링 핵심 원리 - 기본편
Test 코드 작성 시에는 왜 import 문이 없나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 강의 잘 보고 있습니다.문득 코딩하다 궁금한 점이 컨트롤러, 서비스, 레포지토리 등을 작성할 땐 import 문을 사용하여 클래스를 사용하는데TEST 코드를 작성할 땐 왜 import 문을 작성하지 않아도 클래스를 사용할 수 있는 건가요?
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
퀴즈 2번 질문입니다!
안녕하세요? 퀴즈 2번 질문이 있습니다.2분 31초부터 "삼항연산자를 이용해서 결과값을 String 변수에 저장해놓는다."라고 하셨는데 왜 String이 쓰이는지 궁금합니다!
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
입력
강의 5분 2초에int height = sc.next();이렇게 했을 때 오류가 생겨서 "문자열"로 입력 받은 값을 "정수"로 바꿔주어야 한다고 설명해주셨는데 키는 숫자인데 왜 문자열로 입력 받는다고 설명해주셨는지 궁금합니다!
-
미해결스프링 핵심 원리 - 기본편
빈 스코프 강의에서
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.빈 스코프 강의에서singtonbean.class를 통해 스프링 컨테이너를 만들었는데이 방식으로 스프링 컨테이너를 만들면 singtonbean 클래스 객체가 만들어져 스프링 컨테이너에 저장되는 건가요? 그리고 이 방식으로 스프링 컨테이너를 생성하면 해당 클래스는 componentscan의 대상이 된다고 하셨는데해당 클래스에 componentscan 애노테이션이 있는 것이랑 똑같다고 봐도 무방한가요?
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
형 변환 질문입니다!
숫자를 문자열로 바꿀 때String.valueOf 를 사용하는 것과 Integer를 사용하는 것 2개를 알려주셨는데 String.valueOf를 사용하여 출력했을 때는 잘 출력이 되었습니다.Integer를 사용할 때도 아래 사진처럼 사용하면 안 되고 위에 String s1 = String.valueOf(93);을 함께 작성해야 하는 건가요?
-
미해결스프링 핵심 원리 - 기본편
래퍼 객체 Long 타입을 쓰는 이유가 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. member 도메인을 만들 때 왜 기본형 long 이 아닌 Long 래퍼 객체 타입을 사용하는지 궁금합니다.감사합니다.
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
왜 자식클래스의 메서드가 메인에서 실행될까요?
다형성을 배울때, 변수의 자료형이 부모클래스라면 자식클래스에만 존재하는 메서드는 바로 사용이 되지않아 자식클래스로 형변환 해준뒤 사용한다고 했던거같습니다. 하지만 이번 예제에서, 분명 hamburgers array의 자료형은 Hamburger,즉 부모클래스의 자료형인데, 어째서 루프 안에서 hamburger.cook()이 실행될때마다 오버라이딩된 자식클래스 속의 cook메서드가 실행되는거에요?
-
미해결스프링 핵심 원리 - 기본편
구현에 관한 질문
DiscountPolicy와 같은 인터페이스들을fixdiscount, ratediscount 등 클래스가 상속을 받고main에서 클래스를 사용할때 부모클래스로 구현을 하잔아요예를 들어 영상에서 코드를 보면 DiscountPolicy discountpolicy = new RateDiscountPolicy의 형식처럼 구현되는데만약에 자손 클래스에 새로 메서드를 추가를 했는데그 메서드를 부모가 가지지 않았다면 그 메서드를 다운캐스팅을 통해 쓰는 건가요??아니면 메서드를 부모 인터페이스에도 적어주어 오버라이딩으로 활용하는 것이 좋나요? 수업에서 계속 다형성을 활용해 진행하기 때문에 이런 궁금점이생겼습니다.
-
해결됨스프링 핵심 원리 - 기본편
Map<String, DiscountPolicy> beansOfType = ac.getBeansOfType(RateDiscountPolicy.class);
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]Map<String, DiscountPolicy> beansOfType = ac.getBeansOfType(DiscountPolicy.class); 이 부분에서 DiscountPolicy.class를 RateDiscountPolicy.class로 바꿔 보면 Map<String, DiscountPolicy> beansOfType = ac.getBeansOfType(RateDiscountPolicy.class); 오류가 나는데 이유가 뭔가요? RateDiscountPolicy는 DiscountPolicy의 구현체니까 DiscountPolicy 타입에 대입될 수 있으니 당연히 상관없을 줄 알았는데 오류가 나는 것 같더라고요.. 아래는 제가 IDE에서 따로 작성해 본 코드인데 RemoteControl rc = new SmartTelevision(); Map<Integer, RemoteControl> temp = new HashMap<>(); temp.put(1, rc); 여기서 SmartTelevision이 RemoteControl의 구현체인데 Map 객체에 저장이 되더라고요. 그래서 위의 스프링에서의 RateDiscountPolicy의 경우도 문제 없을 줄 알았는데.. 안 되는 이유가 뭘까요..
-
해결됨스프링 핵심 원리 - 기본편
특정 하위 타입으로 조회할 때 궁금한 점 있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]아래 코드의 findBeanBySubType()에서RateDiscountPolicy bean = ac.getBean(RateDiscountPolicy.class); 이 부분을 보면 RateDiscountPolicy 타입으로 조회한다는 뜻인데 TestConfig를 보면 rateDiscountPolicy는 리턴할 때 RateDiscountPolicy를 리턴하지만 메서드 시그니처에 있는 리턴 타입 자체는 DiscountPolicy이잖아요? RateDiscountPolicy bean = ac.getBean(RateDiscountPolicy.class);를 실행한 이후 동작 과정이 궁금합니다. DiscountPolicy 타입인 빈들을 먼저 찾고 그것들이 여러 개일 때 RateDiscountPolicy를 찾는지, 아니면 바로 처음부터 RateDiscountPolicy인지 FixDiscountPolicy인지 구분할 수 있는지 궁금합니다. @Test @DisplayName("특정 하위 타입으로 조회") public void findBeanBySubType() { RateDiscountPolicy bean = ac.getBean(RateDiscountPolicy.class); assertThat(bean).isInstanceOf(RateDiscountPolicy.class); } @Configuration static class TestConfig { @Bean public DiscountPolicy rateDiscountPolicy() { return new RateDiscountPolicy(); } @Bean public DiscountPolicy FixDiscountPolicy() { return new FixDiscountPolicy(); } } }