オブジェクト向けの重要性


オブジェクト向けコードの原則を守らなければ、
変更が発生した場合は、次のようにクライアントコードを変更する必要があります.
public class OrderServiceImpl implements OrderService {

    // private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
    private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
}
=>クラスはDiscountPolicyインタフェースです.
実装クラス(FixDiscountPolicy、RateDiscountPolicy)にも依存
コードは抽象インタフェースにのみ依存します
private DiscountPolicy discountPolicy;
前述の通り、Null Pointer Exception(NPE)が発生するのは当然です
=>インプリメンテーションオブジェクトの作成と注入が必要なクラス
AppConfigクラスの作成
public class AppConfig {

	public MemberService memberService() {
		return new MemberServiceImpl(memberRepository()); 
        }
        
	public OrderService orderService() {
		return new OrderServiceImpl( 
    			memberRepository(), 
            		discountPolicy());
	}

	public MemberRepository memberRepository() {
		return new MemoryMemberRepository(); 
    	}
    
	public DiscountPolicy discountPolicy() {
		return new FixDiscountPolicy(); 
   	}
}
注入OrderServiceImplジェネレータ
public class OrderServiceImpl implements OrderService {

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }
クライアントOrderServiceImplに表示されます.
依存関係を外部からの注入と見なす
=>注入依存関係(注入依存性)
AppConfigの使用
public class MemberApp {
	public static void main(String[] args) {         
		AppConfig appConfig = new AppConfig();
    		MemberService memberService = appConfig.memberService();
            }
}
これらのコードを記述することで、変更が閉じる可能性があります.
(AppConfigの割引ポリシーメソッドを簡単に変更すれば、残りのコードXを変更する必要があります)

Springの使用


上記のコードは、純粋なJavaコードではなくSpringコードで記述できるようになりました.
AppConfig class
@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public OrderService orderService() {
        return new OrderServiceImpl(
                memberRepository(),
                discountPolicy());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

    @Bean
    public DiscountPolicy discountPolicy() {
        return new FixDiscountPolicy();
    }
}
Spring IOCコンテナ管理の対象Beanで管理しています.
スプリングクエリーの使用
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
        MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
メソッド名を使用してメソッドを呼び出すことができます.
スプリングの必要性はまだ感じられない.
スプリングを使う理由は何ですか?
次の投稿に進みます...