spring学习教程7-spring容器创建bean对象的方式以及如何处理多个spring配置文件

spring容器创建bean对象的方式以及如何处理多个spring配置文件

1.spring容器创建bean对象的方式

注意:我们之前说的DI依赖注入是对于bean对象的属性的注入,是如何给属性赋值,如何配置属性,并不是创建对象。

(1)xml文件中有bean的配置,而且这个bean所对应的java类中存在一个无参构造器,那么这个时候spring容器就可以使用反射调用无参构造器来创建实例了(常规的方式);所以默认下我们是用无参构造器来创建bean的。这里和我们就是我们原来的做法,不进行代码演示,如果想测试,可以把一个bean类的无参构造器去掉,发现程序会报错。

(2)通过工厂类获得实例(工厂类实现了接口FactoryBean<?>)
注意spring中的PropertyPlaceholderConfigurer类的使用,在htmlsingle中直接搜索类名即

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

[java] view plaincopy
  1. public class ConnectionFactory implements FactoryBean<Connection>{
  2. private String driver;
  3. private String url;
  4. private String username;
  5. private String password;
  6. @Override
  7. public Connection getObject() throws Exception {
  8. Class.forName(driver);
  9. Connection conn =
  10. DriverManager.getConnection(url,username,password);
  11. return conn;
  12. }
  13. @Override
  14. public boolean isSingleton() {
  15. return false;
  16. }
  17. @Override
  18. public Class<Connection> getObjectType() {
  19. return Connection.class;
  20. }
  21. set/get
  22. ....
  23. }

其实这种方法就是用spring的类来实现的工厂创建bean,所以必须实现spring的FactoryBean接口,在后面我们可以通过我们熟悉的一般工厂类来创建bean,俩者比较,你会更清楚这种方法的过程。不过这种方法感觉不好用。

xml文件:

<!-- 
    下面配置的这个类,可以自动的帮我们去读取指定的properties文件的内容,文件中用key-value的形式存放数据,读完之后我们就可以用${key}这种形式去拿文件中的value值了
在htmlsingle中直接搜索类名即可得到相关配置样例
    classpath指的是从src下面找.
    -->

[html] view plaincopy
  1. <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  2. <property name="location">
  3. <value>classpath:oracle.properties</value>
  4. </property>
  5. </bean>

上面这个代码是配置类PropertyPlaceholderConfihurer的使用,代码的作用就是加载properties配置文件,在下面的配置中使用。 Spring 2.5 之后: 可通过 <context:property-placeholder> 元素简化:

[html] view plaincopy
  1. <context:property-placeholder location="classpath:beanProperty.properties"/><span style="font-size:16px;text-align:justify;font-family:'Microsoft YaHei', SimHei, Arial;background-color:rgb(255,255,255);"> </span>

<!-- 
    因为这个类是一个工厂类,所以我们用名字conn在容器中拿对象的时候,
    拿到并不是这个工厂类对象,而是这个工厂类对象调用完工厂方法后所返回的对象.
    -->

[html] view plaincopy
  1. <bean name="conn" class="com.briup.ioc.factory.ConnectionFactory">
  2. <property name="driver">
  3. <value>${driver}</value>
  4. </property>
  5. <property name="url">
  6. <value>${url}</value>
  7. </property>
  8. <property name="username">
  9. <value>${username}</value>
  10. </property>
  11. <property name="password">
  12. <value>${password}</value>
  13. </property>
  14. </bean>

上面的代码是配置bean的工厂类,然后得到bean

[html] view plaincopy
  1. main:
  2. String path = "com/briup/ioc/factory/factory.xml";
  3. ApplicationContext container =
  4. new ClassPathXmlApplicationContext(path);
  5. Connection conn =
  6. (Connection)container.getBean("conn");
  7. System.out.println(conn);

(3).通过实例工厂获得bean对象(不需要实现或者继承任何接口或者父类),就是一个普通的工厂实例instanceFactory
//一个普通的工厂类

[java] view plaincopy
  1. public class CatFactoryBean {
  2. public Cat getCat(int id,String name){
  3. return new Cat(id, name);
  4. }
  5. }

这时一般我们写的工厂类

[html] view plaincopy
  1. <bean id="catFactory" class="com.hoperun.spring.CatFactoryBean"></bean>
  2. <bean id="cat" class="com.hoperun.spring.Cat" factory-bean="catFactory" factory-method="getCat">
  3. <constructor-arg value="22"></constructor-arg>
  4. <constructor-arg value="fengwei"></constructor-arg>
  5. </bean>

这时配置文件,可以看到,先是配置了工厂的bean,然后在配置bean,关键实在bean的属性中有factory-bean和factory-method,指定了工厂类和得到这个bean对象对应的方法,下面constructor-arg是方法的参数,通过这样,我们就得到了对象。

(4)通过静态工厂获得实例

静态工厂:就是得到工厂的方法是静态的

[java] view plaincopy
  1. public static Cat getCat1(int id,String name){
  2. return new Cat(id, name);
  3. }
[html] view plaincopy
  1. <bean id="cat" class="com.hoperun.spring.CatFactoryBean" factory-method="getCat1">
  2. <constructor-arg value="2222"></constructor-arg>
  3. <constructor-arg value="fengwei"></constructor-arg>
  4. </bean>

这样我们就配置好了,可以看到,和实例工厂相比较还是bean属性的问题,静态工厂不需要建立bean,在class中填入静态工厂类就可以了,然后指定方法,参数。

2,处理多个配置文件

