spring配置bean获取bean的两种方式 id 或者 类型。依赖注入的3种方式

获取Bean的两种方式 

方式一:通过id获取

示例代码:

HelloWorld helloWorld=(HelloWorld)ctx.getBean("id名称");

方式二:通过类型获取

示例代码:

HelloWorld helloWorld=(HelloWorld)ctx.getBean("类型名.class");

优缺点: 

通过id获取的实例是唯一的,通过类型注入除非在配置文件中只配置了一个bean

如果配置了多个同类型的bean,那么通过方式二获取对象会报   不是唯一的bean错误提示

两种获取bean的方式都必须有默认的无参构造方法 


扫描二维码关注公众号,回复: 8807087 查看本文章

依赖注入的3种方式

  1. 属性注入
  2. 构造器注入
  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);
	}
}

其它都一样

发布了242 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41813208/article/details/103650592