作者简介:☕️大家好,我是Aomsir,一个爱折腾的开发者!
个人主页:Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客
当前专栏:Spring5应用专栏_Aomsir的博客-CSDN博客
- 孙哥suns说Spring5~学不会Spring? 因为你没找对人~孙帅
- Spring官方文档
讨论什么是复杂对象前,先讨论什么是简单对象,简单对象就是可以直接通过new的方式进行创建的对象。所以不能够通过new创建的对象就是复杂对象,如下图所示。当然,Spring也提供了几种不同的创建复杂对象的方式:FactoryBean接口
、实例工厂
、静态工厂
FactoryBean
是Spring原生提供的创建复杂对象的方式,是Spring非常重要的一种机制,值的好好学习
如下是FactoryBean
的接口原型,中有3个方法
Connection 对象
、SqlSessionFactory 对象
等public interface FactoryBean<T> {
@Nullable
T getObject() throws Exception;
@Nullable
Class<?> getObjectType();
default boolean isSingleton() {
return true;
}
}
public class ConnectionFactoryBean implements FactoryBean<Connection> {
@Override
public Connection getObject() throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
return DriverManager.getConnection("jdbc:mysql://127.0.0.1:3307/demo", "root", "123456");
}
@Override
public Class<?> getObjectType() {
return Connection.class;
}
@Override
public boolean isSingleton() {
return false;
}
}
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="conn" class="com.aomsir.basic.factorybean.ConnectionFactoryBean" />
beans>
public class TestSpring {
@Test
public void test7() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
// 获取复杂对象
Connection conn = (Connection) ctx.getBean("conn");
// 获取FactoryBean对象
ConnectionFactoryBean connectionFactoryBean = (ConnectionFactoryBean) ctx.getBean("&conn");
System.out.println("conn = " + conn);
System.out.println("connectionFactoryBean = " + connectionFactoryBean);
}
}
public class ConnectionFactory {
public Connection getConnection() {
Connection conn = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3307/demo", "root", "123456");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="connFactory" class="com.aomsir.basic.factorybean.ConnectionFactory" />
<bean id="conn" factory-bean="connFactory" factory-method="getConnection" />
beans>
public class TestSpring {
@Test
public void test8() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Connection conn = (Connection) ctx.getBean("conn");
System.out.println("conn = " + conn);
}
}
在上述示例工厂中,需要配置两个Bean,这可能会导致一些冗余的配置。在这种情况下,考虑使用静态工厂方法可以更简化配置,提高配置的简洁性
public class StaticConnectionFactory {
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3307/demo", "root", "123456");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="conn" class="com.aomsir.basic.factorybean.StaticConnectionFactory" factory-method="getConnection"/>
beans>
public class TestSpring {
@Test
public void test9() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Connection conn = (Connection) ctx.getBean("conn");
System.out.println("conn = " + conn);
}
}
在处理复杂对象的依赖注入时,您可以根据业务需求选择使用Spring提供的FactoryBean接口
、自己创建的实例工厂
,或者静态工厂方法
。静态工厂方法通常是对实例工厂的一种更简化的方式。您的选择应该取决于业务需求的复杂性和具体情况的分析