可以通过实现 FactoryBean<T> 接口,然后创建一个实例到 Spring 容器中。
步骤
FactoryBean
public interface FactoryBean<T> {
T getObject() throws Exception;
Class<?> getObjectType();
boolean isSingleton();
}
FactoryBean<T> 接口定义如上面的代码,有 3 个方法。getObject 方法返回实例,getObjectType 方法返回实例的类型。isSingleton 表示实例是否单例。
public class SchoolFactoryBean implements FactoryBean<School> {
public School getObject() throws Exception {
return new School();
}
public Class<?> getObjectType() {
return School.class;
}
public boolean isSingleton() {
return true;
}
}
配置类
@Configuration
public class Config {
@Bean
public SchoolFactoryBean getSchoolFactoryBean() {
return new SchoolFactoryBean();
}
}
上面的配置中,虽然 getSchoolFactoryBean 方法返回的是 SchoolFactoryBean 实例,该方法会将 School 类和 SchoolFactoryBean 类都注册到 Spring 容器中。
注意,根据名称去查找实例时,”getSchoolFactoryBean” 名称对应的实例不是 SchoolFactoryBean,而是 School。”&getSchoolFactoryBean” 名称对应的实例才是 SchoolFactoryBean 自身。
public class Main {
public static void main(String[] args) {
//使用Config.class这个配置类
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class);
System.out.println(applicationContext.getBean("getSchoolFactoryBean"));
System.out.println(applicationContext.getBean("&getSchoolFactoryBean"));
System.out.println(applicationContext.getBean(School.class));
System.out.println(applicationContext.getBean(SchoolFactoryBean.class));
applicationContext.close();
}
}
打印结果
com.learn.entity.School@1ab328e6 com.learn.entity.SchoolFactoryBean@4ac3a4c8 com.learn.entity.School@1ab328e6 com.learn.entity.SchoolFactoryBean@4ac3a4c8