当前位置:   article > 正文

Spring IOC 创建bean实例的方式_ioc未创建实例

ioc未创建实例

据我所知,创建bean实例的方式有4种方式~

下面我会一一写出来这4种方式~

第一种:xml文件中有bean的配置,而且这个bean所对应的java类中存在一个无参构造器,那么这个时候spring容器就可以使用反射调用无参构造器来创建实例了~

代码如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context-3.2.xsd">
  9. <bean name="stu" class="com.x.spring.test1.Student">
  10. <property name="name">
  11. <value>张三</value>
  12. </property>
  13. </bean>
  14. </beans>
这就是一个bean实例~,我前几篇就是这样创建bean实例的,我这里就不多说了~接下来看第二种方式

第二种:通过工厂类获得实例(工厂类实现了接口FactoryBean<?>)

注意:spring中的PropertyPlaceholderConfigurer类的使用,在htmlsingle中直接搜索类名即可

例如:

工厂类ConnectionFactory实现指定接口并且实现接口中的三个抽象方法:

  1. public class ConnectionFactory implements FactoryBean<Connection>{
  2. private String driver;
  3. private String url;
  4. private String username;
  5. private String password;
  6. public String getDriver() {
  7. return driver;
  8. }
  9. public void setDriver(String driver) {
  10. this.driver = driver;
  11. }
  12. public String getUrl() {
  13. return url;
  14. }
  15. public void setUrl(String url) {
  16. this.url = url;
  17. }
  18. public String getUsername() {
  19. return username;
  20. }
  21. public void setUsername(String username) {
  22. this.username = username;
  23. }
  24. public String getPassword() {
  25. return password;
  26. }
  27. public void setPassword(String password) {
  28. this.password = password;
  29. }
  30. //连接
  31. @Override
  32. public Connection getObject() throws Exception {
  33. Class.forName(driver);
  34. Connection conn =
  35. DriverManager.getConnection(url,username,password);
  36. return conn;
  37. }
  38. @Override
  39. public boolean isSingleton() {
  40. // TODO Auto-generated method stub
  41. return false;
  42. }
  43. @Override
  44. public Class<Connection> getObjectType() {
  45. // TODO Auto-generated method stub
  46. return Connection.class;
  47. }
  48. }
注意:一定要加上这个jar包-mysql-connector-java-5.1.18-bin.jar,这个jar包我在Hibernate里面就用过,这是连接数据库的~如图:



配置文件factory.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context-2.5.xsd">
  9. <!-- 通过conn拿到的是对应的这个工厂类所生产的产品对象 -->
  10. <!-- 造成这种现象的原因:因为这个类ConnectionFactory是一个工厂类,所以我们用名字conn在容器中拿对象的时候,
  11. 拿到并不是这个工厂类对象,而是这个工厂类对象调用完工厂方法后所返回的对象. -->
  12. <bean name="conn" class="com.x.spring.test3.factory.ConnectionFactory">
  13. <!-- 从一个配置文件中以key—value的形式拿value -->
  14. <property name="url" value="${url}"></property>
  15. <property name="driver" value="${driver}"></property>
  16. <property name="username" value="${username}"></property>
  17. <property name="password" value="${password}"></property>
  18. </bean>
  19. <!--
  20. 下面配置的这个类,可以自动的帮我们去读取指定的properties文件的
  21. 内容,文件中用key-value的形式存放数据,读完之后我们就可以用
  22. ${key}这种形式去拿文件中的value值了。
  23. classpath指的是从src下面找.
  24. -->
  25. <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  26. <property name="locations" value="classpath:mysql.properties"/>
  27. </bean>
  28. </beans>
还需要properties文件~我放在src目录下面~

  1. driver=com.mysql.jdbc.Driver
  2. url=jdbc:mysql://localhost:3306/ssh
  3. username=root
  4. password=root
测试类FactoryTest:

  1. public class FactoryTest {
  2. public static void main(String[] args) {
  3. // TODO Auto-generated method stub
  4. //在xml中配置工厂类,然后通过这个工厂类获得工厂生产的实例
  5. try {
  6. String path = "com/x/spring/test3/factory/factory.xml";
  7. ApplicationContext container =
  8. new ClassPathXmlApplicationContext(path);
  9. Connection conn = (Connection)container.getBean("conn");
  10. System.out.println(conn);
  11. conn.close();
  12. } catch (SQLException e) {
  13. // TODO Auto-generated catch block
  14. e.printStackTrace();
  15. }
  16. }
  17. }
效果图:


注意: 通过conn拿到的并不是要拿到工厂类的对象,而是对应的这个工厂类所生产的产品对象~这一点要记住

