2009-09-12 18 views
26

प्रोग्रामिंग भाषा के बारे में कई छिपी हुई विशेषताओं को देखने के बाद, मैं वसंत "डी फैक्टो" ढांचे की छिपी हुई विशेषताओं को जानना चाहता हूं। जैसा कि आप जानते हैं, वसंत दस्तावेज कई विशेषताओं को छुपाता है और इसे साझा करना अच्छा होगा।वसंत ढांचे की छिपी हुई विशेषताएं?

और आप: स्प्रिंग ढांचे की क्या छुपी विशेषता आपको पता है?

उत्तर

0

वसंत में छुपा सुविधाओं को खोजने का सबसे अच्छा तरीका केवल स्रोत कोड को देखने की आवश्यकता होगी।

यह कहना मुश्किल है कि एक छिपी हुई विशेषता क्या है, हालांकि स्प्रिंग एनोटेशन, एस्पेक्टजे और डीआई के उपयोग के साथ बहुत लचीला है।

1

एक वसंत के एओपी के लिए सीजीएलआईबी आधारित कक्षा प्रॉक्सी का उपयोग है। यह जावा की गतिशील प्रॉक्सी के माध्यम से भी किया जा सकता है लेकिन डिफ़ॉल्ट CGLib है। तो अगर आप अपने स्टैक ट्रेस में CGLib देखते हैं तो आश्चर्यचकित न हों।

अन्य डीओ के लिए एओपी का उपयोग है। हां, यह सब कुछ आप जानते हैं बिना एओपी है। यह जानना अच्छा है कि आपका कोड एओपी आधारित है भले ही आप केवल डीआई प्रयोजनों के लिए वसंत का उपयोग कर रहे हों।

27

स्प्रिंग एक शक्तिशाली निर्मित StringUtils वर्ग

सूचना निम्नलिखित सरणी आईडी के

String [] idArray = new String [] {"0", "1", "2", "0", "5", "2"} 

का एक सेट से युक्त है और आप डुप्लिकेट संदर्भ निकालना चाहते हैं। बस इसे

idArray = StringUtils.removeDuplicateStrings(idArray); 

अब idArray में {"0", "1", "2", "5"} होगा।

और भी बहुत कुछ।


क्या वेब नियंत्रक संदर्भ फ़ाइल में उन्हें घोषित किए बिना नियंत्रक वर्ग का उपयोग करना संभव है?

हाँ, बस अपनी घोषणा में @Component डाल (@Controller की उम्मीद के रूप में काम नहीं करता है)

package br.com.spring.view.controller 

@Component 
public class PlayerController extends MultiActionController { 

    private Service service; 

    @Autowired 
    public PlayerController(InternalPathMethodNameResolver ipmnr, Service service) { 
     this.service = service; 

     setMethodNameResolver(ipmnr); 
    } 

    // mapped to /player/add 
    public ModelAndView add(...) {} 

    // mapped to /player/remove 
    public ModelAndView remove(...) {} 

    // mapped to /player/list 
    public ModelAndView list(...) {} 

} 

तो वेब में आवेदन संदर्भ फ़ाइल किसी और निम्नलिखित

<beans ...> 
    <context:component-scan base-package="br.com.spring.view"/> 
    <context:annotation-config/> 
    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"> 
     <property name="order" value="0"/> 
     <property name="caseSensitive" value="true"/> 
    </bean> 
    <bean class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver"/> 
</beans> 

कुछ भी नहीं

डाल

गतिशील रूपों में सत्यापन?

उपयोग निम्नलिखित

public class Team { 

    private List<Player> playerList;  

} 

तो टीम सत्यापनकर्ता में

@Component 
public class TeamValidator implements Validator { 

    private PlayerValidator playerValidator; 

    @Autowired 
    public TeamValidator(PlayerValidator playerValidator) { 
     this.playerValidator = playerValidator; 
    } 

    public boolean supports(Class clazz) { 
     return clazz.isAssignableFrom(Team.class); 
    } 

    public void validate(Object command, Errors errors) { 
     Team team = (Team) command; 

     // do Team validation 

     int index = 0; 
     for(Player player: team.getPlayerList()) { 
      // Notice code just bellow 
      errors.pushNestedPath("playerList[" + index++ + "]"); 

      ValidationUtils.invokeValidator(playerValidator, player, errors); 

      errors.popNestedPath(); 
     } 

    } 

} 

वेब फ़ॉर्म में विरासत डाल?

उपयोग छिपे स्वरूप झंडा

public class Command { 

