복붙노트

[SPRING] 스프링 주석을 사용하여 맵에 값 삽입

SPRING

스프링 주석을 사용하여 맵에 값 삽입

나는 봄을 사용하고있다. 대부분 구성 요소와 서비스를 주입 할 것입니다. 하지만 이제 enum 키와 함께 "캐시"구현의 값을 주입 한지도를 초기화하여 주어진 캐시를 새로 고치는 객체를 얻을 수 있도록 열거 형을 지정하고 싶습니다.

Map<String,Cache>

Key           Value
"category"    @Inject Category     
"attr"        @Inject Attr
"country"     @Inject Country

내 수업은 좋아.

public abstract class Cache{
    refreshCache() {
      clearCache();
      createCache();
    }
    clearCache();
    createCache();
}

@Component
@Scope("singleton")
@Qualifier("category")
class Category extends Cache{}

@Component
@Scope("singleton")
@Qualifier("attr")
class Attr extends Cache{}

@Component
@Scope("singleton")
@Qualifier("country")
class Country extends Cache{}

그것은 XML (벨로우즈 또는 링크처럼)로 할 수 있지만 주석으로 처리하고 싶습니다.

<property name="maps">
        <map>
            <entry key="Key 1" value="1" />
            <entry key="Key 2" value-ref="PersonBean" />
            <entry key="Key 3">
                <bean class="com.mkyong.common.Person">
                    <property name="name" value="mkyongMap" />
                    <property name="address" value="address" />
                    <property name="age" value="28" />
                </bean>
            </entry>
        </map>
    </property>

해결법

  1. ==============================

    1.Spring 컨텍스트에 다음과 같은 bean이 있다면 :

    Spring 컨텍스트에 다음과 같은 bean이 있다면 :

    @Component("category")
    class Category extends Cache { }
    
    @Component("attr")
    class Attr extends Cache { }
    
    @Component("country")
    class Country extends Cache { }
    

    싱글 톤으로 스코프를 명시 적으로 설정할 필요가 없다는 것을 명심하십시오. 이것이 스프링의 기본값이기 때문입니다. 게다가 @Qualifier를 사용할 필요가 없습니다. @Component ( "beanName")를 통해 bean 이름을 설정하면 충분합니다.

    싱글 톤 빈 인스턴스를 맵에 삽입하는 가장 간단한 방법은 다음과 같습니다.

    @Autowired
    Map<String, Cache> map;
    

    이렇게하면 캐시의 모든 하위 클래스가 맵에 효과적으로 자동으로 연결되며 키는 빈 이름이됩니다.

  2. ==============================

    2.Spring Expression Language를 사용하여이를 수행 할 수 있습니다.

    Spring Expression Language를 사용하여이를 수행 할 수 있습니다.

    아래지도 정의가 변형되었습니다.

    <property name="maps">
        <map>
            <entry key="Key 1" value="1" />
            <entry key="Key 2" value-ref="PersonBean" />
            <entry key="Key 3">
                <bean class="com.mkyong.common.Person">
                    <property name="name" value="mkyongMap" />
                    <property name="address" value="address" />
                    <property name="age" value="28" />
                </bean>
            </entry>
        </map>
    </property>
    

    주석 기반. 아래는 코드입니다.

    @Component("PersonBean")
    public class PersonBean {
        public String getMessage() {
            return "hello!";
        }
    }
    
    package com.mkyong.common;
    
    public class Person {
        private String name;
        private String address;
        private int age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import com.mkyong.common.Person;
    
    @Configuration
    public class PersonConfiguration {
        @Bean
        public Person person() {
            Person person = new Person();
            person.setName("mkyongMap");
            person.setAddress("address");
            person.setAge(28);
            return person;
        }
    }
    
    import java.util.Map;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import com.mkyong.common.Person;
    
    @Controller
    public class TestController {
    
        @Value("#{{'Key 1':1, 'Key 2':@PersonBean, 'Key 3': @person}}")
        Map testMap;
    
        @RequestMapping("/test")
        public void testMethod() {
            System.out.println(testMap.get("Key 1"));
            PersonBean personBean = (PersonBean) testMap.get("Key 2");
            System.out.println(personBean.getMessage());
            Person person = (Person) testMap.get("Key 3");
            System.out.println("Name: " + person.getName() + ", Address: "
                    + person.getAddress() + ", Age: " + person.getAge());
        }
    
    }
    
  3. from https://stackoverflow.com/questions/32715156/inject-values-into-map-using-spring-annotation by cc-by-sa and MIT license