자바 SE 구현 IoC 상세 설명
자바 SE 는 세 가지 방식 을 제공 하여 IoC 를 실현 할 수 있 습 니 다.각각:
java.beans 패키지 의 Introspector 클래스 는 getBeanInfo 방법 을 제공 하여 클래스 정 보 를 얻 을 수 있 습 니 다
BeanInfo bi = Introspector.getBeanInfo(User.class,Object.class);메모:자바 beans 에서 set(xxx)방법 에 대해 서 는 writeMethod(),get()방법 에 대해 서 는 readMethod()라 고 통일 적 으로 부 릅 니 다.
Stream.of(bi.getPropertyDescriptors()).forEach(pd->{
        Class<?> propertyType=pd.getPropertyType();
        Method writeMethod=pd.getWriteMethod();
        });
writeMethod.invoke(name,value);우 리 는 AddressEditor 를 설정 해서 이 변환 을 실현 해 야 합 니 다.이 AddressEditor 는 다음 과 같은 두 가지 실현 방식 이 있 습 니 다.
PropertyEditor 인터페이스 구현
Property Editor Support 클래스 를 계승 하여 setAsText 방법 을 다시 씁 니 다.
Property Editor Support 류 는 비교적 편리 한 실현 방식 을 제공 하기 때문에 우 리 는 Property Editor Support 류 를 계승 하 는 방법 으로 유형의 전환 을 실현 합 니 다.
Address 류 의 디자인 은:
public class Address {
    private String name;
    private Integer num;
    //    get / set / toString
}입력 한 문자열 은|name 과 num 속성 을 분할 합 니 다.
예 를 들 어'베 이 커 스 트 리 트|221'이라는 문자열 은'베 이 커 스 트 리 트'를 name,221 을 num 에 부여 하기 때문에 setAsText 방법 을 다시 쓰 는 논 리 는 다음 과 같다.
public class AddressEditor extends PropertyEditorSupport {
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        String[] tokens = text.split("\\|");
        Address address = new Address();
        address.setName(tokens[0]);
        address.setNum(Integer.valueOf(tokens[1]));
        setValue(address);
    }
}
public class DateEditor extends PropertyEditorSupport {
    static final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        LocalDate localDate = LocalDate.parse(text, dtf);
        ZoneId zone = ZoneId.systemDefault();
        Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
        setValue(Date.from(instant));
    }
}
registerEditor(Address.class,AddressEditor.class);
registerEditor(Date.class,DateEditor.class);
PropertyEditor editor=findEditor(propertyType);
if(editor!=null){
    //                    
    editor.setAsText(parameters.get(pd.getName()));
    try{
        writeMethod.invoke(user,editor.getValue());
    }catch(IllegalAccessException|InvocationTargetException e){
        e.printStackTrace();
    }
}else{
    System.out.println("no editor for:"+pd.getName());
}
public static void main(String[]args)throws Exception{
    Map<String, String> parameters=new HashMap<String, String>(){
        {
            //   key  Node        
            put("name","    ");
            put("address","   |221");
            put("birthday","1854-01-06");
        }
    };
    User convert=PropertyEditorSample.convert(parameters);
    System.out.println(convert);
}
User{name='    ', birthday=Thu Jan 05 23:54:17 CST 1854, address=Address{name='   , 221  }}정의 지불 인터페이스 PayService
public interface PayService {
    void pay();
}
public class WeixinpayService implements PayService {
    @Override
    public void pay() {
        System.out.println("    ");
    }
}
public class AlipayService implements PayService {
    @Override
    public void pay() {
        System.out.println("     ");
    }
}
org.snippets.ioc.java.spi.PayService
org.snippets.ioc.java.spi.AlipayService
org.snippets.ioc.java.spi.WeixinpayService
ServiceLoader<PayService> serviceLoader=ServiceLoader.load(PayService.class);
for(PayService ele:serviceLoader){
    ele.pay();
}실행 결과:
알 리 페 이
위 챗 페 이 먼 트
JNDI 방식
Person 클래스 정의
public class Person implements Remote, Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private String password;
    //   set / get  
}
public static void initPerson()throws Exception{
    //  JNDI   JNDI url   。          ,    NoInitialContextException  
    LocateRegistry.createRegistry(3000);
    System.setProperty(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.rmi.registry.RegistryContextFactory");
    System.setProperty(Context.PROVIDER_URL,"rmi://localhost:3000");
    InitialContext ctx=new InitialContext();
    //   person  
    Person p=new Person();
    p.setName("zc");
    p.setPassword("123");
    // person     JNDI   ,JNDI     :person。
    ctx.bind("person",p);
    ctx.close();
}
public static void findPerson()throws Exception{
    //       JNDI   JNDI url        System   ,         
    InitialContext ctx=new InitialContext();
    //  lookup  person  
    Person person=(Person)ctx.lookup("person");
    //       
    System.out.println(person.toString());
    ctx.close();
}이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WeakHashMap,IdentityHashMap,EnumMap다른 맵 구현 클래스와 달리 WeakHashMap 클래스의 키 대상은 간접적으로 약한 인용의 지시 대상으로 저장되며, 키가 정상적으로 사용되지 않을 때 자동으로 항목을 제거합니다.더 정확히 말하면, 주어진 키에 대한...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.