Как работает электропроводка весной?

Все говорят использовать isset () - что, вероятно, будет работать для вас.

Однако важно понимать разницу между

$_POST['x'] = NULL; и $_POST['x'] = '';

isset($_POST['x']) вернет false в первом примере, но вернет true на второй, даже если вы попытаетесь распечатать один из них, оба возвращают пустое значение.

Если ваш $_POST поступает из введенного пользователем поля / формы и остается пустым, я ВЕРЮ (я не на 100% уверен в этом), что значение будет «", но NOT NULL.

Даже если это предположение неверно (кто-то, пожалуйста, поправьте меня, если я ошибаюсь!) выше все еще полезно знать для будущего использования.

464
задан Mahozad 2 July 2018 в 15:34
поделиться

2 ответа

Первое и самое важное - все компоненты Spring управляются - они «живут» внутри контейнера, называемого «контекстом приложения».

Во-вторых, каждое приложение имеет точку входа в этот контекст. У веб-приложений есть сервлет, JSF использует el-resolver и т. Д. Также есть место, где контекст приложения загружается, а все bean-компоненты - автоматически подключаются. В веб-приложениях это может быть прослушиватель запуска.

Автоматическое подключение происходит путем помещения экземпляра одного компонента в желаемое поле в экземпляре другого компонента. Оба класса должны быть bean-компонентами, т.е. они должны быть определены для работы в контексте приложения.

Что «живет» в контексте приложения? Это означает, что объект контекст создает экземпляры, а не вы. Т.е. - вы никогда не делаете new UserServiceImpl () - контейнер находит каждую точку инъекции и устанавливает там экземпляр.

В ваших контроллерах у вас есть только следующее:

@Controller // Defines that this class is a spring bean
@RequestMapping("/users")
public class SomeController {

    // Tells the application context to inject an instance of UserService here
    @Autowired
    private UserService userService;

    @RequestMapping("/login")
    public void login(@RequestParam("username") String username,
           @RequestParam("password") String password) {

        // The UserServiceImpl is already injected and you can use it
        userService.login(username, password);

    }
}

Несколько примечаний:

  • В вашем applicationContext.xml вы должны включить , чтобы классы сканировались на предмет аннотаций @Controller , @Service и т. д.
  • Точкой входа для приложения Spring-MVC является DispatcherServlet, но он скрыт от вас, и, следовательно, прямое взаимодействие и начальная загрузка контекста приложения происходит за кулисами.
  • UserServiceImpl также должен быть определен как bean - либо с использованием , либо с использованием аннотации @Service . Поскольку это будет единственный разработчик UserService , он будет внедрен.
  • Помимо аннотации @Autowired , Spring может использовать конфигурируемое XML автосоединение. В этом случае во все поля, которые имеют имя или тип, совпадающие с существующим bean-компонентом, автоматически внедряется bean-компонент. Фактически, это была первоначальная идея автосоединения - вводить в поля зависимости без какой-либо конфигурации. Также можно использовать другие аннотации, такие как @Inject , @Resource .
673
ответ дан 22 November 2019 в 22:47
поделиться

Зависит от того, пошли ли вы по маршруту аннотаций или по маршруту определения XML-компонента.

Допустим, у вас есть bean-компоненты, определенные в вашем applicationContext.xml :

<beans ...>

    <bean id="userService" class="com.foo.UserServiceImpl"/>

    <bean id="fooController" class="com.foo.FooController"/>

</beans>

Автоматическое подключение происходит при запуске приложения. Итак, в fooController , который ради аргументов хочет использовать класс UserServiceImpl , вы должны аннотировать его следующим образом:

public class FooController {

    // You could also annotate the setUserService method instead of this
    @Autowired
    private UserService userService;

    // rest of class goes here
}

Когда он видит @Autowired , Spring будет искать класс, соответствующий свойству в applicationContext , и автоматически вводить его. Если у вас более одного bean-компонента UserService , вам необходимо указать, какой из них он должен использовать.

Если вы сделаете следующее:

UserService service = new UserServiceImpl();

Он не подберет @Autowired , если вы не установите его самостоятельно.

64
ответ дан 22 November 2019 в 22:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: