本章主要写的是 Spring5 通过实现FactoryBean 的方式 来注入Bean 。
初始条件:
1. Java version : 1.8
2. maven vesion: 1.3.9
快速链接: 2.1 Spring5 快速入门
第一步:创建一个简单结构(quickstart)的 Maven 工程
第二步:将 Spring5 的依赖加入项目的 POM 文件中:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.0.RELEASE</version>
</dependency>
第三步: 创建一个 bean , 用于注入到 Spring 中。
public class MyBean {
/* 初始化的目的是为了在获取 bean 时,可以有直观的信息输出 */
private String id = "ID_000000000001";
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
第四步: 创建类,继承FactoryBean,将泛型T替换掉,并实现其方法。
import com.test.test1.MyBean;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.lang.Nullable;
public class MyBeanFactory implements FactoryBean<MyBean> {
@Nullable
public MyBean getObject() throws Exception {
return new MyBean();
}
@Nullable
public Class<?> getObjectType() {
return MyBean.class;
}
// 创建bean的方式,单例、多例,默认是多例
public boolean isSingleton() {
return false;
}
}
第五步: 创建一个配置类,用于管理要注入的 bean 或者配置文件信息。需要在类上添加 @Configuration 注解,以便让 Spring 识别为这是一个配置类。
@Configuration
public class MyConfig {
}
在此基础上,把上一步创建的自定义工厂 bean 注入到改配置类中,添加 getBean 方法:
import com.test.test2.MyBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfig {
@Bean
public MyBeanFactory createRunableFactory(){
return new MyBeanFactory();
}
}
上面的注释部分是可以替代 @bean 的,区别是 @Bean(“xXX”) 方式可以自定义 bean 的名字,“xXX”可以在后续获取该 bean 的时候使用。
第六步:创建一个含有 main 方法的主类,在该类中获取 Spring 的上下文,并将上述的配置类添加到获取 Spring 的上下文的构造器中,文章的目的是实现以注解的方式实现 bean 的注入,故选择 AnnotationConfigApplicationContext 。
import com.test.test2.MyBeanFactory;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/** * 测试bean基于注解的注入方式 */
public class App {
public static void main( String[] args ) {
// 以注解的形式把 bean 注入Spring 并获取 Spring 的上下文环境
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MyConfig.class);
// 获取自己配置的 bean 实例
MyBeanFactory runableFactory = ctx.getBean(MyBeanFactory.class);
try {
String id = runableFactory.getObject().getId();
System.out.println("MyBean ID ----- >> " + id);
} catch (Exception e) {
e.printStackTrace();
}
}
}
直接运行上面的类,输出的 bean 信息如下:
MyBean ID ----- >> ID_000000000001