为什么要用工厂方法:因为对于一些复杂的,没有办法直接通过构造器构建,可以创建 工厂 方法构建。例如:Connection对 象
1.因为要产生Connection所以要引入ojdbc.jar包
2.创建一个产生Connection对象的类
静态工厂就让getConnection方法变成静态的,产生对象时直接 .方法名() 调用
实例工厂则不加,但是在配置xml,和产生对象是会不同.
注意:这里就直接赋初始值了,如果要用构造器或者set方法注入,请参考Spring练习一
package ioc.day2.mytest1;
import java.sql.Connection;
import java.sql.DriverManager;
public class StaticConnectionFactory {
private static String driver = "oracle.jdbc.driver.OracleDriver";
private static String url = "jdbc:oracle:thin:@localhost:1521:xe";
private static String user = "cyg";
private static String password = "cyg";
public static Connection getConnection() {
System.out.println("getConnection-----------------方法");
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
}
};
}
3.创建一个xml文件,并配置
1.静态工厂配置方法
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="conn" class="ioc.day2.mytest1.StaticConnectionFactory">
<!-- 利用构造器传参
<constructor-arg name="url" value="jdbc:oracle:thin:@localhost:1521:xe"></constructor-arg>
<constructor-arg name="user" value="cyg"></constructor-arg>
<constructor-arg name="password" value="cyg"></constructor-arg> -->
</bean>
</beans>
2.实例工厂配置方法
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="fa" class="ioc.day2.mytest1.StaticConnectionFactory">
<!-- 利用构造器传参
<constructor-arg name="url" value="jdbc:oracle:thin:@localhost:1521:xe"></constructor-arg>
<constructor-arg name="user" value="cyg"></constructor-arg>
<constructor-arg name="password" value="cyg"></constructor-arg> -->
</bean>
<!-- 创建对象时自动调用里面的getConnection方法-->
<bean id="conn" factory-bean="fa" factory-method="getConnection"></bean>
</beans>
4.写测试类
1.静态工厂测试方法
package spring_jd2007;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import ioc.day2.mytest1.StaticConnectionFactory;
public class Myday2_Test {
@Test
public void testConnection() {
ApplicationContext ac = new ClassPathXmlApplicationContext("ioc/day2/mytest1/Connection.xml");
StaticConnectionFactory sconn = ac.getBean("conn",StaticConnectionFactory.class);
//这里用 .方法名() 的方式调用,也可以在xml中配置直接调用方法,和实例工厂的方式一样
System.out.println(sconn.getConnection());
}
}
2.实例工厂测试方法
package spring_jd2007;
import java.sql.Connection;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Myday2_Test {
@Test
public void testConnection() {
ApplicationContext ac = new ClassPathXmlApplicationContext("ioc/day2/mytest1/Connection.xml");
Connection connection = ac.getBean("conn",Connection.class);
System.out.println("--------");
System.out.println(connection);
}
}