Spring基础第四章

第四章复杂对象

4.1什么是复杂对象:不能直接通过new创建出来的对象

  • SqlSessionFactrory
  • Connetction

4.2Spring工厂创建复杂对象

4.2.1FactoryBean接口
  • 实现FactoryBean接口

    public class ConnectionFactoryBean implements FactoryBean<Connection> {
    
        public Connection getObject() throws Exception {
            Class.forName("com.mysql.cj.jdbc.Driver");
            Connection connection = DriverManager
                    .getConnection("jdbc:mysql://localhost:3306/atguidudb", "root", "123456");
            return connection;
        }
    
        public Class<?> getObjectType() {
            return Connection.class;
        }
    
        public boolean isSingleton() {
            // true 为单实例
            return true;
        }
    }
    
  • 配置文件

    <!--配置复杂对象 简单对象的话返回的是class类的对象而复杂对象则是getObject()方法返回的对象-->
    <bean id="dbconn" class="com.xia.basic.factorybean.ConnectionFactoryBean"/>
    
  • 细节

    • 如果想获得FactioryBean对象 : ctx.getBean("&dbconn");

    • public boolean isSingleton()方法:

      返回true只会创建一个对象(单实例)

      Connection(false) 不能被共用

      SqlSessionFactory(true)线程安全

  • 按照依赖注入思想修改代码

    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;
        }
    
        public Connection getObject() throws Exception {
            Class.forName(driverClassName);
            Connection connection = DriverManager
                    .getConnection(url, username, password);
            return connection;
        }
    
        public Class<?> getObjectType() {
            return Connection.class;
        }
    
        public boolean isSingleton() {
            // true 为单实例
            return true;
        }
    }
    
    <!--配置复杂对象-->
    <bean id="dbconn" class="com.xia.basic.factorybean.ConnectionFactoryBean">
       <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
       <property name="url" value="jdbc:mysql://localhost:3306/atguigudb?serverTimezone=UTC"/>
       <property name="username" value="root"/>
       <property name="password" value="123456"/>
    </bean>
    
  • FactoryBean实现简易思想

    1.为什么要实现FactoryBean接口?实现getObejct()方法
    2.ctx.getBean("conn")获得的是复杂对象 Connection 而不是 ConnectionFactoryBean
    	1.通过bean标签中的class是不是FactoryBean接口的实现
    		是: 复杂对象
    			调用getObejct()方法
    		否: 简单对象
    			直接创建对象
    
4.2.2实例工厂
避免Spring框架的侵入
整合遗留系统
    <bean id="connFactory" class="com.xia.basic.factorybean.ConnectionFactory">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/atguigudb?serverTimezone=UTC"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>
    <bean id="conn" factory-bean="connFactory" factory-method="getObject"/>
4.2.2静态工厂
<bean id="staticConn" class="com.xia.basic.factorybean.StaticConnectionFactory" factory-method="getConnection"/>

区别:静态工厂不需要对象,所以可以直接配置类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值