xml文件中有bean的配置,而且這個bean所對應的java類中存在一個無參構造器
那么這個時候spring容器就可以使用反射調用無參構造器來創建實例了(常規的方式)
通過工廠類獲得實例(工廠類實現了接口FactoryBean<?>
注意spring中的PropertyPlaceholderConfigurer類的使用,在htmlsingle中直接搜索類名即可
例如:
//工廠類實現指定接口並且實現接口中的三個抽象方法: public class ConnectionFactory implements FactoryBean<Connection>{ private String driver; private String url; private String username; private String password; @Override public Connection getObject() throws Exception { Class.forName(driver); Connection conn = DriverManager.getConnection(url,username,password); return conn; } @Override public boolean isSingleton() { return false; } @Override public Class<Connection> getObjectType() { return Connection.class; } set/get .... }
xml文件:
下面配置的這個類,可以自動的幫我們去讀取指定的properties文件的內容,文件中用key-value的形式存放數據
讀完之后我們就可以用${key}這種形式去拿文件中的value值了
在htmlsingle中直接搜索類名即可得到相關配置樣例
classpath指的是從src下面找.
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location"> <value>classpath:oracle.properties</value> </property> </bean>
因為這個類是一個工廠類,所以我們用名字conn在容器中拿對象的時候,
拿到並不是這個工廠類對象,而是這個工廠類對象調用完工廠方法后所返回的對象.
<bean name="conn" class="com.briup.ioc.factory.ConnectionFactory"> <property name="driver"> <value>${driver}</value> </property> <property name="url"> <value>${url}</value> </property> <property name="username"> <value>${username}</value> </property> <property name="password"> <value>${password}</value> </property> </bean>
main:
String path = "com/briup/ioc/factory/factory.xml"; ApplicationContext container = new ClassPathXmlApplicationContext(path); Connection conn = (Connection)container.getBean("conn"); System.out.println(conn);
通過實例工廠獲得bean對象(不需要實現或者繼承任何接口或者父類),就是一個普通的工廠實例instanceFactory
//一個普通的工廠類 public class ConnectionFactory{ private String driver; private String url; private String username; private String password; public Object getConnection() throws Exception { Class.forName(driver); Connection conn = DriverManager.getConnection(url,username,password); return conn; } get/set .... }
xml文件:
<!-- 讀取properties文件 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location"> <value>classpath:oracle.properties</value> </property> </bean>
<!-- 配置工廠類 --> <bean name="factory" class="com.briup.ioc.instanceFactory.ConnectionFactory"> <property name="driver"> <value>${driver}</value> </property> <property name="url"> <value>${url}</value> </property> <property name="username"> <value>${username}</value> </property> <property name="password"> <value>${password}</value> </property> </bean> <!-- 將來通過這個conn來拿對象,拿到的是名字為factory的工廠類調用完名字為getConnection方法之后所返回的對象。--> <bean name="conn" factory-bean="factory" factory-method="getConnection"></bean>
main:
String path = "com/briup/ioc/instanceFactory/instanceFactory.xml"; ApplicationContext container = new ClassPathXmlApplicationContext(path); Connection conn = (Connection)container.getBean("conn"); System.out.println(conn);
通過靜態工廠獲得實例
例如
//靜態工廠類 public class ConnectionFactory{ private static String driver = "oracle.jdbc.driver.OracleDriver"; private static String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE"; private static String username = "briup"; private static String password = "briup"; public static Object getConnection() throws Exception { Class.forName(driver); Connection conn = DriverManager.getConnection(url,username,password); return conn; } }
xml文件:
<!-- 這樣配置一定要求getConnection方法是靜態方法 --> <bean name="conn" class="com.briup.ioc.staticFactory.ConnectionFactory" factory-method="getConnection"></bean>
main:
String path = "com/briup/ioc/staticFactory/staticFactory.xml"; ApplicationContext container = new ClassPathXmlApplicationContext(path); Connection conn = (Connection)container.getBean("conn"); System.out.println(conn);