博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何使用Spring的FactoryBean接口
阅读量:6910 次
发布时间:2019-06-27

本文共 4414 字,大约阅读时间需要 14 分钟。

如何使用Spring的FactoryBean接口

在Spring容器中有两类的Bean,一类是普通的Bean,一类是工厂Bean。这两种Bean都是被Spring的容器进行管理的。而Spring也提供了一个接口用于扩展工厂Bean,我们只要实现org.springframework.beans.factory.FactoryBean即可。

如何使用

首先我们看一下FactoryBean接口

public interface FactoryBean
{ T getObject() throws Exception; Class
getObjectType(); boolean isSingleton();}复制代码

这三个方法的作用分别是

  • getObject:返回本工厂创建的对象实例。此实例也许是共享的,依赖于该工厂返回的是单例或者是原型。
  • getObjectType:返回对象类型
  • isSingleton:表示被工厂创建的实例是否是单例

现在让我们开始使用,创建一个UserFactory用来创建实例User

public class User {    private String name;    private Integer age;-----get set 方法}复制代码

UserFactory工厂类

public class UserFactory implements FactoryBean
{ private String name; private Integer age; @Override public User getObject() throws Exception { return new User(name,age); } @Override public Class
getObjectType() { return User.class; } @Override public boolean isSingleton() { return true; }}复制代码

添加配置类将UserFactory加入到容器中

@Configurationpublic class FactoryBeanAppConfig {    @Bean    public UserFactory userFactory(){        UserFactory userFactory = new UserFactory();        userFactory.setAge(10);        userFactory.setName("Grace");        return userFactory;    }}复制代码

接下来我们就能通过UserFactory工厂类进行创建User

public class BeanFactoryTest extends BaseTest{    @Autowired    private User user;    @Test    public void testBeanFactory(){        assertEquals(new Integer(10),user.getAge());        assertEquals("Grace",user.getName());    }}复制代码

此时我们Debug也能看到其我们自动注入的User类就是通过UserFactory创建的实例

加载顺序

有时候我们需要在工厂Bean创建之后,但是getObject方法执行之前执行一些动作,例如资源配置检查之类的动作的话,我们可以使用@PostConstruct注解在方法上,那么此方法就会在执行getObject()方法执行之前先执行。

此时我们在UserFactory工厂类中修改如下,增加@PostConstruct注解的方法,并且增加打印日志。

public class UserFactory implements FactoryBean
{ private String name; private Integer age; @Override public User getObject() throws Exception { System.out.println("getObject Begin"); return new User(name,age); } @Override public Class
getObjectType() { return User.class; } @Override public boolean isSingleton() { return true; } @PostConstruct public void Initialize(){ System.out.println("Initialize Begin"); }}复制代码

此时我们运行就会发现执行顺序

AbstractFactoryBean

Spring为我们提供了一个关于FactoryBean的抽象类AbstractFactoryBean为我们简化了操作。我们直接继承此类就能更加方便的创建单例或者非单例的实体类了。接下来我们就演示一下如何创建单例和非单例的类。首先先创建两个工厂,一个工厂SingleUserFactory负责创建单例,一个工厂NonSingleUserFactory负责创建非单例

public class SingleUserFactory extends AbstractFactoryBean
{ private String name; private Integer age; @Override public Class
getObjectType() { return User.class; } @Override protected User createInstance() throws Exception { return new User(name,age); }--get set方法}复制代码

NonSingleUserFactory

public class NonSingleUserFactory extends AbstractFactoryBean
{ private String name; private Integer age; //设置为非单例模式 public NonSingleUserFactory(){ setSingleton(false); } @Override public Class
getObjectType() { return User.class; } @Override protected User createInstance() throws Exception { return new User(name,age); } ---- get set方法}复制代码

并且在配置文件中加入对这两个工厂类的配置

@Bean(name = "singleUser")    public SingleUserFactory getSingle(){        SingleUserFactory singleUserFactory = new SingleUserFactory();        singleUserFactory.setAge(12);        singleUserFactory.setName("Single");        return singleUserFactory;    }    @Bean(name = "nonSingleUser")    public NonSingleUserFactory getNonSingle(){        NonSingleUserFactory nonSingleUserFactory = new NonSingleUserFactory();        nonSingleUserFactory.setAge(12);        nonSingleUserFactory.setName("NonSingle");        return nonSingleUserFactory;    }复制代码

在测试类中测试如下

public class SingleBeanFactoryTest extends BaseTest{    @Resource(name = "singleUser")    private User user1;    @Resource(name = "singleUser")    private User user2;    @Resource(name = "nonSingleUser")    private User user3;    @Resource(name = "nonSingleUser")    private User user4;    @Test    public void testSingleBean(){        assertTrue(user1 == user2);        assertTrue(user3 != user4);    }}复制代码

我们查看类的路径就可以知道哪些类是一样的了

从结果中我们可以看到SingleUserFactory工厂类创建的都是单例的对象,而NonSingleUserFactory创建的都是非单例的对象。如果是创建单例的那么就无需设置singleton的值,因为他是默认为True的。

使用FactoryBean能够在Spring中更好更便捷的创建管理一些有着复杂构造逻辑的实体类。

源码可在中查看

转载地址:http://negdl.baihongyu.com/

你可能感兴趣的文章
android137 360 双击三击事件
查看>>
位图排序
查看>>
No connection string named '***' could be found in the application config file
查看>>
在LINUX上创建GIT服务器【转】
查看>>
使用EasyUI的插件前需要引入的文件
查看>>
Struts2学习笔记--使用Response下载文件和Struts2的StreamResult文件下载
查看>>
【CodeForces 557B】Pasha and Tea
查看>>
基于AJAX的长轮询(long-polling)方式实现简单的聊天室程序
查看>>
PHP-002
查看>>
Java异步执行多个HTTP请求的例子(需要apache http类库)
查看>>
web接口开发与测试
查看>>
Netty系列之Netty百万级推送服务设计要点(转)
查看>>
谷歌笔试题整理(一)
查看>>
IOS-KVO、KVC
查看>>
JAVA字符串转日期或日期转字符串
查看>>
Apache服务器常规操作
查看>>
HTML:关于a标签的target属性
查看>>
Java JNI初探
查看>>
InfluxDB系列之一安装及简单运维(未完成,需要继续写)
查看>>
Oracle 11g RAC使用Manual和Policy Managed方法配置(转)
查看>>