问题?Spring的DI讲解、DI有几种注入方式、

一、spring的DI:依赖注入给属性赋值
DI定义:一个对象类的属性可以使用springDI(依赖注入)来进行赋值,但是并不是所有的类属性都适合springDI来赋值.,
一共有两种方式进行属性赋值:set方法和带参构造方法

案例1:setting方法为对象类属性赋值
Person类

package cn.itcast.sh.spring.di;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class Person {
	private Long pid;
	private String pname;
	private Student student;
	private List lists;
	private Map map;
	private Properties properties;
	private Set sets;

	public Long getPid() {
		return pid;
	}
	public void setPid(Long pid) {
		this.pid = pid;
	}
	public String getPname() {
		return pname;
	}
	public void setPname(String pname) {
		this.pname = pname;
	}
	public Student getStudent() {
		return student;
	}
	public void setStudent(Student student) {
		this.student = student;
	}
	public List getLists() {
		return lists;
	}
	public void setLists(List lists) {
		this.lists = lists;
	}
	public Map getMap() {
		return map;
	}
	public void setMap(Map map) {
		this.map = map;
	}
	public Properties getProperties() {
		return properties;
	}
	public void setProperties(Properties properties) {
		this.properties = properties;
	}
	public Set getSets() {
		return sets;
	}
	public void setSets(Set sets) {
		this.sets = sets;
	}
}

Student类、

package cn.itcast.sh.spring.di;
public class Student {
}

配置文件:

<?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">

			<!-- 先把person和student放入到spring容器中 -->
           <!-- SpringDI:依赖注入,本质就是向对象类的属性赋值 -->

           <!-- 用setting方式来为属性赋值 -->
           <bean id="person" class="cn.itcast.sh.spring.di.Person">
           	 <!--
	 			 property是用来描述一个类的属性
	 			   基本类型的封装类、String等需要值的类型用value赋值
				引用类型用ref赋值(一般是对象的注入)
			  -->
           		<property name="pid" value="2"></property>
           		<property name="pname" value="lijun"></property>
           		<property name="lists">
           			<list>
           				<value>list1</value>
           				<value>list2</value>
           				<ref bean="student"/>
           			</list>
           		</property>
           		<property name="map">
           			<map>
           				<entry key="m1">
           					<value>map1</value>
           				</entry>
           				<entry key="map2">
           					<ref bean="student"/>
           				</entry>
           			</map>
           		</property>
           		<!-- properties:只有String类型 -->
           		<property name="properties">
           			<props>
           				<prop key="p1">p1的值</prop>
           				<prop key="p2">p2的值</prop>
           			</props>
           		</property>
           		<property name="sets">
           			<set>
           				<value>set第一个值</value>
           				<value>set第二值</value>
           				<ref bean="student"/>
           			</set>
           		</property>
           		<property name="student">
           			<ref bean="student"/>
           		</property>
           </bean>

           <bean id="student" class="cn.itcast.sh.spring.di.Student"></bean>
</beans>

测试类:

package cn.itcast.sh.spring.ioc.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.itcast.sh.spring.di.Person;
import cn.itcast.sh.spring.di.Student;

public class IDTest {
	@Test
	public void A(){
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Person person = (Person)applicationContext.getBean("person");
		System.out.println(person.getPid());
		System.err.println(person.getStudent());
		System.out.println("--------------");
		System.out.println(person.getLists());
		System.out.println("--------------");
		System.out.println(person.getMap());
		System.out.println("--------------");
		System.out.println(person.getProperties());
		System.out.println("--------------");
		System.out.println(person.getSets());

	}
}

结果图片处:

案例2:带参构造器为对象类属性赋值

Person类

package cn.itcast.sh.spring.di.constructor;

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

public class Person {
	private String pname;
	private Student student;

	private void person() {}//如果写的有带参构造方法,一定要写默认的构造方法

	public Person(String pname,Student student){
		this.pname = pname;
		this.student = student;
	}

	public String getPname() {
		return pname;
	}

	public Student getStudent() {
		return student;
	}

}

配置文件:

