获取Bean的两种方式
方式一:通过id获取
示例代码:
HelloWorld helloWorld=(HelloWorld)ctx.getBean("id名称");
方式二:通过类型获取
示例代码:
HelloWorld helloWorld=(HelloWorld)ctx.getBean("类型名.class");
优缺点:
通过id获取的实例是唯一的,通过类型注入除非在配置文件中只配置了一个bean
如果配置了多个同类型的bean,那么通过方式二获取对象会报 不是唯一的bean错误提示
两种获取bean的方式都必须有默认的无参构造方法
依赖注入的3种方式
- 属性注入
- 构造器注入
- 工厂注入
一、属性注入:
通过set方法注入:需要在类中包含set方法:如下配置则需要在类中有setName方法
<property name="name" value="spring" ></property>
二、构造方法注入:(需要有对应的构造方法才可以) ,如果有多个则多加几行即可
<constructor-arg value="name"></constructor-arg>
问题1:如果存在两个构造方法,并且其的参数个数相同,只是类型不同,例如一个是double一个是int,IOC容器如何识别?
解决方法:添加type属性 表示参数的类型 。如下
<constructor-arg value="name" type="java.lang.String"></constructor-arg>
问题2:如果格式相同、类型相同只是参数顺序不同呢?
解决方法:添加index属性 表示参数的位置。如下
<constructor-arg value="name" index="1"></constructor-arg>
另外需要注意的一点是index和type属性是可以混合使用的,也可以同时使用
三、工厂方法注入:
方式一:静态工厂方法注入
方式二:实例工厂方法注入
静态工厂方法:下面只是为了不报错实际工厂类不该如此设计
需要注意的是工厂方法必须是代参数的即下面的get方法,并且在配置文件中指定工厂类路径和构造方法
import com.taotao.beans.HelloWorld; public class StaticFactory { public static HelloWorld getHelloWorld(String name) { return new HelloWorld(name); } }
注入
<!--class要写工厂的类;factory-method要写工厂类中用于创建bean的方法 --> <bean id="factoryHelloWorld" class="com.taotao.beans.factory.StaticFactory" factory-method="getHelloWorld"> <constructor-arg value="Tom"></constructor-arg> </bean>
Main:
public class Main { public static void main(String[] args) { //获取spring ioc容器(从配置的xml文件中获取) ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); //获取bean HelloWorld helloWorld=(HelloWorld)ctx.getBean("factoryHelloWorld"); //调用hello方法 helloWorld.hello(); } }
HelloWorld类:
public class HelloWorld { private String name; public void setName(String name) { this.name=name; } public void hello() { System.out.println("hello "+name); } public HelloWorld() { super(); } public HelloWorld(String name) { super(); this.name = name; } }
实例工厂方法:
和上面的 不同之处在于方法中少了static而已,然后配置有所不同,如下
<bean id="instanceFactory" class="com.taotao.beans.factory.InstanceFactory"></bean> <bean id="instanceHelloWorld" factory-bean="instanceFactory" factory-method="getHelloWorld"> <constructor-arg value="Rose"></constructor-arg> </bean>
InstanceFactory类
import com.taotao.beans.HelloWorld; public class InstanceFactory { public HelloWorld getHelloWorld(String name) { return new HelloWorld(name); } }
其它都一样