スプリングインジェクションは、手動インジェクションと自動インジェクションの2種類に分けられます。
ここで記録したいのは自動インジェクションです。
自動モデル注入
4つのスプリング自動噴射モデルがあります。
- autowire_no(0):デフォルトのアセンブリモード。indexBeanが挿入されている場合、@ Autowiredまたは@Resourceは属性に追加されません。現時点では、indexBeanを挿入できません。
- autowire_name(1):setメソッドを介して、setメソッドの名前はBeanの名前byNameと一致している必要があります
- autowire_type(2):setメソッドを介して、この方法でsetメソッドに任意の名前を付けることができます。これは、BeanがsetメソッドのパラメータータイプbyTypeに従って注入されるためです。
- autowire_constructor(3):コンストラクターを介して注入します。indexBeanがuserBeanに注入される場合は、indexBeanを持つコンストラクターを提供する必要があります。それ以外の場合はnullです。
スプリングのデフォルトの自動注入モデルは0であり、@ Autowiredまたは@Resourceアノテーションを介して注入する必要があります。ゼロ以外の場合、これら2つのアノテーションは提供されない可能性があります。
応用
autowire_name
指定する自動注入モデルがautowire_bynameの場合、setメソッドを指定するだけでよく、setメソッドのメソッド名は注入された属性の値である必要があります。そうでない場合は注入されません。
@Component
public class IndexBean {
}
@Component
public class UserBean {
private IndexBean indexBean;
public void setIndexBean123(IndexBean indexBean) {
System.out.println("通过set方法注入属性");
this.indexBean = indexBean;
}
public void setIndexBean(IndexBean indexBean){
System.out.println("空参setIndex方法执行");
this.indexBean = indexBean;
}
public void test() {
System.out.println("注入的indexBean属性是:" + indexBean);
}
}
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory)
throws BeansException {
GenericBeanDefinition userBean = (GenericBeanDefinition) configurableListableBeanFactory
.getBeanDefinition("userBean");
System.out.println("默认的autowireMode是:" + userBean.getAutowireMode());
userBean.setAutowireMode(1);
}
}
ここでのMyBeanFactoryPostProcessorは、カスタマイズしたbeanFactoryPostProcessor実装クラスです。ここでは、beanDefinitionの自動インジェクションモデルを変更しようとしています。これは、スプリング初期化メカニズムに関連しています。BeanをbeanDefinitionsに変換するスプリングの実行順序について詳しく説明しました。
ここでは、自動注入モデルを1、つまりautowire_bynameに設定しました。この場合、Beanにプロパティを注入するときに、@ Autowired、@ Resourceなどのアノテーションを指定する必要はありません。
上記のコードを実行すると、UserBeanのsetIndexBean()メソッドが実行されます。
public class AutowireModeTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutowiredModelConfig.class);
UserBean userBean = ac.getBean(UserBean.class);
userBean.test();
}
}
执行结果:
空参setIndex方法执行
注入的indexBean属性是:com.spring.study.autowiremode.IndexBean@1622f1b
autowire_type
指定する自動注入モデルがautowire_tyoeの場合、setメソッドのみを指定する必要があります。メソッド名は任意ですが、setで始まる必要があり、setメソッドのパラメーターは注入するタイプである必要があります。
上記を追加するだけです
userBean.setAutowireMode(1);改为userBean.setAutowireMode(2);
このとき、userBeanの自動注入モデルはbyTypeです。再度実行すると、2つのsetメソッドが順番に呼び出されます。2つのsetメソッドを提供したため、名前は異なりますが、入力パラメーターはindexBeanであるため、また、setメソッドのパラメーターがindexBean型であり、メソッド名がsetで始まることを確認するだけでよいことも説明されています。setA、setB、setCのいずれであるかは関係ありません。
の結果
空参setIndex方法执行
通过set方法注入属性
注入的indexBean属性是:com.spring.study.autowiremode.IndexBean@e056f20
autowire_constructor
自動インジェクションモデルを3に変更してから、UserBeanのパラメーターなしコンストラクターとパラメーター化コンストラクターをそれぞれ増やします。
@Component
public class UserBean {
private IndexBean indexBean;
public UserBean(IndexBean indexBean) {
System.out.println("userBean带参构造函数");
this.indexBean = indexBean;
}
public UserBean(){
System.out.println("userBean空参构造函数");
}
public void setIndexBean123(IndexBean indexBean) {
System.out.println("通过set方法注入属性");
this.indexBean = indexBean;
}
public void setIndexBean(IndexBean indexBean){
System.out.println("空参setIndex方法执行");
this.indexBean = indexBean;
}
public void test() {
System.out.println("注入的indexBean属性是:" + indexBean);
}
}
このときの実行結果は次のとおりです。
userBean带参构造函数
注入的indexBean属性是:com.spring.study.autowiremode.IndexBean@78b66d36
結論として
上記のコードは、自動インジェクションモデルが1、2、および3のいずれかに設定されている場合、@ Autowiredまたは@Resourceアノテーションを提供する必要がないことを完全に証明できます。以前に理解した@Autowiredは、に従って検索することです。最初にタイプを入力し、次に名前検索によると、このステートメントはautowireModeが0のシナリオのみを対象としています。