Spring复杂对象创建的方式小结
在Spring中,对于简单类型的创建,我们可以使用set注入和构造注入。但是对于复杂类型的如何创建?
什么是复杂类型,比如连接数据库的Connection对象,以及Mybatis中的SqlSessionFactory对象。
在以前我们是通过这种方式获取Connection对象的:
Connection conn = null; try { Class.forName("com.mysql.cj.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql", "root", "123456"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }
现在使用Spring如何创建这种类型的对象?Spring中提供了三种方法来创建复杂对象
第一种:实现FactoryBean接口
public class ConnectionFactoryBean implements FactoryBean<Connection> { //用于书写创建复杂对象的代码 @Override public Connection getObject() throws Exception { Class.forName(driverClassName); Connection conn = DriverManager.getConnection(url, username, password); return conn; } @Override public Class<?> getObjectType() { return Connection.class; } @Override public boolean isSingleton() { return true; } private String driverClassName; private String url; private String username; private String password; //setter and getter省略
在applicationContext.xml配置文件中
<bean id="conn" class="com.liu.factorybean.ConnectionFactoryBean"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mysql?useSSL=false"/> <property name="username" value="root"/> <property name="password" value="123456"/> </bean>
对这种使用的解读:FactoryBean接口中有三个抽象方法
○ 如果就想获得FactoryBean类型的对象 ctx.getBean("&conn")
获得就是ConnectionFactoryBean对象
○ isSingleton方法
返回 true 只会创建一个复杂对象
返回 false 每一次都会创建新的对象
问题:根据这个对象的特点 ,决定是返回true (SqlSessionFactory) 还是 false (Connection)
○ mysql高版本连接创建时,需要制定SSL证书,解决问题的方式
注意:类中的几个连接数据库的属性,是自己添加的,便于在配置文件中注入,实现解耦合。
第二种方法:实例工厂 避免Spring框架的侵入整合遗留系统
直接在这个类写创建复杂对象的方法,不用实现FactoryBean接口。
public class ConnectionFactory { public Connection getConnection(){ Connection conn = null; try { Class.forName("com.mysql.cj.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql", "root", "123456"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } }
但是要在配置文件中进行配置
<!--ConnectionFactory实例 --> <bean id="connFactory" class="com.liu.factorybean.ConnectionFactory"></bean> <!--在factory-bean中应用ConnectionFactory实例id connFactory --> <bean id="conn" factory-bean="connFactory" factory-method="getConnection"/>
第三种方式:静态工厂
和实例工厂类似,只不过这里把实例方法,替换为静态方法。
public class StaticConnectionFactory { public static Connection getConnection(){ Connection conn = null; try { Class.forName("com.mysql.cj.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql", "root", "123456"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } }
对应配置文件配置如下:
<bean id="conn" class="com.liu.factorybean.StaticConnectionFactory" factory-method="getConnection"/>
总结:
这些复杂对象我们在以后很少用到,因为我们在整合其他框架时,其他框架为我们提过了,创建复杂对象的方法,比如Spring整合Mybatis,Mybatis提供了创建SqlSessionFactory对象的方法。但是学习这些也是有必要的,因为这些框架底层使用的就是FactoryBean等这几种方式。
到此这篇关于Spring复杂对象创建的三种方式的文章就介绍到这了,更多相关Spring复杂对象内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
springboot+mybatis-plus 两种方式打印sql语句的方法
这篇文章主要介绍了springboot+mybatis-plus 两种方式打印sql语句的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-10-10Java Swing组件单选框JRadioButton用法示例
这篇文章主要介绍了Java Swing组件单选框JRadioButton用法,结合具体实例形式分析了Swing单选框JRadioButton的使用方法及相关操作注意事项,需要的朋友可以参考下2017-11-11Java17中record替代Lombok部分功能使用场景探究
这篇文章主要介绍了使用Java17中的record替代Lombok的部分功能,本文来为大家小小的总结下,我们可以在哪些地方,利用record来替换Lombok2024-01-01@Transactional注解:多个事务嵌套时,独立事务处理方式
这篇文章主要介绍了@Transactional注解:多个事务嵌套时,独立事务处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-01-01
最新评论