2016-04-06 6 views
5

Я определил класс MyFrontService в банке, вот как я хочу, чтобы использовать его:Есть ли примечание Spring, которое заменяет ClassPathXmlApplicationContext.getBean?

import blabla.MyFrontService; 

public class Main { 
    public static void main(String[] args) { 
     MyFrontService.doThis(); 
    } 
} 

FrontService служит точкой входа для доступа к другим службам. Вот как это определено в настоящее время (и оно работает).

MyFrontService.java:

public class MyFrontService { 

    public static void doThis(){ 

     ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/springBeans.xml"); 
     MyService1 myService1 = (MyService1) context.getBean("myService1"); 
     myService1.doSomething(); 
     context.close(); 

    } 
} 

MyService1.java:

package blabla.service; 

@Service("myService1") 
public class MyService1 { 

    public void doSomething(){ 
     // some code 
    } 
} 

SRC/главная/ресурсы/META-INF/springBeans.xml:

(...) 
<context:annotation-config /> 
<context:component-scan base-package="blabla.service" /> 
(...) 

Я хотел бы для замены кода MyFrontService.java примерно следующим образом:

@MagicAnnotation("what_path?/springBeans.xml") 
public class MyFrontService { 

    @Autowired 
    private static MyService1 myService1; 

    public static void doThis(){ 
     myService1.doSomething();    
    } 
} 

Я много читал из других вопросов на этом веб-сайте и других. Иногда говорят, что это невозможно, и иногда используются аннотации, такие как @Configuration, @Import и другие, но я не могу заставить их работать. Например, с помощью

@ImportResource("classpath:META-INF/springBeans.xml") 

вызывает NullPointerException при вызове myService1.doSomething().

Если это возможно, какая аннотация и какой путь использовать?

+0

Нет, нет никакой магии. Что-то должно обрабатывать аннотации. Это что-то весна. Если вы не сообщите Spring об этом, инициализируя «ApplicationContext», как он должен знать, чтобы это сделать? – Savior

+0

Точкой входа в любое приложение на основе Spring является «ApplicationContext». – Savior

+1

Кроме того, Spring не делает '@ Autowired' с' static' ничего. – Savior

ответ

-1

если вы пометили свой класс MyFrontService аннотацией @Component, которая должна сохранить головную боль при выполнении всего, что вы делаете. если вы не хотите добавлять аннотацию и не хотите иметь все под пружинной конфигурацией, вы можете определить класс, как показано ниже.

import org.springframework.beans.BeansException; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.ApplicationContextAware; 

public class SpringContextUtil implements ApplicationContextAware { 

    private static ApplicationContext applicationContext; 


    public static ApplicationContext getApplicationContext() { 
      return applicationContext; 
     } 


    @Override 
    public void setApplicationContext(
      org.springframework.context.ApplicationContext ctx) 
      throws BeansException { 
     applicationContext = ctx; 
    } 


} 

И тогда в любом классе вы можете сделать,

ApplicationContext ctx = SpringContextUtil.getApplicationContext(); 
     BeanClass av = ctx.getBean(BeanClass.class); 
+0

Что называется 'setApplicationContext' здесь? – Savior

+0

просто зарегистрируйте этот компонент в сервлете диспетчера, и он должен выполнить настройку. – chetank

+0

Что заставляет вас думать, что это приложение сервлета? – Savior

1

Используйте Spring Boot рамки, и вы будете иметь возможность написать что-л, как этот

@Controller 
@EnableAutoConfiguration 
public class SampleController { 

    @RequestMapping("/") 
    @ResponseBody 
    String home() { 
     return "Hello World!"; 
    } 

    public static void main(String[] args) throws Exception { 
     SpringApplication.run(SampleController.class, args); 
    } 
} 
Смежные вопросы