Spring, работа с аннотациями @Configuration и @Bean

У меня есть код: я

@Configuration
public class BeanSample {

    @Bean(destroyMethod = "stop")
    public SomeBean someBean() throws Exception {
        return new SomeBean("somebean name1");
    }


    class SomeBean {

        String name;

        public SomeBean(String name) {
            this.name = name;
        }

        public void stop() {
            System.out.println("stop");
        }
    }

    public static void main(String[] args) throws Exception {

        BeanSample beanSample = new BeanSample();
        SomeBean someBean1 = beanSample.someBean();

        ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(
                new String[] {"appContext.xml"});

        SomeBean someBean2 = (SomeBean) appContext.getBean("someBean");

        if (someBean1 == someBean2) System.out.println("OK");

    }
}

Я ожидаю, что после запуска приложения BeanSample.getSomeBean () затем SomeBean станет доступнымsomeBean.

Но теперь у меня есть ошибка:Боб не названsomeBean» определено

На самом деле, я не понимаю, какой контекст приложения я должен использовать, чтобы забрать мои бобы?

О @Configuration:

Любые причины, почему я должен использовать аннотацию @Configuration здесь? (с этим мой IDE выделяет мои классы, как тогда связанные с Spring, так что это должно иметь смысл)

-ОК: после того, как я получил ответ, мой код выглядит так:

 public static void main(String[] args) throws Exception {

        AnnotationConfigApplicationContext appContext = new AnnotationConfigApplicationContext(BeanSample.class);

        SomeBean someBean2 = (SomeBean) appContext.getBean("someBean");

        if (someBean2 != null) System.out.println("OK");

    }

Ответы на вопрос(3)

@Configuration конфигурация bean-компонента (то, что вы ранее определили с помощью XML-файла контекста, теперь определяется с помощью вашего Java-кода @Configuration)

Это создаст контекст приложения с BeanSample, предоставляя конфигурацию компонента:

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(BeanSample.class);

Теперь в вашем:@Configuration

@Bean
public SomeBean someBean() throws Exception {
    return new SomeBean("somebean name1");
}

имя bean-компонента - это имя метода.someBean», в вашем случае вы назвали бин какgetSomeBean»

Итак, чтобы найти компонент, вы должны сделать:

SomeBean bean = appContext.getBean("someBean", SomeBean.class);
 ses11 окт. 2012 г., 19:48
этот ответ тоже хорош. Спасибо
Решение Вопроса

если вы используете конфигурацию Java, вы должны создать свой контекст следующим образом:

new AnnotationConfigApplicationContext(BeanSample.class)

Во-вторых,@Configuration аннотация несделать боб из аннотированного класса. Только@Bean методы используются для создания бобов.

Если вы хотите иметьBeanSample боб тоже, вы должны создать другой@Bean метод, который создает один. Но опять же, зачем вам это? Я думаю, что@Configuration Класс должен использоваться только в качестве контейнера конфигурации, а не для чего-либо еще.

В-третьих, имена компонентов по умолчанию для@Bean не следуйте соглашениям приобретателей собственности. Имена методов используются напрямую, что означает, что в вашем примере бин будет названgetSomeBean и неsomeBean, Измените метод на этот:

@Bean(destroyMethod = "stop")
public SomeBean someBean() throws Exception {
    return new SomeBean("somebean name1");
}

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

 rolve11 окт. 2012 г., 18:29
И я изменил свой ответ. ;)
 ses11 окт. 2012 г., 18:29
Хорошо, тогда я изменил свой вопрос.
 rolve11 окт. 2012 г., 18:53
Обновил мой ответ еще раз. По сути, функции Spring, такие как внедрение зависимостей, работают, только если вы используете класс как@Configuration и не создавать его непосредственно.
 ses11 окт. 2012 г., 18:42
Хорошо. оно работает. Я также переместил BeanSample - чтобы не быть внутренним. Также предоставлен конструктор по умолчанию для BeanSample. Пытаясь понять, почему мне нужно: @Configuration затем ..
 ses11 окт. 2012 г., 19:44
Да хорошо. тогда BeanSample не является бобом .. но он запускается весной, если это с конфигурацией .. Я вижу. Также требуется: cglib добавляется в мой pom.xml (иначе @Configuration не работает). [Я'я собираюсь поместить мой код, как это в пост]. Благодарю.

Боб, произведенный

@Bean
public SomeBean getSomeBean() 

будет иметь имя по умолчанию - и это имя метода производителяgetSomeBean

Таким образом, вы можете сделать две вещи

@Bean
public SomeBean getSomeBean() {...}   
...
SomeBean bean = (SomeBean) appContext.getBean("getSomeBean");
if (bean != null) System.out.println("OK");

или же

@Bean(name="someBean")
public SomeBean getSomeBean() {...}  
...
SomeBean bean = (SomeBean) appContext.getBean("someBean");
if (bean != null) System.out.println("OK");

Некоторый полный примеря использовалAnnotationConfigApplicationContext вместоClassPathXmlApplicationContext

import java.util.Arrays;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BeanSample {

    @Bean(name="someBean")
    public SomeBean getSomeBean() throws Exception {
        return new SomeBean("somebean name1");
    }

    class SomeBean {

        String name;

        public SomeBean(final String name) {
            this.name = name;
        }

        public void stop() {
            System.out.println("stop");
        }
    }

    public static void main(final String[] args) throws Exception {

        AnnotationConfigApplicationContext appContext = new AnnotationConfigApplicationContext(BeanSample.class);

        BeanSample beanSample = (BeanSample) appContext.getBean("beanSample");

        //next time use this to have a look at the beans in the context!
        System.out.println(Arrays.toString(appContext.getBeanDefinitionNames()));

        SomeBean bean = (SomeBean) appContext.getBean("someBean");
        if (bean != null) System.out.println("OK");

    }
}

ВЫХОД:

[Org.springframework.context.annotation.internalConfigurationAnnotationProcessor, org.springframework.context.annotation.internalAutowiredAnnotationProcessor, org.springframework.context.annotation.internalRequiredAnnotationProcessor, org.springframework.context.annotation.internalCommonAnnotationProcessor, org.springframework.context.annotation.internalPersistenceAnnotationProcessor , beanSample, org.springframework.context.annotation.ConfigurationClassPostProcessor $ ImportAwareBeanPostProcessor # 0, someBean] ОК

 ses11 окт. 2012 г., 18:49
Почему я должен использовать @Configuration здесь? (Я добавил этот вопрос в пост)
 Ralph11 окт. 2012 г., 21:08
Чтобы пометить этот класс как тот, который настраивает контекст весны

Ваш ответ на вопрос