<?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">

			<!-- 先把person和student放入到spring容器中 -->
           <!-- SpringDI:依赖注入,本质就是向对象类的属性赋值 -->

           <!-- 用构造函数的方式为属性赋值(
           		如果没有constructor-arg:默认情况下是调用的无参构造函数,
           		如果有constructor-arg:则调用带参数的构造函数) 

           		注:一个bean只能确认一个构造函数,因此在对象类中不能出现两个构造函数
           	-->

           <bean id="personConstructor" class="cn.itcast.sh.spring.di.constructor.Person">
           <!--
           	index:表示构造函数参数的位置
           	type:表示参数的类型
           	value:表示给基本类型赋值
           	ref:表示给引用类型赋值
            -->
           	<constructor-arg index="0" type="java.lang.String" value="aaa"></constructor-arg>
           	<constructor-arg index="1" type="cn.itcast.sh.spring.di.constructor.Student" ref="studentConstructor"></constructor-arg>
           </bean>

           <bean id="studentConstructor" class="cn.itcast.sh.spring.di.constructor.Student"></bean>
</beans>

测试类:

package cn.itcast.sh.spring.ioc.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.itcast.sh.spring.di.constructor.Person;

public class DIConstructorTest {
	@Test
	public void A(){
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Person person = (Person)applicationContext.getBean("personConstructor");
		System.out.println(person.getPname());
		person.getStudent().B();
	}
}

结果图片处:


案例写到这里;我们就可能要提一个问题了,那我们用这个方式来干甚呢?

用spring这种赋值方式,我们可以实现属性的赋值,还可以实现对象的注入,在我们进行对象的实现的时候,就不需要我们来做了,全部交给spring容器来做。

二、springIOC和DI的意义

意义:不完全面接口编程----->变成完全的接口编程(也就是将对象的产生给了spring产生,我们不需要关心是谁来实现的接口)

案例:spring+MVC模式

action层

package cn.itcast.sh.spring.mvc;
public class PersonAction {
	private PersonService personService;

	public PersonService getPersonService() {
		return personService;
	}

	public void setPersonService(PersonService personService) {
		this.personService = personService;
	}

	public void savePerson1(){
		this.personService.savePerson();
	}
}

service接口层及实现

package cn.itcast.sh.spring.mvc;

public interface PersonService {
	public void savePerson();
}
package cn.itcast.sh.spring.mvc;

public class PersonServiceImp implements PersonService {
	private PersonDao personDao;

	public PersonDao getPersonDao() {
		return personDao;
	}
	public void setPersonDao(PersonDao personDao) {
		this.personDao = personDao;
	}

	public void savePerson() {
		this.personDao.savePerson();
	}

}

Dao接口层及实现

package cn.itcast.sh.spring.mvc;

public interface PersonDao {
	public void savePerson();
}
package cn.itcast.sh.spring.mvc;

public class PersonDaoImp implements PersonDao {

	public void savePerson() {
		System.out.println("sava Person Dao!!");
	}

}

spring配置文件

<?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">
           <!-- Spring模拟MVC -->
           <bean id="personDao" class="cn.itcast.sh.spring.mvc.PersonDaoImp"></bean>
           <!-- 这里采用的是setting方法进行注入的 -->
           <bean id="personService" class="cn.itcast.sh.spring.mvc.PersonServiceImp">
           		<property name="personDao">
           			<ref bean="personDao"/>
           		</property>
           </bean>

           <bean id="personAction" class="cn.itcast.sh.spring.mvc.PersonAction">
           	  <property name="personService">
           	  		<ref bean="personService"/>
           	  </property>
           </bean>
</beans>

测试类:

package cn.itcast.sh.spring.ioc.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.itcast.sh.spring.mvc.PersonAction;
import cn.itcast.sh.spring.util.SpringUtil;

public class MVCTest  {
	@Test
	public void A(){
		ApplicationContext applicationContext = new  ClassPathXmlApplicationContext("applicationContext.xml");
		PersonAction personAction = (PersonAction)applicationContext.getBean("personAction");
		personAction.savePerson1();
	}
}

结果图片处:

