blog

Spring Qualified Injection Logic @Qualifierをグループ化する

使用场景实体类自定义注解@Grp进行逻辑分组用配置Beans.xml调用输出源码:-ie...

Sep 11, 2020 · 4 min. read
シェア

利用シーン

同じ型のBeanを複数作成し、そのうちの1つだけをアセンブルするプロパティを使用したい場合、@Qualifierアノテーションと@Autowiredアノテーションを使用することで、どの実Beanがアセンブルされるかを指定し、混乱をなくすことができます。以下に、@Qualifier アノテーションの使用例を示します。

エンティティ・クラス Rumenz/SuperRumenz

package com.rumenz;
public class Rumenz{
 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;
 }
 @Override
 public String toString() {
 return "Rumenz{" +
 "id=" + id +
 ", name='" + name + '\'' +
 '}';
 }
}
package com.rumenz;
public class SuperRumenz extends Rumenz {
 private String type;
 public String getType() {
 return type;
 }
 public void setType(String type) {
 this.type = type;
 }
 @Override
 public String toString() {
 return "SuperRumenz{" +
 "type='" + type + '\'' +
 "} " + super.toString();
 }
}

カスタム・アノテーション @Grp は、クラス・インスタンスで論理グループ化するために使用されます。

package com.rumenz;
import org.springframework.beans.factory.annotation.Qualifier;
import java.lang.annotation.*;
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Qualifier
public @interface Grp {
}

構成 Beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://..//ns"
 xmlns:xsi="http://..//-ce"
 xmlns:util="http://..//il"
 xsi:schemaLocation="
 http://..// https://..///-.sd
 http://..// https://..///-.sd">
 <bean id="rumenz" class="com.rumenz.Rumenz">
 <property name="id" value="123"/>
 <property name="name" value="入門"/>
 </bean>
 <bean id="superRumenz" class="com.rumenz.SuperRumenz" parent="rumenz" primary="true">
 <property name="id" value="456"/>
 <property name="name" value="はじめに - サブクラス"/>
 <property name="type" value="1"/>
 </bean>
</beans>
@Autowired
private Rumenz rumenz; //rumenz---->SuperRumenz

を呼び出します。

package com.rumenz;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import java.util.Arrays;
import java.util.List;
public class DemoApplication {
 @Autowired
 private Rumenz rumenz;
 @Autowired
 @Qualifier("rumenz")
 private Rumenz rumenz1;
 @Autowired
 @Qualifier
 private List<Rumenz> list;
 @Bean
 @Qualifier
 public Rumenz rumenz2(){
 Rumenz r = new Rumenz();
 r.setName("rumenz2");
 r.setId(2);
 return r;
 }
 @Bean
 @Qualifier
 public Rumenz rumenz3(){
 Rumenz r = new Rumenz();
 r.setName("rumenz3");
 r.setId(3);
 return r;
 }
 @Bean
 @Grp
 public Rumenz rumenz4(){
 Rumenz r = new Rumenz();
 r.setName("rumenz4");
 r.setId(4);
 return r;
 }
 @Bean
 @Grp
 public Rumenz rumenz5(){
 Rumenz r = new Rumenz();
 r.setName("rumenz5");
 r.setId(5);
 return r;
 }
 @Autowired
 @Grp
 private List<Rumenz> listGrp;
 
 public static void main(String[] args) {
 AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext();
 XmlBeanDefinitionReader xr=new XmlBeanDefinitionReader(ac);
 xr.loadBeanDefinitions("Beans.xml");
 
 ac.register(DemoApplication.class);
 ac.refresh();
 DemoApplication demoApplication = ac.getBean(DemoApplication.class);
 System.out.println(demoApplication.rumenz.getName());
 System.out.println(demoApplication.rumenz1.getName());
 System.out.println(Arrays.toString(demoApplication.list.toArray()));
 System.out.println(Arrays.toString(demoApplication.listGrp.toArray()));
 ac.close();
 }
}

出力

はじめに - サブクラス
始める
[Rumenz{id=2, name='rumenz2'}, Rumenz{id=3, name='rumenz3'}, Rumenz{id=4, name='rumenz4'}, Rumenz{id=5, name='rumenz5'}]
[Rumenz{id=4, name='rumenz4'}, Rumenz{id=5, name='rumenz5'}]
ソース
Read next

3分でCの配列を理解し、使いこなす!初心者の福音書

C言語は配列データ構造をサポートしており、同じ型の要素の固定サイズの連続したコレクションを格納します。配列は一連のデータを格納するために使用されますが、同じ型の一連の変数として考えられることがよくあります。 number0、number1、...、number99のように1つの変数を宣言するのではなく、number0、number1、...、number99のように1つの変数を宣言します。number99のように1つの変数を宣言するのではなく、numb...のように配列変数を宣言します。

Sep 10, 2020 · 4 min read