Spring之IOC&DI

最近学习Spring框架,刚学了反转控制与依赖注入,然后在博客上搜了一下发现了一篇写的非常好的博客,现在分享出来。

原文链接:https://blog.csdn.net/LABLENET/article/details/50404476

一 . spring的DI
依赖注入,一句话总结 :给属性赋值 ;
一个类中的属性都可以采用springDI的方式进行赋值,但是并不是所有的属性都适合赋值;

  1. 利用set给属性赋值
    示例:
    (1)当前两个对象 Person和Student

–Person

package cn.labelnet.di.set;
 
public class Person {
 
}

–Student

package cn.labelnet.di.set;
 
import java.util.List;
import java.util.Map;
import java.util.Set;
 
public class Student {
	private Integer id;
	private String sName;
	private String sPass;
	private List stus;
	private Map maps;
	private Set sets;
	
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getSName() {
		return sName;
	}
	public void setSName(String name) {
		sName = name;
	}
	public String getSPass() {
		return sPass;
	}
	public void setSPass(String pass) {
		sPass = pass;
	}
	public List getStus() {
		return stus;
	}
	public void setStus(List stus) {
		this.stus = stus;
	}
	public Map<String, String> getMaps() {
		return maps;
	}
	public void setMaps(Map<String, String> maps) {
		this.maps = maps;
	}
	public Set getSets() {
		return sets;
	}
	public void setSets(Set sets) {
		this.sets = sets;
	}
 
}

(2)bean配置和赋值

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
 
	<bean id="student" class="cn.labelnet.di.set.Student">
 
		<property name="id" value="1"></property>
 
		<property name="maps">
 
			<map>
				<entry key="m1">
					<value>yuan</value>
				</entry>
				<entry key="m2">
				    <value>zhuo</value>
				</entry>
				<entry key="m3">
				    <value>ming</value>
				</entry>
			</map>
 
		</property>
		
		<property name="sets">
		    
		    <set>
		       <value>h1</value>
		       <value>h2</value>
		       <ref bean="persion"/>
		       <value>h4</value>
		    </set>
		
		</property>
		
		<property name="SName">
			<value>LABELNET</value>
		</property>
		
		<property name="SPass"> 
		    <value>MMMMMMMM</value>
		</property>
		
		<property name="stus">
		     <list>
		       <ref bean="persion"/>
		       <ref bean="persion"/>
		     </list>
		</property>
 
	</bean>
 
 
	<bean id="persion" class="cn.labelnet.di.set.Person"></bean>
</beans>

(3)总结

  1. 引用类型 使用ref
  2. 属性 使用 property
  3. list集合 list
  4. set集合 set
  5. map集合使用 map , entry
  6. 普通类型使用 value

2.利用构造函数给属性赋值
1)如果Spring的配置文件中的bean中没有元素,则调用默认的构造函数;
2)如果Spring的配置文件中的bean中有元素,则该元素确定唯一的构造函数
index 代表 参数的位置 ,从0开始
type 指的是参数的类型
value 给基本类型赋值
ref 给引用类型赋值

示例:
(1)实现类 Student

public class Person {
	
	private String name;
	private Integer age;
	private Student student;
	
	public Person(String name,Integer age,Student student) {
		this.name=name;
		this.age=age;
		this.student=student;
	}
 
	public String getName() {
		return name;
	}
 
	public void setName(String name) {
		this.name = name;
	}
 
	public Integer getAge() {
		return age;
	}
 
	public void setAge(Integer age) {
		this.age = age;
	}
 
	public Student getStudent() {
		return student;
	}
 
	public void setStudent(Student student) {
		this.student = student;
	}
}

(2)Student

public class Student {
 
	public void hi(){
		System.out.println("依赖注入 :DI 构造函数赋值");
	}
	
}