spring容器IOC创建对象<三>的更多相关文章

  1. spring容器IOC创建对象<二>

    问题?spring是如何创建对象的?什么时候创建对象?有几种创建方式?测试对象是单例的还是多例的 ?对象的初始化和销毁? 下面的四大模块IOC的内容了!需要深刻理解 SpringIOC定义:把对象的创 ...

  2. spring容器IOC原理解析

    原理简单介绍: Spring容器的原理,其实就是通过解析xml文件,或取到用户配置的bean,然后通过反射将这些bean挨个放到集合中,然后对外提供一个getBean()方法,以便我们获得这些bean ...

  3. 菜鸟学SSH(十三)——Spring容器IOC解析及简单实现

    最近一段时间,“容器”两个字一直萦绕在我的耳边,甚至是吃饭.睡觉的时候都在我脑子里蹦来蹦去的.随着这些天一次次的交流.讨论,对于容器的理解也逐渐加深.理论上的东西终归要落实到实践,今天就借助Sprin ...

  4. Spring容器IOC解析及简单实现(转)

    文章转自http://blog.csdn.net/liushuijinger/article/details/35978965

  5. Spring详解(二)------IOC控制反转

    我相信提到 Spring,很多人会脱口而出IOC(控制反转).DI(依赖注入).AOP等等概念,这些概念也是面试官经常问到的知识点.那么这篇博客我们就来详细的讲解 IOC控制反转. ps:本篇博客源码 ...

  6. Spring_01 spring容器、控制反转(IOC)、依赖注入(DI)

    目录 1 什么是spring框架 2 spring框架的特点 3 spring容器 3.1 什么是spring容器 3.2 spring容器创建对象的编程步骤 3.4 spring容器创建对象的方式 ...

  7. Spring实战(二)Spring容器和bean的生命周期

    引入问题: 在XML配置文件中配置bean后,这些文件又是如何被加载的?它们被加载到哪里去了? Spring容器——框架核心 1.什么是Spring容器?它的功能是什么? 在基于Spring的应用中, ...

  8. 菜鸟学SSH(十四)——Spring容器AOP的实现原理——动态代理

    之前写了一篇关于IOC的博客——<Spring容器IOC解析及简单实现>,今天再来聊聊AOP.大家都知道Spring的两大特性是IOC和AOP,换句话说,容器的两大特性就是IOC和AOP. ...

  9. spring容器和上下文的理解

    spring容器和上下文的理解 spring框架现在使用的很多,这说明有其独特之处----依赖注入,很简单的四个字,在我们需要对象的时候,spring就可以给我们提供所需要的对象,对象的创建.销毁.管 ...

随机推荐

  1. 【shiro】一、基础概念

    来源:http://blog.csdn.net/swingpyzf/article/details/46342023/ &&&& http://jinnianshilo ...

  2. 实现listview中checkbox的多选与记录

    <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...

  3. 看病要排队(stl)

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  4. javascript的window.onload()方法和jQuery的$(document).ready()的对比

    jQuery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,不过与window.onload方法还是有区别的. 1.执行时间 windo ...

  5. 数据挖掘十大经典算法[0]-K-Means算法

    K-Means算法的输入N,K和一个size为N的向量组vector.输出K个两两互不相交的向量组.其本质是将给定的向量组划分成K个类别,使得同类别的向量相似度比较大,而不同类别的向量之间的相似度较小 ...

  6. BZOJ4143 [AMPPZ2014]The Lawyer

    Description Byteasar要制订m天的会议计划,一共有n场会议,第i场会议开始于第d[i]天的第a[i]秒,结束于第d[i]天的第b[i]秒. 对于每一天,请找出这一天的两场会议i,j, ...

  7. COJ975 WZJ的数据结构(负二十五)

    试题描述 输入一个字符串S,回答Q次问题,给你l,r,输出子序列[l,r]的最长连续回文串长度. 输入 第一行为一个字符串S. 第二行为一个正整数Q. 接下来Q行每行为l,r. 输出 对于每个询问,输 ...

  8. 用java删除文件夹里的所有文件

    import java.io.File; public class Test { public static void main(String args[]){ Test t = new Test() ...

  9. 提升 web 应用程序的性能(一)

       提升 web 应用程序的性能,找出瓶颈,加快客户端内容的速度.    作为 web 用户,我们知道页面加载或刷新的速度对其成功至关重要.本文将帮助您更好地理解影响 web 应用程序性能的因素.学 ...

  10. csv格式

    Name,Password nmae:xiaofan,password:1234567890 每个逗号就是一列