spring容器创建bean对象的方式以及如何处理多个spring配置文件
1.spring容器创建bean对象的方式
注意:我们之前说的DI依赖注入是对于bean对象的属性的注入,是如何给属性赋值,如何配置属性,并不是创建对象。
(1)xml文件中有bean的配置,而且这个bean所对应的java类中存在一个无参构造器,那么这个时候spring容器就可以使用反射调用无参构造器来创建实例了(常规的方式);所以默认下我们是用无参构造器来创建bean的。这里和我们就是我们原来的做法,不进行代码演示,如果想测试,可以把一个bean类的无参构造器去掉,发现程序会报错。
(2)通过工厂类获得实例(工厂类实现了接口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>
- <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在容器中拿对象的时候,
拿到并不是这个工厂类对象,而是这个工厂类对象调用完工厂方法后所返回的对象.
-->
- <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>
上面的代码是配置bean的工厂类,然后得到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);
//一个普通的工厂类
- public class CatFactoryBean {
- public Cat getCat(int id,String name){
- return new Cat(id, name);
- }
- }
- <bean id="catFactory" class="com.hoperun.spring.CatFactoryBean"></bean>
- <bean id="cat" class="com.hoperun.spring.Cat" factory-bean="catFactory" factory-method="getCat">
- <constructor-arg value="22"></constructor-arg>
- <constructor-arg value="fengwei"></constructor-arg>
- </bean>
(4)通过静态工厂获得实例
静态工厂:就是得到工厂的方法是静态的
- public static Cat getCat1(int id,String name){
- return new Cat(id, name);
- }
- <bean id="cat" class="com.hoperun.spring.CatFactoryBean" factory-method="getCat1">
- <constructor-arg value="2222"></constructor-arg>
- <constructor-arg value="fengwei"></constructor-arg>
- </bean>
2,处理多个配置文件
我们发现spring的配置文件每次都是指定加载的applicationContext.xml,如果把所有的bean配置都加入一个文件中,太大了,所以spring的配置文件是可以有多个的,多个文件可以一起加载。方法一:ClassPathXmlApplicationContext(),它有几个重载的构造器,参数不一样,可以是一个String[]数组,这样就明白了,可以将所有的名字都放在数组里,让它加载。
方法二:如果我们在spring框架中配置了多个xml文件,我们可以在读取配置文件的时候把这些xml文件一下全都读取,也可以只读一个总的xml文件,在这个总的xml文件中把其他的xml全都都导入进来。
例如:
- student.xml文件:
- <bean name="student" class="com.briup.bean.Student">
- <property name="id">
- <value>25</value>
- </property>
- </bean>
- teacher.xml文件:
- <bean name="teacher" class="com.briup.bean.Teacher">
- <property name="student" ref="student"></property>
- </bean>
- import.xml文件:
- <import resource="teacher.xml"/>
- <import resource="student.xml"/>
- main:
- String[] path = {"com/briup/ioc/imp/import.xml"};
- ApplicationContext container =
- new ClassPathXmlApplicationContext(path);
- Teacher t = (Teacher) container.getBean("teacher");
- System.out.println(t.getStudent());