Loading

第八章 Spring创建复杂对象

image
)

1.什么是复杂对象

复杂对象 : 指的就是不能通过直接new构造方法创建的对象
	Connection
	sqlSessionFactory

2.Spring工厂创建复杂对象的3种方式

2.1 FactoryBean接口

  • 开发步骤

    • 实现FactoryBean接口

      //FactoryBean接口实现的方法
      
      public Object getObject(){
          //用于书写创建复杂对象的代码,并把复杂对象作为返回值返回
      }
      public Class getObjectType(){
          //返回所创建的复杂对象的Class对象
      }
      public Boolean isSingleton(){
          //创建一次 return true
          //每次调用都要创建 return false
      }
      

image

Connection连接对象示例 :

```java 
//需要指明创建对象的泛型
public class ConnectionFactoryBean implements FactoryBean<Connection> {
    //用于书写创建复杂对象的代码,并返回该对象
    @Override
    public Connection getObject() throws Exception {
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/student","root","00000000");
        return conn;
    }

    //返回所创建复杂对象的Class对象
    @Override
    public Class<?> getObjectType() {
        return Connection.class;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }
}
```
  • Spring配置文件的配置

    <bean id="conn" class="com.dong.FactoryBean.ConnectionFactoryBean"/>
    
  • 与创建简单对象的区别

    如果class中指定的类型,是FactoryBean接口的实现类,那么通过id值获得的对象,是这个类所创建的复杂对象

image

image

  • 细节

    • 怎么获得FactoryBean类型的对象

      context.getBean("&conn")
      
    • isSingleton方法

      根据对象的特点, 返回true还是false
      能被共用(sqlSessionFactory),就创建一次,返回true;不能被共用(Connection),每次创建,返回false 
      
    • mysql高版本连接时,指定SSL证书

      url="jdbc:mysql://localhost:3306/student?userSSL=false"
      
    • 依赖注入的体会

      @Override
      public Connection getObject() throws Exception {
          Class.forName("com.mysql.cj.jdbc.Driver");
          Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/student","root","00000000");
          return conn;
      }
      

      在上面的代码中很明显存在耦合--->"com.mysql.cj.jdbc.Driver" "jdbc:mysql://localhost:3306/student" "root" "00000000"

      依赖于这些字符串, 所以我们可以进行依赖注入,来消除耦合

      //需要指明创建对象的泛型
      public class ConnectionFactoryBean implements FactoryBean<Connection> {
          private String driverName;
          private String url;
          private String username;
          private String password;
          ...get set
          //set注入
          @Override
          public Connection getObject() throws Exception {
              Class.forName(driverName);
              Connection conn = DriverManager.getConnection(url,username,password);
              return conn;
          }
      
      <bean id="conn" class="com.dong.FactoryBean.ConnectionFactoryBean">
          <property name="driverName" value="com.mysql.cj.jdbc.Driver"/>
          <property name="url" value="jdbc:mysql://localhost:3306/student" />
          <property name="username" value="root"/>
          <property name="password" value="00000000"/>
      </bean>
      
  • FactoryBean的实现原理(简易版)

image

  • FactoryBean总结

    Spring中用于创建复杂对象的一种方式, Spring原生提供的, Spring整合其他框架大量使用了FactoryBean

2.2 实例工厂

  • 为什么使用实例工厂?

    避免Spring的侵入
        使用FactoryBean,必须要实现FactoryBean接口
    整合遗留系统
        在开发过程中,我们已经有了获取复杂对象的类,这时,我们需要将这个类整合进Spring来帮助我们获得该对象
    
  • 开发步骤

    因为已经有了获取复杂对象的方法, 我们只要在配置文件中进行配置即可

    <!--com.dong.factorybean.ConnectionFactory是已经有的创建复杂对象的类-->
    <bean id="connFactory" class="com.dong.factorybean.ConnectionFactory"/>
    <bean id="conn" factory-bean="connFactory" factory-method="getConnection"/>
    

2.3 静态工厂

  • 和实例工厂的区别
实例工厂中原有的创建复杂对象的方法不是静态方法
静态工厂中原有的创建复杂对象的方法是静态的
静态方法,Spring底层就可以不用再创建对象,直接通过类名调用获取复杂对象的方法
  • 开发步骤

    <bean id="conn" class="com.dong.factorybean.StaticConnectionFactory" factory-method="getConnection"/>
    

3.Spring创建对象的总结

image

posted @ 2022-07-20 13:48  苏无及  阅读(92)  评论(0编辑  收藏  举报