2014-09-25 2 views
1

У меня есть rowcallBackHandler от JDBCTemplate, но поскольку я использую оператор new, я не могу получить какой-либо компонент Spring внутри rowbackhandler. В принципе, мне нужно перебирать большой набор результатов.как вызвать компонент весны из класса Java

Мне нужно вызвать метод после каждых 1000 записей, но я не могу вызвать метод; сканирование автоуведомления или компонента не работает. Как вставить весенний боб внутри нормального класса Java?

+2

Вы не предоставляете достаточно подробностей, чтобы помочь вам. Что это за приложение? какая у вас конфигурация Spring? можем ли мы взглянуть на фрагмент кода, в котором у вас возникла проблема? –

ответ

2

Похоже, вы хотите динамически вводить свой rowcallbackHandler, потому что вы делаете объект каждый раз, когда выполняете SQL.

Как правило, инъекция зависимостей весны должна использоваться только на одноэлементных объектах (например, Сервисы, DAO и т. Д.). Это обратный вызов, как объекты, не нужно или использовать инъекции зависимостей. Вместо этого вам необходимо связать окружающий однопользовательский объект (@ Service, @ Controller, @ Repository ... и т. Д.) С тем, что нужно вашему callbackhandler, а затем получить доступ к зависимостям через конструктор или регулярное закрытие-как-лексическое охват (я забыл, что его вызывается на Java). Я не знаю, каков ваш уровень навыков на Java, но похоже, что вы не знаете об анонимных классах.

Вот пример использования анонимных классов.

@Service 
public MyService { 
    @Autowired 
    JdbcTemplate template; 
    @Autowired 
    Something something; 

    public void doSomething() { 
     template.query("select * from something", new RowCallbackHandler() { 
      public void processRow(ResultSet rs) { 
       System.out.println(something); 
       //actually do something 
      } 
     }); 
    } 
} 

Это сказанное вы можете автоматически вводить объекты с new Blah(), но это требует @Configurable AspectJ магии (не делайте этого, если вы не знаете, что делаете).

+0

Кажется, что вы отвечаете более полно, я удалил свой , – Aivean

1

Чтобы использовать весенние бобы в нормальном классе Java, вам нужно ApplicationContext, а затем позвоните по телефону getBean, передайте его bean id, который вы указали в своем application-context.xml. Например.

ApplicationContext ctx = new ClassPathXmlApplicationContext("application-context.xml"); 
Foo foo = ctx.getBean("beanId", Foo.class); 
+0

Если я попытался создать bean-компонент, я получаю нулевое значение для bean-компонентов, созданных внутри bean-компонента, в этом случае, если класс Foo имеет какой-либо автообученный bean-компонент, он не инициализируется. – Hari

+0

@Hari вы можете вставить вам application-context.xml, потому что он должен работать нормально, я реплицирую локально поведение, как вы указали, и, кажется, нет проблем с Autowired или Component – sol4me

Смежные вопросы