Что такое весенняя фасоль
Более официальное объяснение заключается в том, что 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;
}
…
}
Элемент
<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
Добавьте
Аннотация @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")...).