(3)bean配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
     
     <bean id="person_con" class="cn.labelnet.di.constructor.Person">
          <constructor-arg index="0" type="java.lang.String" value="yuan"></constructor-arg>
          <constructor-arg index="1" type="java.lang.Integer" value="18"></constructor-arg>
          <constructor-arg index="2" type="cn.labelnet.di.constructor.Student" ref="student_con"></constructor-arg>
     </bean>
     
     
     <bean id="student_con" class="cn.labelnet.di.constructor.Student"></bean>
     
</beans>

(4)测试

public class SpringInit {
	
	public final static ApplicationContext context;
	
    static{
    	context=new ClassPathXmlApplicationContext("ApplicationContext.xml");
    }
 
}
public class TestDIConstructor extends SpringInit{
	
	@Test
	public void testDICons(){
		
	   Person person=(Person) context.getBean("person_con");
	   System.out.println(person.getName()+" | "+person.getAge());
	   Student s = person.getStudent();
	   s.hi();
		
	}
	
 
}

二. SpringIOC和DI的意义
实现了完全的面相接口编程

示例:person : child  man oldman

描述:person接口,有个sayhi方法,使得child,man,oldman均实现person接口和sayhi方法

(1)Person接口

public interface Person {
	void sayHi();
}

(2)ChildPerson实现

public class ChildPerson implements Person {
	
	private String name;
	private Integer age;
     public String getName() {
		return name;
	}
 
	public void setName(String name) {
		this.name = name;
	}
 
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public void sayHi(){
    	 System.out.println("小孩子:"+this.name+this.age);
     }	
}

(3)ManPerson实现

package cn.labelnet.implement;
 
public class ManPerson implements Person{
	
	private String name;
	private Integer age;
	
	  public void sayHi(){
		  System.out.println("Man :"+this.name+this.age);
	     }
	  public String getName() {
			return name;
		}
 
 
 
		public void setName(String name) {
			this.name = name;
		}
 
 
 
		public Integer getAge() {
			return age;
		}
 
 
 
		public void setAge(Integer age) {
			this.age = age;
		}
 
}

(4)OldManPerson实现

package cn.labelnet.implement;
 
public class OldmanPerson implements Person {
 
	private String name;
	private Integer age;
 
	public void sayHi() {
		System.out.println("OldMan:" + this.name + this.age);
	}
 
	public String getName() {
		return name;
	}
 
	public void setName(String name) {
		this.name = name;
	}
 
	public Integer getAge() {
		return age;
	}
 
	public void setAge(Integer age) {
		this.age = age;
	}
 
}

(5)PersonManager实现

package cn.labelnet.implement;
 
public class PersonManager {
	
	private Person person;
 
	public Person getPerson() {
		return person;
	}
 
	public void setPerson(Person person) {
		this.person = person;
	}
	
	
	public void say(){
		person.sayHi();
	}
 
}

(6)bean配置实现

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
 
	<bean id="child_person_impl" class="cn.labelnet.implement.ChildPerson">
		<property name="name" value="Child"></property>
		<property name="age" value="18"></property>
	</bean>
 
	<bean id="man_person_impl" class="cn.labelnet.implement.ManPerson">
		<property name="name" value="Man"></property>
		<property name="age" value="19"></property>
 
	</bean>
 
	<bean id="oldman_person_impl" class="cn.labelnet.implement.OldmanPerson">
		<property name="name" value="OldMan"></property>
		<property name="age" value="19"></property>
	</bean>
	
	<bean id="person_manager"  class="cn.labelnet.implement.PersonManager">
	
	   <property name="person" ref="child_person_impl"></property>
	
	 </bean>
 
</beans>

(7)测试
传统的测试方法 :

Person per=new ChildPerson();
		PersonManager manager=new PersonManager();
		manager.setPerson(per);
		manager.say();

bean.xml测试

public class TestImplement extends SpringInit{
	
	@Test
	public void testImlp(){
		
		
		PersonManager manager=(PersonManager) context.getBean("person_manager");
		manager.say();
	}
 
}

三.Demo下载

http://download.csdn.net/detail/lablenet/9377346

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值