spring IOCとAOPの底辺実現

9267 ワード

spring IOCとAOPの底辺実現
https://juejin.im/post/5bf51d4c5188256d9832b0d3
IOC
2、springコアの主要な二つの部分:(1)aop:面に向かってプログラミングする:拡張機能はソースコードを修正して実現するのではない(2)Ioc:コントロール反転、例えばクラスがあり、種類の中に方法があります。現在のオブジェクトの作成はnew方式ではなく、springプロファイルの作成対象になります。
1、オブジェクトを作成する
(1)直接new
public class User{public void add(){}
//servletでUserクラスを呼び出す方法
User user=new User()user.add()
短所:クラス名が変わったら、servletの中もそれに合わせて変えます。つまり、二つのクラスの間の結合度が強すぎます。
(2)工場の使用方法
Servletとserviceの結合を低減しましたが、servletと工場はまた結合しました。
(3)Spring IOC
設定ファイル
クラスの中のpublic class UserService{public void add(){}を実現します。
public class UserServlet{prvate Uservlet userServlet}public void UserService(UserServlet UserSerVlet){this.user Servlet=user Servlet;
}
)
このように、user Servletは直接UserService類の中の方法を呼び出すことができます。
2、IOC底部原理使用技術
(1)xmlプロファイル
(2)dom 4 j解析xmlファイル
(3)工場設計モード
(4)反射
これらの技術はどうやってIOCに使われますか?
最初のステップ:xmlプロファイルを作成し、オブジェクトクラスを作成するように設定します。
第二ステップ:工場クラスを作成し、dom 4 jを使ってプロファイルを解析します。
クラスのパスまたはクラス名が変化したら、プロファイルを変更するだけで、クラス間の結合度が低下します。
一般的に、IOCは、各サービスオブジェクト間の依存関係を解消するためのオブジェクトバインディング方式であり、Springは、2つのコンテナタイプを提供し、IOC方式をサポートする。この2つのタイプは:
  • BenFactory:ベースタイプのIOC容器は、完全なIOCサービスサポート
  • を提供します。
  • Applectory:Appplication ContectはBeanFactoryをベースに構築されており、相対的に高級な容器実現であり、BeanFactoryのすべてのサポートを持つ以外に、Applectorxtは他の高級な特性を提供しています。
  • BenFactory
    BenFactoryの紹介
    BenFactoryは基本タイプIoC容器であり、完全なIoCサービスを提供しています。特別な指定がない場合は、デフォルトでは遅延初期化ポリシーを採用します。クライアントオブジェクトがコンテナの中のある管理対象にアクセスする必要がある場合のみ、当該管理対象を初期化し、注入作業に依存する。
    BenFactoryとは、Java Beanを生産する工場であり、Springが提供する基本的なIoC容器として、BenFactoryが業務対象の登録と対象間依存関係のバインディングを完了するのを助けています。
    実際には、BenFactoryは一つのインターフェースであり、どのようにしてコンテナにアクセスするかを定義するBeanの方法を担当しています。各BenFactoryの具体的な実現類は具体的なBeanの登録と管理を担当しています。
    上の図から分かるように、BenFactoryは3つの直接サブクラスがあります。
  • Listable BenFactory:このインターフェースを継承することによって、全てのBeanをリストすることができ、また期待されるタイプに対応するbean
  • のみをリストすることができる。
  • HerarchicarBenFactory:階層beanの管理をサポートし、BenFactoryが両親のIOC容器の管理機能
  • をサポートします。
  • AutowireCable BeanFactory:Springに制御されないBean
  • を充填できます。
    Apple Comptext
    Apple Contectの紹介
    Apple ContectはBeanFactoryに基づいて構築され、比較的高級な容器実現であり、BeanFactoryのすべてのサポートを持つほか、Appplication Controxtは他の高級な特性を提供しています。
  • 統一リソースローディングポリシー
  • 国際情報サポート
  • 容器内部イベント発表メカニズム
  • Appplication Contectのコンテナが起動した後、デフォルトは全部初期化してバインディング完了します。だから、BeanFactoryにとって、Appplication Contectは多くのシステムリソースを要求します。
    オブジェクト注入方式
    IOC容器には一般的に2つのオブジェクト注入方式があることを知っています。XML設定ファイルと注釈駆動に基づく方法があります。この二つの観点からApplication Contectの使い方を説明します。
    XMLベースのプロファイル
  • は、エンティティクラス
  • を定義する。
    public class User {
        private Integer id;
    
        private String username;
    
        public User(Integer id, String username) {
            this.id = id;
            this.username = username;
        }
    
        public User() {
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    }
    
  • XMLプロファイルを設定し、User Bean
  • を宣言します。
    
    
        
            
            
        
    
    
    注釈方式に基づいて
  • 声明の構成クラス
  • @Configuration
    public class UserConfiguration {
        @Bean(name = "user")
        public User user() {
            User user = new User();
            user.setUsername("pj");
            return user;
        }
    }
    
    上記の2つの例から、XMLベースと注釈ベースの注入ビーン方式とは違って、XMLベースのアプリケーションコンテキストClassPathXmlApplicationContextは構成パスを設定する必要があり、注釈ベースのアプリケーションコンテキストAnnotationConfigApplicationContextは構成ビーンを登録する必要があるが、それらは同じステップでrefresh()メソッドを呼び出す必要があり、この方法はIOC容器の起動方法と見なされ得る。構成の解析を完了する、各種BeanFactoryPostProcessorとBeanPostProcessorの登録、国際的な配置の初期化、web内蔵容器の構造など、多くの操作があります。ここでは簡単に説明します。もっと詳しい紹介は後の文章で紹介します。
    今はspringbootが盛んに行われている段階で、XMLに基づいてファイルを配置する方式はだんだん注釈に基づく方式に取って代わられました。
    AOP
    https://juejin.im/post/591d8c8ba22b9d00585007dd
    例えば、APIを四つのモジュールに抽象化します。Controller、Service、Gateway、Command。これは業務レベルの開発をうまく解決しましたが、システムレベルの開発に焦点を合わせにくいです。例えば、モジュールごとにログ、コードモニタ、異常処理が必要です。日誌を打つことを例にして、私は日誌コードを各対象にはめ込むことしかできなくて、日誌自身に関心を持つことができなくて、このような現象はまたOOP思想から逸れました。
    システムレベルのコードをよりよく引き出すために、オブジェクトとの結合を除去すると、AOPに向けて発生します。上の図に示すように、OOPは横方向の拡張に属し、AOPは縦方向の拡張である。AOPはOOPに依存して、さらにシステムレベルのコードを抽象化して、縦方向の配置を行い、低結合を実現する。
    1.2 AOPの家族構成員
    1.2.1 PointCut
    どこで切り込みを行いますか?ある点を指定してもいいし、複数の点を指定してもいいです。たとえば、クラスAのmethord関数は、もちろん一般的なAOPと言語(AOL)は、PointCutを定義するために、正規表現を利用して、複数のクラスの複数の関数を同時に指定することができます。
    1.2.2 Advice
    切り込みポイントで何をしますか?PointCutで何をするか(拡張)を指定して、日誌を打って、キャッシュを実行して、異常を処理します。
    1.2.3 Advisor/Asppect
    PointCut+Adviceは、切面Asppectを形成しています。この概念自体が切面のすべての要素を表しています。しかし、ここまでは完全ではありません。コードにどのように接面したらいいか分かりません。この問題を解決する技術はPROXYです。
    1.2.4 Proxy
    Proxyは代理として、AOPの家族構成員とは言えません。管理部門に相当しています。これをここに置いたのは、Aspectがコア思想に向けた重要な構成部分であるが、その思想の実行者はProxyであり、AOPを実現する難しさと核心的根拠でもあるからである。
    AOPの技術実現Proxy
    AOPは思想だけです。この思想を発光させるためには、言語自体の技術サポートから逸脱しなければなりません。Javaはこの技術を実現する時に採用されるプロキシProxyです。どうやって代理でうどんに向かうかを調べてみます。