Spring的@Bean注解
Spring @Bean注解应用于方法,用于指定该方法返回一个由Spring容器管理的Bean。Spring Bean注解通常在配置类的方法中声明。在这种情况下,Bean方法可以通过直接调用同一类中的其他@Bean方法来引用它们。
春季 @Bean 示例
假设我们有一个如下所示的简单类。
package com.Olivia.spring;
public class MyDAOBean {
@Override
public String toString() {
return "MyDAOBean"+this.hashCode();
}
}
这是一个配置类,在其中我们定义了一个@Bea
n方法用于MyDAOBean类。
package com.Olivia.spring;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyAppConfiguration {
@Bean
public MyDAOBean getMyDAOBean() {
return new MyDAOBean();
}
}
我们可以使用下面的代码片段从Spring上下文中获取MyDAOBean bean。
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.scan("com.Olivia.spring");
context.refresh();
//Getting Bean by Class
MyDAOBean myDAOBean = context.getBean(MyDAOBean.class);
Spring Bean Name in Chinese can be paraphrased as “春天的Bean名称”
我们可以指定@Bean的名称,并使用该名称从Spring容器中获取它们。假设我们定义了一个名为MyFileSystemBean的类:
package com.Olivia.spring;
public class MyFileSystemBean {
@Override
public String toString() {
return "MyFileSystemBean"+this.hashCode();
}
public void init() {
System.out.println("init method called");
}
public void destroy() {
System.out.println("destroy method called");
}
}
在配置类中定义一个@Bean方法。
@Bean(name= {"getMyFileSystemBean","MyFileSystemBean"})
public MyFileSystemBean getMyFileSystemBean() {
return new MyFileSystemBean();
}
我们可以通过使用bean的名称从上下文中获取这个bean。
MyFileSystemBean myFileSystemBean = (MyFileSystemBean) context.getBean("getMyFileSystemBean");
MyFileSystemBean myFileSystemBean1 = (MyFileSystemBean) context.getBean("MyFileSystemBean");
Spring的@Bean的initMethod和destroyMethod
我们还可以指定Spring Bean的初始化方法和销毁方法。当创建Spring Bean时,会调用初始化方法;而当上下文关闭时,会调用销毁方法。
@Bean(name= {"getMyFileSystemBean","MyFileSystemBean"}, initMethod="init", destroyMethod="destroy")
public MyFileSystemBean getMyFileSystemBean() {
return new MyFileSystemBean();
}
当我们调用上下文刷新方法时,你将会注意到”init”方法被调用,而当我们调用上下文关闭方法时,”destroy”方法被调用。
总结
在注解驱动的Spring应用程序中,Spring @Bean注解被广泛使用。
你可以从我们的GitHub仓库下载完整的Spring项目。