記事ディレクトリ
アノテーションを使用してSpringからBeanオブジェクトを格納および取得する非常に簡単な方法です。
bean
これらを
spring
コンテナに格納する方法はすでに紹介しました。ここで
bean
は
spring
、アノテーションを使用してコンテナからBeanオブジェクトを読み取る方法を学習します。
Beanオブジェクトの読み取りは、オブジェクトアセンブリ、オブジェクト注入、および依存性注入とも呼ばれます。これは、取得したオブジェクトをクラスに入れて、このクラスに使用させることです。
オブジェクトインジェクション:
クラスAがクラスBのインスタンスを使用する必要がある場合は、クラスAにクラスBのインスタンスを直接作成するか、クラスBのインスタンスオブジェクトをSpringコンテナから取り出してクラスに「インジェクト」することができます。 Springによって動的に管理および使用されるインジェクションのように、これは「インジェクション」です。
アノテーション@Autowired。
オブジェクトインジェクションは、アノテーションを使用して実行され@Autowired
ます。このアノテーションは、Springコンテナ構成のアノテーションです。同じコンテナ構成に属するアノテーションは@Required
、、などです。このアノテーションは@Primary
、@Qualifier
文字通り、自動配線された自動アセンブリとして理解されます。BeanオブジェクトをBeanを必要とするクラスとアセンブルします。
使用法は次のとおりです。
プロパティインジェクション
//属性注入
@Autowired
private UserService userService;
例:ServiceクラスのインスタンスをControllerクラスに挿入して使用します。
UserServiceクラスを作成します。
package com.Service;
import com.User.User;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
@Service
public class UserService {
public User findById(int id){
User user=new User();
if(id==1){
user.setName("张三");
user.setAge(18);
user.setId(1);
}else if(id==2){
user.setName("李四");
user.setAge(18);
user.setId(2);
}
return user;
}
}
UserControllerクラスを作成します。
package com.Controller;
import com.User.User;
import com.Service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
//属性注入
@Autowired
private UserService userService;
public User findById(Integer id){
if(id==null){
return new User();
}
return userService.findById(id);
}
}
テストクラスを作成します。
import com.Controller.UserController;
import com.User.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("a.xml");
UserController userController=(UserController) context.getBean("userController",UserController.class);
User user= userController.findById(2);
System.out.println(user);
}
}
出力:
User{
name='李四', age=18, Id=2}
セッターインジェクション
public class UserController {
//设置一个字段
private UserService userService;
//为这个字段生成一个set方法,然后加上注解
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
//调用bean对象的方法进行使用
public User findById(Integer id){
return userService.findById(id);
}
}
コンストラクター注入
public class UserController3 {
//先生成一个字段
private UserService userService;
//然后生成构造方法,前面加上注解
@Autowired
public UserController3(UserService userService) {
this.userService = userService;
}
}
知らせ:
- アノテーションを使用してBeanを取得することの前提は、クラスをSpringでスキャンできることです。つまり、@ Controller、@ Component、@Serviceなどのいくつかの類似したアノテーションの1つにクラスの前にアノテーションを付ける必要があります。
- これらの3つの注入の最初の操作は、オブジェクトに注入されるフィールドを生成することです。1つ目は、フィールドに直接注釈を付けることです。2つ目は、このフィールドのsetメソッドを生成してから、注釈を付けることです。3つ目は、このフィールドのフィールド。メソッドを作成してから、メソッドに注釈を付けます。使い方は似ていて、機能も同じで、最初のものの方が簡単です。
- コンストラクターを介して注入する場合、現在のクラスにコンストラクターが1つしかない場合は、@ Autowiredアノテーションを省略できます。コンストラクターが複数ある場合は、省略できません。
3回の注射の長所と短所
プロパティ/フィールドインジェクション:
- 利点:シンプルで便利
- 短所:IOCコンテナーにのみ使用でき、非IOCコンテナーにはnullポインター例外があり、デフォルトは非最終であり、循環依存になりがちです
コンストラクター注入:
- 利点:IOCコンテナーによって制限されない強力な汎用性により、注入されたクラスが空にならないようにし、現在のクラスが機能する必要があるクラスをコードで一目で確認できます。
- 短所:複数のインジェクションはコードを非常に面倒にし、複数のインジェクションは単一のデザインのアイデアに準拠しません。コンストラクターインジェクションを使用すると、デフォルトのコンストラクターを使用できなくなります。
メソッド注入の設定:
- 長所:循環依存の問題に耐性がある
- 短所:オブジェクトを最終的に作成できない
@Resourceに注釈を付けます。
@Resourceには、 nameとtypeの2つの重要なプロパティがあります。Springは
nameプロパティをBeanの名前に解決し、typeプロパティをBeanのタイプに解決します。
オブジェクトインジェクションは、@ Autowiredと同様に、@Resourceを介して実行することもできます。
1.プロパティインジェクション
public class UserController {
//添加注解在字段上
@Resource
private UserService userService;
public User findUser(Integer id){
return userService.findById(id);
}
}
2.コンストラクタインジェクション
public class UserController2 {
private UserService userService;
//先创建字段,然后添加注释在构造方法上
@Resource
public void setUserService(UserService userService) {
this.userService = userService;
}
public User findUser(Integer id){
return userService.findById(id);
}
}
知らせ!!
- @Resourceにはコンストラクタインジェクションがありません
@Resourceと@Autowiredの違い
- ソースは異なります。@AutowiredはSpringフレームワークからのものであり、@ResourceはJDKからのものです。
- アクションの範囲は異なります。@Autowiredはプロパティインジェクション、セッターインジェクション、コンストラクターインジェクションを実行できますが、@Resourceはプロパティインジェクションとセッターインジェクションのみを実行できます。
- さまざまな関数、@ Resourceはより多くのプロパティで使用できますが、@ Autowiredはより少ないプロパティをサポートします。たとえば、@ Resourceをnameプロパティとともに使用して、オブジェクトのエイリアスインジェクションを完了することができます。
- 注入方法は異なります。@AutowiredはbyTypeに従って、つまりBeanのタイプに従って注入されますが、@ResourceはbyNameに従って注入されます。
注入されたオブジェクト名の問題
オブジェクトをクラスに注入すると、@ Autowiredと@Resourceがオブジェクトを取得しようとします。そのため、最初にオブジェクトを見つける必要があります。
このオブジェクトを検索するときは、2つの基準に従って検索されます。1つはオブジェクト名で、もう1つはオブジェクトタイプです。
- まず、名前に従って取得します。取得できない場合は、タイプに従って取得します。取得できない場合は、例外をスローします。
- 名前が一致しないがタイプが一致し、同じタイプが一致するオブジェクトが複数ある場合も例外がスローされ、どれであるかを判別できません。
検索時には、さまざまな解決策があります。@ Resource
(name = "")を介してBeanを指定できます。
また、@ Qualifier修飾子を使用して、検索対象のBeanを修飾することもできます。
@Resource
@Qualifier("user1")
private UserService userService;