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());
}
}
}