Spring复杂对象创建的方式小结

网友投稿 259 2022-09-04


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 {

//用于书写创建复杂对象的代码

@Override

public Connection getObject() throws Exception {

Class.forName(driverClassName);

Connection conn = DriverManager.getConnection(hOXGgblvWxurl, 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配置文件中

对这种使用的解读:FactoryBean接口中有三个抽象方法

○ 如果就想获得FactoryBean类型的对象 ctx.getBean("&conn")获得就是ConnectionFactoryBean对象○ isSingleton方法  返回 true 只hOXGgblvWx会创建一个复杂对象  返回 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;

}

}

但是要在配置文件中进行配置

hOXGgblvWx

第三种方式:静态工厂

和实例工厂类似,只不过这里把实例方法,替换为静态方法。

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;

}

}

对应配置文件配置如下:

总结:

这些复杂对象我们在以后很少用到,因为我们在整合其他框架时,其他框架为我们提过了,创建复杂对象的方法,比如Spring整合Mybatis,Mybatis提供了创建SqlSessionFactory对象的方法。但是学习这些也是有必要的,因为这些框架底层使用的就是FactoryBean等这几种方式。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:部署django+vue+nginx+redis+mysql项目踩的坑
下一篇:python生成器(python生成器和迭代器区别)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~