Оригинальный бин Spring собирается вот так

Spring

Что такое весенняя фасоль

Более официальное объяснение заключается в том, что Spring Bean — это общий термин для классов компонентов обработки транзакций и объектов класса сущностей (POJO), которые представляют собой объекты Java, экземпляры которых могут создаваться и управляться контейнером Spring. Компонент можно рассматривать как компонент, который используется для реализации определенной бизнес-функции. Подводя итог, Bean — это объект, который инициализируется, собирается и управляется IOC-контейнером, в остальном он ничем не отличается от других объектов в программе.

Как использовать бин

В Spring bean-компоненты создаются и управляются контейнером Spring, а зависимости между компонентами также управляются контейнером Spring, что значительно снижает нагрузку на разработчиков. Но вам не нужно ничего делать, вы говорите Spring, какие bean-компоненты создать и как их связать. Взгляните на картинку:

Сборка весенних бобов

① Сборка конфигурации на основе xml

Чтобы объявить простой бин, бин можно объявить в xml следующим образом:

<bean id=”foo” class="com.test.Foo" >
    <property name=”fooPro” value=”proVal”>
    <property name=”otherObj” ref=”otherObj”>
</bean>

Здесь объявляется простой бин. Класс для создания бина указывается атрибутом class (требуется полное имя класса), а id является уникальным идентификатором бина. Если значение атрибута id не указано , полное имя класса берется как идентификатор, com.test Класс .Foo определяется следующим образом:

Public Class Foo{
    private string fooPro;
    private OtherObj otherObj;

    public void setFooPro(string fooPro){
        this.fooPro = fooPro;
    }

    public void setOtherObj (OtherObj otherObj){
        this.otherObj = otherObj;
    }

                                        …
}

Элемент реализует внедрение свойства, то есть присвоение «proVal» свойству «fooPro» в com.test.Foo, где вводится постоянное значение. Если bean-компонент зависит от другого bean-компонента, используйте атрибут ref вместо атрибута value для внедрения зависимого bean-компонента, а значение атрибута ref указывает на идентификатор зависимого bean-компонента. Чтобы сделать файл конфигурации кратким, Spring предоставляет пространство имен p для замены элемента свойства. Функция такая же. Краткая конфигурация выглядит следующим образом:

<bean id=”foo” class="com.test.Foo" p:fooPro=”proVal” p:otherObj-ref=“otherObj” ></bean>

Внедрение атрибута постоянного значения: p: имя атрибута = «значение атрибута», внедрение атрибута компонента: p: имя атрибута-ref = «идентификатор компонента, на который делается ссылка». В приведенном выше примере используется внедрение метода установки. Spring также предоставляет метод внедрения конструктора, который кратко представлен (он используется меньше, как правило, в форме внедрения установки):

<bean id=”foo” class="com.test.Foo" >
    <constructor-arg value=”proVal”>
    <constructor-arg ref=”otherObj”>
</bean>

Внедрение значений свойств присваивается последовательно в порядке параметров в конструкторе.

②Сборка на основе кода Java

Чтобы использовать сборку кода Java, сначала необходимо создать класс конфигурации (JavaConfig).

@Configuration
public class FooConf{

    @Bean
    public OtherObj otherObj(){
	    return new OtherObj();
    }

}

@Configuration указывает, что класс является классом конфигурации, аннотация @Bean используется для объявления bean-компонента, а аннотированный метод @Bean информирует Spring о том, что метод вернет bean-компонент и будет зарегистрирован как bean-компонент в контексте приложения Spring.

③Сборка на основе аннотаций (автоматическая сборка)

Spring реализует автоматическую сборку с двух точек зрения:

Первый шаг: сканирование компонентов (component scan), Spring автоматически обнаружит bean-компоненты, созданные в контексте приложения.

Второй шаг: автоматическое связывание, Spring автоматически удовлетворяет зависимости между bean-компонентами.

Создайте сканируемый bean-компонент:

@Component
public class Foo(){

}

Аннотация @Component указывает, что класс является классом компонентов, и он сообщит Spring о необходимости создания bean-компонента для этого класса. Так как же заставить Spring сканировать классы, аннотированные с помощью @Component? Есть два способа:

Включить сканирование компонентов с помощью аннотации @ComponentScan

@Configuration
@ComponentScan
public class FooConf{

}

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

Включить сканирование компонентов с помощью xml

Добавьте в файл конфигурации xml, который совпадает с аннотацией @ComponentScan.

Аннотация @Component позволяет внедрить класс Foo в контейнер Spring, но что, если класс Foo зависит от других классов? Используйте аннотацию @AutoWried.

@Component
public class Foo{
    //成员变量使用@AutoWired
    @AutoWried
    private OtherObj otherObj;
                                    ……
}

@Component
public class Foo{
    private OtherObj otherObj;

    //构造方法使用@AutoWired
    @AutoWried
    public Foo (OtherObj otherObj){
	    this.otherObj = otherObj;
    }

}

@Component
public class Foo{
    private OtherObj otherObj;

    //Setter方法使用@AutoWired
    @AutoWried
    Public void setOtherObj (OtherObj otherObj){
	    this.otherObj = otherObj;
    }

}

Как и выше, аннотацию @AutoWried можно использовать в конструкторах, методах установки или переменных-членах, а функция заключается в внедрении компонентов, от которых зависит класс Foo.

По сути, при запуске Spring IoC контейнер автоматически загружает постпроцессор AutowiredAnnotationBeanPostProcessor, и когда контейнер сканирует @Autowied, @Resource или @Inject, он автоматически находит нужный bean-компонент в IoC-контейнере и собирает свойства объекта. . . .

@Resource также может внедрять bean-компоненты из класса Foo, но @AutoWired по умолчанию подключается по типу, а @Resource подключается по имени. Когда зависимый компонент имеет несколько классов реализации, вы можете использовать аннотацию @Resource для сборки указанного класса реализации (@Resource(name="otherObjImpl1")...).