Spring FactoryBean的实现及简单原理

1. 开发步骤

  • 实现FactoryBean接口
    在这里插入图片描述
public class ConnectionFactoryBean implements FactoryBean<Connection> {
    private String driverClassName;
    private String url;
    private String userName;
    private String password;

    public String getDriverClassName() {
        return driverClassName;
    }

    public void setDriverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    // 用于书写创建复杂对象的方法,并把复杂对象作为方法的返回值返回
    @Override
    public Connection getObject() throws Exception {
        Class.forName(driverClassName);
        Connection conn = DriverManager.getConnection(url,userName,password);
        return conn;
    }
    // 返回所创建复杂对象的class对象
    @Override
    public Class<?> getObjectType() {
        return Connection.class;
    }
	// 是否只创建一次复杂对象(true),每次请求都创建新的复杂对象(false)
    @Override
    public boolean isSingleton() {
        return false;
    }
}
  • Spring配置文件的配置
    <bean id="conn" class="com.daixiang.factorybean.ConnectionFactoryBean"/>

值得注意的是,上述代码片段中,如果Class中指定的类型是FactoryBean接口的实现类,那么通过id值获得的是这个类所创建的复杂对象 Connection。

2. 一些细节

  • 如果就想获得FactoryBean类型的对象,在id前添加“&”符号, 获得的就是ConnectionFactoryBean对象。

    ctx.getBean("&conn");
    
  • isSingleton方法
    返回 true 只会创建一个复杂对象

    返回 false 每一次都会创建新的对象
    问题:根据这个对象的特点 ,决定是返回true (SqlSessionFactory) 还是 false (Connection)

  • mysql高版本连接创建时,需要制定SSL证书,解决问题的方式

    url = "jdbc:mysql://localhost:3306?useSSL=false"
    
  • 依赖注入的体会(DI)
    将ConnectionFactoryBean中依赖的4个字符串信息 ,进行配置文件的注入
    好处:解耦合

    <bean id="conn" class="com.daixiang.basic.factorybean.ConnectionFactoryBean">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306"/>
    <property name="userName" value="root"/>
    <property name="password" value="123456"/>
    </bean>
    

3. FactoryBean的实现原理(简易版)

Spring内部运行流程

  1. 通过conn获得 ConnectionFactoryBean类的对象 ,进而通过instanceof 判断出是FactoryBean接口的实现类
  2. Spring按照规定 getObject() —> Connection
  3. 返回Connection

在这里插入图片描述

4. FactoryBean总结

FactoryBean是Spring中用于创建复杂对象的一种方式,也是Spring原生提供的,Spring整合其他框架的过程中,大量应用到FactoryBean。

daixiangcn CSDN认证博客专家 后端开发工程师 产品体验官
中国公民,中共预备党员,CSDN博客专家,本科大四在读。江苏省第四届“互联网+”大学生创新创业大赛二等奖获得者,第二届、第三届微信小程序应用开发大赛全国三等奖、华东赛区二等奖项目作者,微信小程序《约车吗》、《庆云慈善会》、《锋云速检》项目工程师。
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页