Spring注入详解(构造函数,set,注解)

Spring注入详解


什么是spring注入?

依赖注入(Dependency Injection)

IOC 会降低程序之间的耦合,但是也不是说就没有依赖关系,而这个关系就交给了spring 来进行管理和维护,依赖注入是Spring协调不同Bean实例之间的合作而提供的一种工作机制,在确保Bean实例之间合作的同时,并能保持每个Bean的相对独立性。

在Spring框架下,当Bean实例 A运行过程中需要引用另外一个Bean实例B时,Spring框架会创建Bean的实例B,并将实例B通过实例A的构造函数、set方法、自动装配和注解方式注入到实例A,这种注入实例Bean到另外一个实例Bean的过程称为依赖注入。
!经常变化的数据并不适合注入

能注入的数据:

  • 基本类型和String
  • 其他bean类型(能够有效读取到的bean,在配置文件或者注解标识过)
  • 复杂类型和集合类型(需要借用其他标签,比较复杂)

注入方式

  • 使用构造函数提供
  • 使用set 方法提供
  • 使用注解提供

构造函数注入
优势:在获取对象时,注入必须是必须的操作,否则对象无法创建成功,可以在实例化时,提供一些默认参数
弊端:改变了Bean对象的实例化方式,使我们在创建对象时,即使用不到,也必须提供。

private Sting name;
private Integer age;
private Date birthday;

//构造函数
public  UserInfoBean(String name, String age,String birthday){
     
			this.name = name;
			this.age = age;
			this.birthday =birthday;
}

当我们拥有这样一个类的时候,在配置bean.xml的代码:

<bean id="userInfoBean" class="com.slq.bean.UserInfoBean">
//属性值介绍
	//type:指定要注入的数据类型,但是如果存在两个String 就不会完成
	//index:的依据索引赋值,从0开始
	//name:按照构造函数提供的名称来使用
	//=============================
	//value:所提供的值
	//ref:所提供的值,引用spring 的ioc核心容器中出现的bean
	<constructor-arg name="name" value="zhangsan"> </constructor-arg>
	<constructor-arg name="age" value="18"> </constructor-arg>
	//对date赋值比较特殊
	<constructor-arg name="date" ref="now"> </constructor-arg>
</bean>

//读取权限类名,反射到一个date对象,id=now
<bean id="now" class = "java.util.Date">

</bean>

set 方法注入(更常用)

优势:解决了构造方法注入的弊端,没有明确的限制
弊端:如果某个成员必须要有值,set 无法保证必须会注入

private String name;
private Integer age;
private Date birthday;

public void setName(String name){
     
	this.name = name;
}

//同样其他两个set 方法,这里略掉

bean.xml 代码如下

<bean id="userInfoBean" class="com.slq.bean.UserInfo">
//只有name ref value 属性
	//name: 找set方法的名称,去掉set后的值
	//value:自提供的值	
	//ref:
	<property name="name" value="zhangsan"><property>
	<property name="age" value="18"><property>
	<property name="ref" value="now"><property>
</bean>

//此处的now 请参见上一条

复杂类型注入(数组,集合)

可以相互替换的

用于给list 集合注入的: list array set
用户给map 注入的时候:map properties

private String[] myStrs;
private List<String> myList;
private Set<String> mySet;
private Map<String,String> myMap;
private Properties myProperties;

//此处略去set方法,偷个懒

bean.xml 文档:

<bean id="" class="">
	//数组的注入
	<property name="myStrs">
		<array>
			<value>111</value>
			<value>abd</value>
		</array>	
	</property>
	 //set的注入
	 <property name="mySet">
		<set>
 			<value>111</value>
  	   		<value>abd</value>
   		</set> 
 	</property>
 	//map
 	<property name="myMap">
		<map>
			<entry key="" value=""></entry>
		</map>
	</property>
	//prop
	<property name="myPropertey">
  		<props>
  			 <prop key="aaa">111</entry>
  		</props>
	 </property>
</bean>

你可能感兴趣的:(Java)