spring详解:spring IOC依赖注入的几种方式

依赖注入(Dependency Injection)是用于实现控制反转(Inversion of Control)的最常见的方式之一,本文详细接收依赖注入各种数据类型和多种方法


准备

准备的两个类:User、Student


User类有三个属性,和两个构造器

package cn.mym.entity;

public class User {
	private Integer userId;
	private String username;
	private String password;
	
	public User(Integer userId, String username, String password) {
		this.userId = userId;
		this.username = username;
		this.password = password;
	}
	
	public User(){}		//默认构造器再次显示的声明
	
	public Integer getUserId() {
		return userId;
	}
	public void setUserId(Integer userId) {
		this.userId = userId;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}

	@Override
	public String toString() {
		return "User [userId=" + userId + ", username=" + username
				+ ", password=" + password + "]";
	}

Student中有自定义引用类型、复杂类型的准备

package cn.mym.entity;

import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class Student {
	
	private User user;			//引用类型的注入

	private String[] arr;		//数组类型注入
	
	private List<String> list;	//List类型注入

	private Set<String> set;		//Set类型注入
	
	private Map<String,Integer> map;	//Map类型注入
	
	private Properties pro;			//Properties类型注入
	
	/**演示构造器注入引用类型*/
	public Student(User user){
		this.user = user;
	}
    
        public Student(){}        //显示声明默认构造器

     //===========setter方法  由于篇幅问题,省略了 用来获取数据的getter方法===================
	
	public void setUser(User user) {
		this.user = user;
	}
	
	public void setArr(String[] arr) {
		this.arr = arr;
	}

	public void setList(List<String> list) {
		this.list = list;
	}

	public void setSet(Set<String> set) {
		this.set = set;
	}

	public void setMap(Map<String, Integer> map) {
		this.map = map;
	}

	public void setPro(Properties pro) {
		this.pro = pro;
	}

 }

属性注入的两种方式

setter方法注入

User类中的几个属性的注入,几个属性都需要有setter方法

配置:

<bean id="user" class="cn.mym.entity.User">
        	<!-- 注入user对象中的属性 -->
        	<property name="userId" value="10"></property>
        	<property name="username" value="123mmm"></property>
        	<property name="password" value="456yyy"></property>
 </bean>
测试:

@Test
public void test() {
	User user = (User) ac.getBean("user");
	System.out.println(user);
}
结果:输出:User [userId=10, username=123mmm, password=456yyy]

构造器注入

构造器注入基本封装类型--注入常量

配置:

        <!-- 构造器注入基本封装类型 -->
       <bean id="user1" class="cn.mym.entity.User">
        	<constructor-arg index="0" value="20"/>
        	<constructor-arg index="1" value="123m"/>
        	<constructor-arg index="2" value="456y"/>
        </bean>
测试输出:User [userId=20, username=123m, password=456y]


构造器注入自定义引用类型的属性--注入变量

用Student的对象创建演示构造器注入User类型属性
配置:

        <!-- 构造器注入自定义引用类型-变量 -->
        <bean id="stu" class="cn.mym.entity.Student">
        	<!-- 
        		通过构造器方式指定注入的bean
        		type:要注入的bean类型全名
        		ref:就是要注入的bean
         	-->
        	<constructor-arg index="0" type="cn.mym.entity.User" ref="user1"/>
        </bean>
测试:

        @Test
	public void test() {
		Student stu = (Student) ac.getBean("stu");
		System.out.println(stu.getUser());
	}
输出:User [userId=20, username=123m, password=456y]


注入外部bean


注入外部bean也就是注入自定义引用类型的属性,这里使用Student类来说明注入user属性


配置:

        <bean id="stu1" class="cn.mym.entity.Student">
        	<!-- name:要注入的属性
        		ref:注入的bean的id,此user1已经配置好
        	 -->
        	<property name="user" ref="user1"></property>
        </bean>

测试:

	@Test
	public void test() {
		Student stu = (Student) ac.getBean("stu1");
		System.out.println(stu.getUser());
	}
结果:User [userId=120, username=stu1123m, password=stu1456y]


内部bean注入


即要注入的bean在内部定义


配置:

        <!-- 注入内部bean -->
        <bean id="stu2" class="cn.mym.entity.Student">
        	<property name="user">
        		<bean class="cn.mym.entity.User">
        			<!-- user的属性注入-这里为了篇幅注入一个 -->
        			<property name="username" value="one"></property>
        		</bean>
        	</property>
        </bean>

测试:

        @Test
	public void test() {
		Student stu = (Student) ac.getBean("stu2");
		System.out.println(stu.getUser());
	}
结果:User [userId=null, username=one, password=null]

P名称空间注入

 p 名称空间给对象的属性注入值(spring3.0以上版本才支持)

通过User类bean的创建来说明

配置:

首先约束要声明p名称空间:

xmlns:p="http://www.springframework.org/schema/p"
创建bean:

 <!-- p名称空间注入 -->
 <bean id="user2" class="cn.mym.entity.User" p:username="pName"/>
测试:

@Test
	public void testUser() {
		User user = (User) ac.getBean("user2");
		System.out.println(user);
	}
结果:User [userId=null, username=pName, password=null]

注入复杂数据类型


注入数组

注入Set集合

注入List集合

注入Map集合

注入Properties类型

<!-- 注入复杂数据类型 -->
        <bean id="stu3" class="cn.mym.entity.Student">
        	<property name="arr">
        		<list>
        			<value>a1</value>
        			<value>a2</value>
        		</list>
        	</property>
        	<property name="list">
        		<list>
        			<value>l1</value>
        			<value>l2</value>
        		</list>
        	</property>
        	<property name="set">
        		<set>
        			<value>s1</value>
        			<value>s2</value>
        		</set>
        	</property>
        	<property name="map">
        		<map>
        			<entry key="m1" value="123"/>
        			<entry key="m2" value="456"/>
        		</map>
        	</property>
        	<property name="pro">
        		<props>
        			<prop key="p1" >777</prop>
        			<prop key="p2" >999</prop>
        		</props>
        	</property>
        </bean>

测试:

       @Test
	public void testStu() {
		Student stu = (Student) ac.getBean("stu3");
		System.out.println(stu.getArr());
		System.out.println(stu.getList());
		System.out.println(stu.getSet());
		System.out.println(stu.getMap());
		System.out.println(stu.getPro());
	}

结果:

[Ljava.lang.String;@6e9ba4a9
[l1, l2]
[s1, s2]
{m1=123, m2=456}
{p2=999, p1=777}





小结:以上就是全部的依赖注入各种数据类型的多种方式,常用的就是通过setter方法进行注入,所以说过,一个类的属性想要通过spring进行注入,需要提供:无参构造器+属性的setter方法


spring的再次回顾总结,若有详述不当之处,感谢您私信纠正


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值