我还没有找到我能理解的高级Spring bean定义。我看到Grails文档和书籍中经常引用它们,但是我认为了解它们的好处将是有益的。那么什么是春豆呢?如何使用它们?他们和依赖注入有关系吗?
我还没有找到我能理解的高级Spring bean定义。我看到Grails文档和书籍中经常引用它们,但是我认为了解它们的好处将是有益的。那么什么是春豆呢?如何使用它们?他们和依赖注入有关系吗?
Answers:
构成应用程序主干并由Spring IoC *容器管理的对象称为bean。Bean是由Spring IoC容器实例化,组装和以其他方式管理的对象。这些bean是使用您提供给容器的配置元数据创建的,例如,以XML
<bean/>
定义的形式。
从SpringSource了解更多有关bean和作用域的信息:
当您创建bean定义时,您实际创建的是创建该bean定义所定义的类的实际实例的方法。bean定义是配方的想法很重要,因为它意味着像一个类一样,您可能从一个配方中创建了许多对象实例。
您不仅可以控制要插入到从特定bean定义创建的对象中的各种依赖项和配置值,还可以控制从特定bean定义创建的对象的范围。这种方法非常强大,可让您灵活地选择通过配置创建的对象的范围,而不必在Java类级别上“接受”对象的范围。可以将Bean定义为部署在多个范围之一中
* IoC:控制反转
@Autowired
吗?还是干脆当我做我import
的?
Spring bean只是由Spring容器管理的实例对象,即,它们是由框架创建和连接的,并放入“对象袋”(容器)中,您可以从那里稍后获取它们。
“接线”部分就是依赖注入的全部含义,这意味着您可以说“我将需要这个东西”,并且框架将遵循一些规则来为您提供适当的实例。
对于不习惯使用Spring的人,我认为Wikipedia Spring的文章有一个很好的描述:
Spring框架的核心是控制容器的倒置,它提供了使用反射配置和管理Java对象的一致方法。容器负责管理特定对象的对象生命周期:创建这些对象,调用其初始化方法以及通过将它们连接在一起来配置这些对象。
容器创建的对象也称为托管对象或 bean。可以通过加载XML文件或检测配置类上的特定Java注释来配置容器。这些数据源包含Bean定义,这些定义提供了创建Bean所需的信息。
可以通过依赖关系查找或 依赖关系注入来获取对象。依赖关系查找是一种模式,在此模式下,调用者向容器对象询问具有特定名称或特定类型的对象。依赖注入是一种模式,其中容器通过构造函数,属性或工厂方法将名称按名称传递给其他对象。
首先让我们了解一下Spring:
Spring是一个轻量级且灵活的框架。
Bean:是一个对象,在Spring容器中创建,管理和销毁。我们可以通过元数据(xml或注释)将对象注入到Spring容器中,这称为控制反转。
打个比方: 让我们假设农民有一块以种子(或豆类)耕种的农田。在这里,农民是Spring框架,农田是Spring容器,Bean是Spring Bean,耕种是Spring Processors。
像bean的生命周期一样,spring bean也有它自己的生命周期。
实例化:首先,spring容器从XML文件中找到bean的定义并实例化bean。
填充属性:使用依赖项注入,spring填充bean定义中指定的所有属性。
设置Bean名称:如果Bean实现BeanNameAware
接口,则spring将Bean的ID传递给setBeanName()
方法。
设置Bean工厂:如果Bean实现BeanFactoryAware
接口,则spring将beanfactory传递给setBeanFactory()
method。
预初始化:也称为bean的后处理。如果有任何与该Bean相关联的Bean BeanPostProcessors,Spring会调用该postProcesserBeforeInitialization()
方法。
初始化bean:如果bean实现IntializingBean
,afterPropertySet()
则调用其方法。如果bean具有init方法声明,则调用指定的初始化方法。
初始化后:–如果BeanPostProcessors
与bean相关联,postProcessAfterInitialization()
则将调用其方法。
准备使用:现在该bean已可以由应用程序使用
销毁:如果bean实现DisposableBean
,它将调用destroy()
方法
春天有装豆袋的IoC容器; 创建,维护和删除是Spring Container的职责。我们可以通过接线和自动接线将bean放入Spring。接线是指我们将其手动配置到XML文件中,而“自动接线”是指将批注放入Java文件中,然后Spring自动扫描java配置文件所在的根上下文,并将其放入Spring的包中。
春豆是类。无需实例化类(使用new
),而是bean
从应用程序上下文获得实例作为对类类型的强制转换,其中Bean是您在应用程序上下文配置中配置的。这样,整个应用程序将在整个应用程序中维护单例作用域实例。在实例化应用程序上下文之后,立即按照其配置顺序初始化所有bean。即使您的应用程序中未包含任何bean,在创建应用程序上下文后即刻已经创建了所有bean实例。
Bean是POJO(普通Java对象),由spring容器管理。
Spring容器默认只创建一个bean实例。该bean被缓存在内存中,因此对该bean的所有请求都将返回对同一bean的共享引用。
@Bean批注返回一个对象,该对象在应用程序上下文中作为一个bean注册。方法内部的逻辑负责创建实例。
什么时候使用@Bean批注?
如果无法进行自动配置。例如,当我们要从第三方库连接组件时,由于源代码不可用,因此我们无法使用@Component注释类。
实时场景可能是某人想要连接到Amazon S3存储桶。因为源不可用,所以他必须创建一个@bean。
@Bean
public AmazonS3 awsS3Client() {
BasicAWSCredentials awsCreds = new BasicAWSCredentials(awsKeyId, accessKey);
return AmazonS3ClientBuilder.standard().withRegion(Regions.fromName(region))
.withCredentials(new AWSStaticCredentialsProvider(awsCreds)).build();
}
上面代码的来源-> https://www.devglan.com/spring-mvc/aws-s3-java
因为我在上面提到了@Component Annotation。
@Component表示带注释的类是“组件”。使用基于注释的配置和类路径扫描时,此类会被视为自动检测的候选。
组件注释将类注册为单个bean。
对于Spring,所有对象都是bean!Spring Framework的基本步骤是将对象定义为bean。Bean就是对象实例,它是Spring框架通过查看其类定义而创建的。这些定义基本上构成了配置元数据。然后,框架根据此配置元数据创建一个计划,针对该计划需要实例化对象,需要设置和注入哪些依赖项,新创建的实例的范围等。
就像在第一章中一样,元数据可以以简单的XML文件提供。或者,可以将元数据提供为注释或Java配置。
图书:《刚好春天》
Spring的XML配置由Bean组成,并且Bean基本上是类。它们只是我们在ApplicationContext内部使用的POJO。可以将定义Bean视为替换关键字new。因此,无论您在应用程序中使用关键字new的什么地方,都类似:
MyRepository myRepository =new MyRepository ();
在使用关键字new的地方,您可以查看删除该配置并将其放入XML文件中。因此,我们将这样编写代码:
<bean name="myRepository "
class="com.demo.repository.MyRepository " />
现在我们可以简单地使用Setter注入/构造函数注入。我正在使用Setter注入。
public class MyServiceImpl implements MyService {
private MyRepository myRepository;
public void setMyRepository(MyRepository myRepository)
{
this.myRepository = myRepository ;
}
public List<Customer> findAll() {
return myRepository.findAll();
}
}