Доступ к аргументам java в автономном приложении весной [дубликат]

Статический метод имеет две основные цели:

  1. Для служебных или вспомогательных методов, которые не требуют какого-либо состояния объекта. Поскольку нет необходимости обращаться к переменным экземпляра, статические методы устраняют необходимость того, чтобы вызывающий объект создавал экземпляр объекта только для вызова метода.
  2. Для состояния, которое используется всеми экземплярами класса, например счетчиком. Все экземпляры должны иметь одно и то же состояние. Методы, которые просто используют это состояние, также должны быть статическими.
62
задан Jonik 11 April 2013 в 12:51
поделиться

3 ответа

Spring работает в автономном приложении. Вы используете неправильный способ создания весеннего боба. Правильный способ сделать это следующим образом:

@Component
public class Main {

    public static void main(String[] args) {
        ApplicationContext context = 
            new ClassPathXmlApplicationContext("META-INF/config.xml");

        Main p = context.getBean(Main.class);
        p.start(args);
    }

    @Autowired
    private MyBean myBean;
    private void start(String[] args) {
        System.out.println("my beans method: " + myBean.getStr());
    }
}

@Service 
public class MyBean {
    public String getStr() {
        return "string";
    }
}

В первом случае (в вопросе) вы сами создаете объект, а не получаете его из контекста Spring. Поэтому Spring не дает возможности Autowire зависимостям (что вызывает NullPointerException).

Во втором случае (в этом ответе) вы получаете компонент из контекста Spring и, следовательно, управляете Spring, а Spring заботится о autowiring.

122
ответ дан Abhinav Sarkar 17 August 2018 в 17:41
поделиться
  • 1
    Разве @Autowired олл-ин стратегии? Либо весна управляет all созданием объекта none, но вы не можете добавить @Autowired в некоторые поля в вашем стеке вызова и создать их с помощью new .. (). – Cojones 18 March 2011 в 18:16
  • 2
    @Cojones, вы можете autowire некоторые бобы и создавать другие с новыми, иначе как вы когда-нибудь сможете назвать new ArrayList(), например? Если у вас есть класс с автоуведомленными параметрами, и вы создаете его с помощью new, то автоустановка не состоится. – Paul 30 July 2011 в 20:24
  • 3
    Возможно, вам также понадобится это в вашем файле config.xml: <context:annotation-config /> <context:component-scan base-package="com.yourcompany.mycomponents" /> – Mikael Vandmo 9 April 2013 в 14:30
  • 4
    Не забывайте аннотацию @Component над Main, иначе вы получите No qualifying bean типа [..]. Пришло время понять. – TinusSky 22 June 2014 в 12:56
  • 5
    @TinusSky даже с тем, что у меня нет готового компонента типа..error – vaske 22 June 2016 в 23:43

Spring отходит от файлов XML и сильно использует аннотации. Следующий пример представляет собой простое автономное приложение Spring, которое использует аннотацию вместо XML-файлов.

package com.zetcode.bean;

import org.springframework.stereotype.Component;

@Component
public class Message {

   private String message = "Hello there!";

   public void setMessage(String message){

      this.message  = message;
   }

   public String getMessage(){

      return message;
   }
}

Это простой компонент. Он украшен аннотацией @Component для автоматического обнаружения весенним контейнером.

package com.zetcode.main;

import com.zetcode.bean.Message;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;

@ComponentScan(basePackages = "com.zetcode")
public class Application {

    public static void main(String[] args) {

        ApplicationContext context
                = new AnnotationConfigApplicationContext(Application.class);

        Application p = context.getBean(Application.class);
        p.start();
    }

    @Autowired
    private Message message;
    private void start() {
        System.out.println("Message: " + message.getMessage());
    }
}

Это основной класс Application. Аннотации @ComponentScan ищут компоненты. Аннотации @Autowired вводят компонент в переменную message. AnnotationConfigApplicationContext используется для создания контекста приложения Spring.

Мой учебник Standalone Spring показывает, как создать автономное приложение Spring с XML и аннотациями.

16
ответ дан Jan Bodnar 17 August 2018 в 17:41
поделиться
  • 1
    Это решение намного проще, чем xml-решения. Работал для меня очень хорошо. – Kyle Bridenstine 3 April 2018 в 23:52

Для Spring 4, используя Spring Boot, мы можем иметь следующий пример, не используя анти-шаблон для непосредственного получения Bean из ApplicationContext:

package com.yourproject;

@SpringBootApplication
public class TestBed implements CommandLineRunner {

    private MyService myService;

    @Autowired
    public TestBed(MyService myService){
        this.myService = myService;
    }

    public static void main(String... args) {
        SpringApplication.run(TestBed.class, args);
    }

    @Override
    public void run(String... strings) throws Exception {
        System.out.println("myService: " + MyService );
    }

}

@Service 
public class MyService{
    public String getSomething() {
        return "something";
    }
}

Убедитесь, что все ваши инъекционные службы находятся под com.yourproject или его подпакетами.

5
ответ дан Michail Michailidis 17 August 2018 в 17:41
поделиться
Другие вопросы по тегам:

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