Spring IoCコメント詳細

5353 ワード

この記事はSpring IoCを記録しており、注入属性を注釈する方法である.
一、注解注入属性の簡単な事例
1)Springプロファイルにcontext制約を導入する


2)Springプロファイルで注釈スキャンを開始する
注意してください.最初のステップでcontext制約を導入しないとcontextラベルが表示されません.
3)クラスに@Componentコメントを追加する
@Component("user")
public class User {
	private Integer id;
	private String name;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
4)作成テスト
ApplicationContext act = new ClassPathXmlApplicationContext("beans-ioc.xml");
User user = (User) act.getBean("user");
System.out.println(user);
二、Spring IoC常用注解詳細
1)ビーン表示注記
  • @Component:コンポーネント共通の注釈は、Modelクラス
  • でよく使われています.
  • @Controller:Controller実現類に対して表示することが多い
  • @Service:Service実現類に対して表示することが多い
  • @Repository:DAO実現類の表示によく使われています.
  • @ComponentはSpringが提供する共通のコンポーネントの注釈です.@Component、@Controller、@Serviceと@Repository機能は同じで、交換できます.私達は異なる注釈を使っています.主に注釈された種類を区別するために、異なる業務層にいます.論理をより明確にします.この4つの注釈は主にbeanを定義し、beanを作成する.
    それらの使い方:
    (1)類に表示する
    (2)@Component(「name」)は@Component(value=「user」)に等しいです.
    (3)@Componentは@Componentに相当します.
    2)Bean属性注入注解
  • @Value:一般タイプの属性を注入する
  • @Resource:注入対象タイプ
  • @Autowired:注入対象のタイプは、デフォルトではタイプ別に注入されます.名前別の注入が完了しました.
  • (1)@Valueコメント
    例えば、上記のケースの中で、User類の中のidとnameの初期値のために、私達はidとname属性の上で@Value注解を使ってもいいし、それらのset方法に@Value注解を使ってもいいです.
    @Component(value="user")
    public class User {
    	@Value("1")
    	private Integer id;
    	
    	@Value("lzgsea")
    	private String name;
    	public Integer getId() {
    		return id;
    	}
    	
    	//@Value("1")
    	public void setId(Integer id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	
    	//@Value("lzgsea")
    	public void setName(String name) {
    		this.name = name;
    	}
    }
    (2)@Resource:注入対象タイプ
    public class UserTest {
    	
    	@Resource(name = "user")
    	private User user;
    	
    }
    (3)@Autowiredコメント
    public class UserTest {
    	
    	//     ,        
        // @Resource(name = "user")
        //        ,    
        @Qualifier("user")
        @Autowired
    	private User user;
    	
    }
    3)Beanの役割範囲注@Scope
    ビーンの範囲の注釈:デフォルトは一例です.
    @Scope:クラスに追加したものは、制御類が生成される時に単例を採用しますか?それとも複数例ですか? 
    @Scopeの値:
  • singleton:単一例
  • prototype:多例
  • request:requestドメインは、ウェブ環境
  • に必要です.
  • session:sessionドメインは、ウェブ環境
  • に必要である.
  • appication:contextドメインは、ウェブ環境
  • にある必要があります.
  • globalsessionクラスタ環境のsessionドメインは、ウェブ環境
  • に必要である.
    4)ビーンのライフサイクル注
    @PostConstruct:init-methodに相当します.
    @Predestroy:destroy-methodに相当します.
    この二つの注釈は方法に用いられます.
        @PostConstruct
        public void init() {
        	System.out.println("     ......");
        }
        
        @PreDestroy
        public void destroy() {
        	System.out.println("    ......");
        }
    三、context:componet-scan
    配置後は、@Required、@Autowired、@PostConstruct、@Predestry、@Resourceなどをスキャンします.
    ラベルを設定した後、springはbase-packの下またはサブパッケージの下のjavaファイルを自動的にスキャンできます.スキャン中のコメント以外に、@Component、@Repository、@Service、@Controller、 @RestitController、@Controller Advice、@Configrationなどの注釈.
    二つのサブラベルを提供しました.
  • この2つのサブラベルを説明する前に、先に述べておくと、デフォルトではtrueであるuse-default-filters属性があります.これは指定されたパケットの下のすべてのカテゴリーをスキャンして、beanに登録することを意味します.つまり@Component、@Controller、@Service、@Reposityなどです.設定ファイルにだけ書いてください.
     use-default-filterはこの時trueです.base-packageパッケージまたはサブパッケージのすべてをjavaクラスでスキャンして、マッチングしたjavaクラスをbeanに登録します.
     このようなスキャンの粒度が大きすぎることが分かります.指定されたカバンの下のコントロラーだけスキャンしたいなら、どうすればいいですか?この時、子供のラベルは勇武の地に着きました.次のように
    
        
    
    
    このようにするとbase-packageパッケージまたはサブパッケージのすべて@Controllerの下のjavaクラスだけをスキャンして、beanに登録します.
    use-dafault-filterは上では指定されていません.デフォルトはtrueです.または直接use-dafault-filterをtrueに変更すると、base-packageパッケージまたはサブパッケージのすべてをjavaクラスでスキャンします.
      
           
      
    この時、springは@Controllerをスキャンしただけではなく、指定されたカバンがあるサブバッグserviceの下に注解@Serviceのjava類をスキャンしました.このとき指定されたinclude-filterは何の役にも立たない.
    また、私が参加したプロジェクトでは、base-packageで指定されたカバンの中にはコメントが含まれていないものがあることが分かりましたので、スキャンしなくてもいいです.この時は指定してフィルタリングができます.スキャンする必要がないということです.
    総合以上の説明:
    use-default-filters="false"の場合は自動スキャンされません.どの注釈をスキャンするかを指定する設定が必要です.
    use-dafault-filters=「false」の場合:指定されたスキャンです.
    use-default-filters="true"の場合:指定されたスキャンしない