复杂对象
可以使用new进行创建的对象是简单对象,比如自定义类User使用new来创建对象user,那么user就是简单对象。
class User{
private String name;
private int age;
}
User user = new User();
复杂对象简单来说就是不能使用new来创建的对象,比如数据库连接对象Connection就是一个复杂对象。
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/student", "root", "root");
下边的复杂对象实现都以Connection对象为例。
方式一:实现FactoryBean接口
1.实现FactoryBean接口
// 自定义ConnectionFactoryBean类,实现FactoryBean接口
class ConnectionFactoryBean implements FactoryBean{
// 获取复杂对象的方法
public Object getObject(){
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/student", "root", "root");
return connection;
}
// 获取当前对象的类型
public Class<?> getObjectType(){
return Connection.class;
}
// 返回true 表示只会创建一个对象实例
// 返回false 每次获取对象时都会创建一个新的对象实例
public boolean isSingleton(){
return false;
}
}
2.Spring配置文件
<bean id="connection" class="com.baizhiedu.factorybean.ConnectionFactoryBean" />
3.获取Connection对象
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
Connection conn = (Connection)ctx.getBean("connection");
如此一来,通过connection就可以获得复杂对象了。
细节:若想获得ConnectionFactoryBean对象而不是Connection对象呢?
ctx.getBean("&connection");
2.实例工厂
自定义类,并在类种定义获取复杂对象的方法,通过该类的实例来调用获取复杂对象的方法从而获取复杂对象。
1.自定义类,实现获取Connection对象的方法
class ConnectionFactory{
public Connection getConnection(){
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/student", "root", "root");
return connection;
}
}
2.配置文件
<bean id="connectionFactory" class="com.baizhiedu.factorybean.ConnectionFactory" />
<bean id="connection" factory-bean="connectionFactory" factory-method="getConnection" />
3.静态工厂
与实例工厂类似,但是获取复杂对象的方法定义为static,可以不创建类对象而直接调用该方法获取复杂对象。
class ConnectionFactory{
public static Connection getConnection(){
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/student", "root", "root");
return connection;
}
}
2.配置文件
<bean id="connectionFactory" class="com.baizhiedu.factorybean.ConnectionFactory" factory-method="getConnection" />