    private Parent parent; 

} 

public class Child extends Parent { ... } 

public class AnotherChild extends Parent { ... } 

के साथ और अपने नियंत्रक में ServlerRequestDataBinder निम्न उपाय अपनाते हैं

public class MyController extends MultiActionController { 

    public ModelAndView action(HttpServletRequest request, HttpServletResponse response, Object command) { 

     Command command = (Command) command; 

     // hidden form flag 
     String parentChildType = ServletRequestUtils.getRequiredStringParameter(request, "parentChildType"); 

     // getApplicationContext().getBean(parentChildType) retrieves a Parent object from a application context file 
     ServletRequestDataBinder binder = 
      new ServletRequestDataBinder(getApplicationContext().getBean(parentChildType)); 

     // populates Parent child object 
     binder.bind(request); 

     command.setParent((Parent) binder.getTarget()); 
} 

स्प्रिंग एक अंतर्निहित में स्कैनर वर्ग ClassPathScanningCandidateComponentProvider। उदाहरण के लिए, आप एनोटेशन खोजने के लिए इसका इस्तेमाल कर सकते हैं।

ClassPathScanningCandidateComponentProvider scanner = 
    new ClassPathScanningCandidateComponentProvider(<DO_YOU_WANT_TO_USE_DEFAULT_FILTER>); 

scanner.addIncludeFilter(new AnnotationTypeFilter(<TYPE_YOUR_ANNOTATION_HERE>.class)); 

for (BeanDefinition bd : scanner.findCandidateComponents(<TYPE_YOUR_BASE_PACKAGE_HERE>)) 
    System.out.println(bd.getBeanClassName()); 

स्प्रिंग एक उपयोगी org.springframework.util.FileCopyUtils वर्ग है। आप

public ModelAndView action(...) throws Exception { 

    Command command = (Command) command; 

    MultiPartFile uploadedFile = command.getFile(); 

    FileCopyUtils.copy(uploadedFile.getBytes(), new File("destination")); 

का उपयोग कर आप एक एनोटेशन आधारित नियंत्रक (स्प्रिंग 2.5+) या सादा MVC स्प्रिंग नियंत्रक का उपयोग करते हैं द्वारा एक अपलोड की गई फ़ाइल कॉपी कर सकते हैं, तो आप वैश्विक संपत्ति संपादकों रजिस्टर करने के लिए एक WebBindingInitializer उपयोग कर सकते हैं।

public class GlobalBindingInitializer implements WebBindingInitializer { 

    public void initBinder(WebDataBinder binder, WebRequest request) { 
     binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("dd/MM/yyyy", true); 
    } 

} 

की तरह कुछ तो अपने वेब अनुप्रयोग संदर्भ फ़ाइल में, घोषित

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="webBindingInitializer"> 
     <bean class="GlobalBindingInitializer"/> 
    </property> 
</bean> 

इस तरह किसी भी टिप्पणी के आधार पर नियंत्रक किसी भी संपत्ति संपादक का उपयोग कर सकते हैं GlobalBindingInitializer में घोषित कर दिया।

और इसी तरह ... के बाद से ApplicationContext भी एक ApplicationEventPublisher

संदर्भ स्प्रिंग कार्यान्वयन है

11

स्प्रिंग, एक घटना बस स्थानापन्न के रूप में इस्तेमाल किया जा सकता है जो उपयोग वैकल्पिक रूप से कर सकते हैं, SimpleApplicationEventMulticaster में पाया जा सकता है घटनाओं को असीमित रूप से वितरित करने के लिए एक थ्रेड पूल।

+0

उपयोगी सामान, यह। कोड जो काम करता है वह 'SimpleAplicationEventMulticaster' है, जो वैकल्पिक रूप से घटनाओं को असीमित रूप से वितरित करने के लिए थ्रेड पूल का उपयोग कर सकता है। मैं इसे करने के लिए कोड लिखने के लिए ऊब गया हूं। – skaffman

1

रनटाइम पर हॉट स्वैप वसंत बीन्स।

यह परीक्षण के लिए उपयोगी है।

देख here

0

ठेठ मालिकाना सॉफ्टवेयर के विपरीत, वसंत के लिए स्रोत कोड को स्वतंत्र रूप से किसी को भी, जो इसे डाउनलोड करने के लिए परवाह है करने के लिए उपलब्ध है।

इसलिए वसंत में कोई छिपी हुई विशेषताएं नहीं हैं। यह सिर्फ इतना है कि आपने देखा नहीं है ... अभी तक।

संबंधित मुद्दे