Spring是一个轻量级额的控制反转和面向切面的容器框架。
Spring的特点:1、轻量(非入侵式)2、控制反转(Inversion of Control)3、面向切面(AOP)4、容器5、框架
核心机制:依赖注入
通常由调用者来创建被调用者的实例(比如说武士使用剑,武士就依赖于剑),在Spring里,创建被调用者由Spring容器来完成(因此称为控制反转),然后注入调用者(因此称为依赖注入)。
注入的方式有两种:设值注入(采用setter方法) 和 构造注入
设值注入有 1、8中基本属性 和 String 2、数组 3、集合
下面是一个例子
package com.test; import java.util.List; import java.util.Map; import java.util.Set; public class User { //基本数据类型 private String name; //引用类型 private Bow bow; //集合 private Address [] addr; private List list; private Set set; private Map map; public String getName() { return name; } public void setName(String name) { this.name = name; } public Bow getBow() { return bow; } public void setBow(Bow bow) { this.bow = bow; } public Address[] getAddr() { return addr; } public void setAddr(Address[] addr) { this.addr = addr; } public List getList() { return list; } public void setList(List list) { this.list = list; } public Set getSet() { return set; } public void setSet(Set set) { this.set = set; } public Map getMap() { return map; } public void setMap(Map map) { this.map = map; } }
必须提供setter 和getter 方法
package com.test; public class Bow { //user 可以使用武器 private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
package com.test; public class Address { //user的地址 private String street; public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } }
<?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.0.xsd"> <bean id="user" class="com.test.User"> <!-- 基本类型 --> <property name="name" value="cl"/> <!-- 引用 --> <property name="bow" ref="bow" /> <!-- 集合 数组 --> <property name="addr"> <list> <ref bean="addr1"/> <ref bean="addr2"/> <ref bean="addr3"/> </list> </property> <!-- 集合 list --> <property name="list"> <list> <ref bean="addr1"/> <ref bean="addr2"/> <ref bean="addr3"/> <value type="java.lang.Integer">11</value> <value type="java.lang.Integer">11</value> </list> </property> <!-- 集合 set --> <property name="set"> <set> <ref bean="addr1"/> <ref bean="addr2"/> <ref bean="addr3"/> <value type="java.lang.Integer">11</value> <value type="java.lang.Integer">12</value> </set> </property> <!-- 集合 map --> <property name="map"> <map> <entry key="1" value="1" /> <entry key="2" value="2" /> <entry key="3" value="3" /> <entry key="4" value-ref="addr1"/> </map> </property> </bean> <!-- 引用 --> <bean id="bow" class="com.test.Bow"> <property name="name" value="弓箭" /> </bean> <!-- 数组 --> <bean id="addr1" class="com.test.Address"> <property name="street" value="中山路" /> </bean> <bean id="addr2" class="com.test.Address"> <property name="street" value="南昌路" /> </bean> <bean id="addr3" class="com.test.Address"> <property name="street" value="瑞京路" /> </bean> </beans>
package com.test; import java.util.List; import java.util.Map; import java.util.Set; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; /** * 测试类 * */ public class Test { public static void main(String[] args) { //使用Spring的Ioc ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //ApplicationContext context = new FileSystemXmlApplicationContext("src/applicationContext.xml"); User hello = (User)context.getBean("user"); //hello.setStr("this is Helloword!!--"); System.out.println(hello.getBow().getName()); //取数组 System.out.println("******取数组******"); Address addr[] = hello.getAddr(); for(int i=0;i<addr.length;i++) System.out.println(addr[i].getStreet()); //取list System.out.println("******取list******"); List list = hello.getList(); for(Object out:list){ if(out.getClass()==Integer.class) System.out.println(out); else System.out.println(((Address)out).getStreet()); } //取set System.out.println("******取set******"); Set set = hello.getSet(); for(Object out:set){ if(out.getClass()==Integer.class) System.out.println(out); else System.out.println(((Address)out).getStreet()); } //取map System.out.println("******取map******"); Map<String,Object> map = hello.getMap(); for(String out:map.keySet()){ if(map.get(out).getClass()==String.class) System.out.println(out + "=" + map.get(out)); else System.out.println(((Address)map.get(out)).getStreet()); } } }