Подтвердить что ты не робот

Скрытые черты структуры Spring?

После просмотра многих скрытых функций о языке программирования я хотел бы знать скрытые функции структуры Spring de facto. Как вы знаете, документация Spring скрывает многие функции, и было бы неплохо поделиться ею.

И вы: какая скрытая функция рамки Spring вы знаете?

4b9b3361

Ответ 1

Spring имеет мощный встроенный StringUtils класс

Обратите внимание на следующий массив, содержащий набор id

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

И вы хотите удалить дубликаты ссылок. Просто сделайте это

idArray = StringUtils.removeDuplicateStrings(idArray);

Теперь idArray будет содержать { "0", "1", "2", "5" }.

И многое другое.


Можно ли использовать класс Controller без объявления их в файле контекста веб-приложения?

Да, просто поместите @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;    

}

Итак, в Team validator поставьте

@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();
        }

    }

}

Наследование в веб-формах?

Использовать ServlerRequestDataBinder вместе со скрытым флагом формы

public class Command {

    private Parent parent;

}

public class Child extends Parent { ... }

public class AnotherChild extends Parent { ... }

И в вашем контроллере сделайте следующее

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());
}

Spring имеет встроенный класс сканера 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());

Spring имеет полезный org.springframework.util.FileCopyUtils класс. Вы можете скопировать загруженный файл с помощью

public ModelAndView action(...) throws Exception {

    Command command = (Command) command;

    MultiPartFile uploadedFile = command.getFile();

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

Если вы используете контроллер на основе аннотаций (Spring 2,5+) или простой MVC Spring, вы можете использовать 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.

И так далее...

Ответ 2

Spring может использоваться как замена шины события, так как ApplicationContext также является ApplicationEventPublisher

Референсная реализация Spring находится в SimpleApplicationEventMulticaster, которая может произвольно использовать пул потоков для асинхронного распространения событий.

Ответ 3

Один из них - использование прокси-класса класса CGLib для Spring АОП. Это также можно сделать с помощью динамических прокси-серверов Java, но по умолчанию используется CGLib. Поэтому не удивляйтесь, если вы увидите CGLib в трассировке стека.

Другое - использование AOP для DI. Да, это все АОП, не зная об этом. Приятно знать, что ваш код основан на AOP, даже если вы используете только Spring для целей DI.

Ответ 4

Горячая замена spring beans во время выполнения.

Это полезно для тестирования.

см. здесь

Ответ 5

Лучший способ найти любые скрытые функции в Spring потребует просто взглянуть на исходный код.

Трудно сказать, что такое скрытая функция, но поскольку Spring очень гибкая с аннотациями, AspectJ и использованием DI.

Ответ 6

В отличие от типичного проприетарного программного обеспечения исходный код для Spring доступен всем, кто хочет его загрузить.

Следовательно, Spring НЕ содержит скрытых функций. Это просто черты, которые вы еще не видели...