我们发现spring的配置文件每次都是指定加载的applicationContext.xml,如果把所有的bean配置都加入一个文件中,太大了,所以spring的配置文件是可以有多个的,多个文件可以一起加载。方法一:ClassPathXmlApplicationContext(),它有几个重载的构造器,参数不一样,可以是一个String[]数组,这样就明白了,可以将所有的名字都放在数组里,让它加载。

方法二:如果我们在spring框架中配置了多个xml文件,我们可以在读取配置文件的时候把这些xml文件一下全都读取,也可以只读一个总的xml文件,在这个总的xml文件中把其他的xml全都都导入进来。
例如:

[java] view plaincopy
  1. student.xml文件:
  2. <bean name="student" class="com.briup.bean.Student">
  3. <property name="id">
  4. <value>25</value>
  5. </property>
  6. </bean>
  7. teacher.xml文件:
  8. <bean name="teacher" class="com.briup.bean.Teacher">
  9. <property name="student" ref="student"></property>
  10. </bean>
  11. import.xml文件:
  12. <import resource="teacher.xml"/>
  13. <import resource="student.xml"/>
  14. main:
  15. String[] path = {"com/briup/ioc/imp/import.xml"};
  16. ApplicationContext container =
  17. new ClassPathXmlApplicationContext(path);
  18. Teacher t = (Teacher) container.getBean("teacher");
  19. System.out.println(t.getStudent());

转载于:https://www.cnblogs.com/erma0-007/p/8655313.html

spring容器创建bean对象的方式以及如何处理多个spring配置文件相关推荐

  1. IOC容器创建bean对象的4种方式

    前言: Spring容器创建bean对象,一般通过反射机制查找bean元素的class属性值来找到要实例化的类,从而实例化bean对象.这便是调用构造方法来实例化bean对象 在某些情况下,若采用简单 ...

  2. spring中bean的细节之三种创建Bean对象的方式

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  3. Spring框架----Spring的bean之三种创建bean对象的方式

    第一种方式:使用默认构造函数创建 在spring中的配置文件中,使用bean标签,配以id和class属性之后,且没有其他标签时,采用的就是默认构造函数创建bean对象, 此时类中没有默认构造函数,则 ...

  4. spring 容器中bean的扩展点记录 —— 个人学习记录

    在spring容器创建bean的生命周期中,存在很多个可以让我们扩展的口子 1.拿到beanFactory使用beanDefinition创建bean之前,通过实现BeanFactoryPostPro ...

  5. 将Bean放入Spring容器中的五种方式

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/weixin_43741092/ article/details/120176466 将bean放 ...

  6. 【Spring 工厂】反转控制与依赖注入、Spring工厂创建复杂对象3种方式

    反转控制与依赖注入 反转控制 与 依赖注入 反转控制(IOC Inverse of Control) 依赖注入 (Dependency Injection - DI) Spring工厂创建复杂对象(3 ...

  7. SpringBoot教程(十一)——将Bean放入Spring容器中的五种方式

    将bean放入Spring容器中有哪些方式? 我们知道平时在开发中使用Spring的时候,都是将对象交由Spring去管理,那么将一个对象加入到Spring容器中,有哪些方式呢,下面我就来总结一下 1 ...

  8. 【spring源码】基于factoryMethod创建bean对象

    案例: 1.定义Student类: @Data public class Student {private String name;private Integer age;public Student ...

  9. Spring注解创建Bean的几种方式

    Spring注解创建Bean的几种方式 1.@Component系列 @Component @Service @Repository @Controller @Configuration 2. 依附于 ...

  10. Spring容器中Bean的作用域

    当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域.Spring支持如下5种作用域: singleton:单例模式,在整个Spring I ...

最新文章

  1. 计算机视觉在生物力学和运动康复中的应用和研究
  2. 裸设备 linux,Linux平台下裸设备的绑定:
  3. dataframe 提取月数据_pandas dataframe数据提取的方法
  4. python的image读取的图片是什么类型的-python如何实现读取并显示图片(不需要图形界面)...
  5. Binder实用指南(一) - 理解篇
  6. java.util.concurrent.Exchanger应用范例与原理浅析
  7. 16 | 基础篇:怎么理解内存中的Buffer和Cache?
  8. clr 面试_Java中高级面试题及答案
  9. 串口中断和定时器中断_启士 | 蓝桥杯单片机教程12 中断与定时器 (上)
  10. yjv是电缆还是电线_电力电缆载流量,都说有这一份最新汇总就够了
  11. 1月8日 官方ros.org太慢,配置中科院ros镜像源 关于解决Ubuntu 14.04安装ros提示校验错误解决
  12. Gridview 增加多个空行。
  13. windows的映射驱动器
  14. 打砖块python游戏源代码_python制作一个打砖块小游戏
  15. android fd泄露分析,文件描述符(fd)泄漏排查一篇就够了
  16. 中国水疗产品行业市场供需与战略研究报告
  17. Docker创建容器后无法update更新以及Job for docker.service failed because the control……错误
  18. English trip 自习内容 英语时态
  19. CSS中内容的剪切属性clip
  20. php 验证 繁体,验证码上中文字是繁体

热门文章

  1. Mvc中Session导致action不异步的问题
  2. 怎么checkout一个gerrit提交,完事之后再push
  3. 《JavaScript 模式》读书笔记
  4. python移动文件
  5. 如何将文章列表用li分两列显示
  6. MongoDB学习笔记~官方驱动的原生Curd操作
  7. java实现倒计时源码分享
  8. 整数实例hdu2041(超级楼梯)
  9. 11.string容器
  10. 关于大型网站技术演进的思考(六)-存储的瓶颈6