好了,第二种方式写完了,开始第三种方式~

第三种:通过实例工厂获得实例(不需要实现或者继承任何接口或者父类)

 注意spring中的PropertyPlaceholderConfigurer类的使用,在htmlsingle中直接搜索类名即可

例如:

一个普通的工程类ConnectionFactory:

  1. public class ConnectionFactory {
  2. private String driver;
  3. private String url;
  4. private String username;
  5. private String password;
  6. public Object getConnection() throws Exception {
  7. Class.forName(driver);
  8. Connection conn =
  9. DriverManager.getConnection(url,username,password);
  10. return conn;
  11. }
  12. public String getDriver() {
  13. return driver;
  14. }
  15. public void setDriver(String driver) {
  16. this.driver = driver;
  17. }
  18. public String getUrl() {
  19. return url;
  20. }
  21. public void setUrl(String url) {
  22. this.url = url;
  23. }
  24. public String getUsername() {
  25. return username;
  26. }
  27. public void setUsername(String username) {
  28. this.username = username;
  29. }
  30. public String getPassword() {
  31. return password;
  32. }
  33. public void setPassword(String password) {
  34. this.password = password;
  35. }
  36. }
这个类没有继承和实现任何接口或类

配置文件instanceFactory.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context-3.2.xsd">
  9. <span style="color:#ff0000;"><!-- 读取properties文件 --></span>
  10. <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  11. <property name="locations" value="classpath:mysql.properties"/>
  12. </bean>
  13. <bean name="factory" class="com.x.spring.test3.instanceFactory.ConnectionFactory">
  14. <property name="url" value="${url}"></property>
  15. <property name="driver" value="${driver}"></property>
  16. <property name="username" value="${username}"></property>
  17. <property name="password" value="${password}"></property>
  18. </bean>
  19. <span style="color:#ff0000;"> <!--
  20. 将来通过这个conn来拿对象,拿到的是名字为factory的工厂类调用完
  21. 名字为getConnection方法之后所返回的对象。
  22. --></span>
  23. <bean name="conn" factory-bean="factory" factory-method="getConnection"></bean>
  24. </beans>
properties文件上面有代码,我就不贴了~

测试类InstanceTest:

  1. public class InstanceTest {
  2. public static void main(String[] args) {
  3. //通过实例工厂获得实例(不需要实现或者继承任何接口或者父类)
  4. try {
  5. String path = "com/x/spring/test3/instanceFactory/instanceFactory.xml";
  6. ApplicationContext container =
  7. new ClassPathXmlApplicationContext(path);
  8. Connection conn = (Connection)container.getBean("conn");
  9. System.out.println(conn);
  10. conn.close();
  11. } catch (Exception e) {
  12. e.printStackTrace();
  13. }
  14. }
  15. }

效果图:



好了,第三种方式也说完了~接下来第四种~

第四种:通过静态工厂获得实例

例如:含义静态方法的工厂类ConnectionFactory

  1. public class ConnectionFactory {
  2. private static String driver = "com.mysql.jdbc.Driver";
  3. private static String url = "jdbc:mysql://localhost:3306/ssh";
  4. private static String username = "root";
  5. private static String password = "root";
  6. public static Object getConnection() throws Exception {
  7. Class.forName(driver);
  8. Connection conn =
  9. DriverManager.getConnection(url,username,password);
  10. return conn;
  11. }
  12. }
有没有觉得这个很熟悉~不错,这就是properties文件的一些配置属性~

这就可以不用写properties文件了~

配置文件staticFactory.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context-3.2.xsd">
  9. <!-- 这样配置一定要求getConnection方法是静态方法 -->
  10. <bean name="conn" class="com.x.spring.test3.staticFactory.ConnectionFactory" factory-method="getConnection"></bean>
  11. </beans>
测试类:

  1. public class StaticTest {
  2. public static void main(String[] args) {
  3. //通过静态工厂获得实例
  4. try {
  5. String path = "com/x/spring/test3/staticFactory/staticFactory.xml";
  6. ApplicationContext container =
  7. new ClassPathXmlApplicationContext(path);
  8. Connection conn = (Connection)container.getBean("conn");
  9. System.out.println(conn);
  10. conn.close();
  11. } catch (Exception e) {
  12. e.printStackTrace();
  13. }
  14. }
  15. }

运行效果:



有没有觉得这三种方式的效果图都差不多~

就后面的一些数字不一样~

看来这三种方式通过conn拿到的并不是要拿到工厂类的对象,而是对应的这个工厂类所生产的产品对象~这一点要记住












声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/241630
推荐阅读
相关标签
  

闽ICP备14008679号