Spring是一個開放源代碼的設計層面框架,他解決的是業務邏輯層和其他各層的鬆耦合問題,因此它將面向接口的編程思想貫穿整個系統應用。Spring的核心是控制反轉(IoC)和面向切面(AOP)
IOC
package com.entity;
/*
* 學生實體類
*/
public class Student {
private String name;
private int age;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
// show方法
public void show(){
System.out.println("姓名:"+name+" 年齡:"+age);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!-- 配置文件 -->
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- 配置service
<bean> 配置需要創建的對象
id :用於之後從spring容器獲得實例時使用的
class :需要創建實例的全限定類名
-->
<!-- 描述Student類創建的方式 -->
<bean id="stu" class="com.entity.Student">
<property name="name" value="墨漸生微"></property>
<property name="age" value="21"></property>
</bean>
</beans>
package com.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.entity.Student;
/*
* 測試
*/
public class Test {
public static void main(String[] args) {
// ① 獲取spring容器
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
// ② 獲取Student實例化對象,不需要new,直接從spring容器中獲取
Student stu = (Student) ac.getBean("stu");
/*
* IOC:由容器控制程序之間的關係,
* 控制權由應用代碼中轉到了外部容器,控制權的轉移,是所謂反轉
*/
stu.show();
}
}
接口IOC
package com.services;
/*
* 接口
*/
public interface IUsb {
public void work();
}
package com.services;
/*
* 接口實現類:充電器
*/
public class ChargerUsbImp implements IUsb{
private String name ;
public ChargerUsbImp() {
super();
// TODO Auto-generated constructor stub
}
public ChargerUsbImp(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void work() {
System.out.println(name+"正在充電中.........");
}
}
package com.services;
/*
* 接口實現類:硬盤
*/
public class DiskUsbImp implements IUsb{
private String name;
public DiskUsbImp(String name) {
super();
this.name = name;
}
public DiskUsbImp() {
super();
// TODO Auto-generated constructor stub
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void work() {
System.out.println(name+"正在複製文件中.......");
}
}
<bean id="usb" class="com.services.DiskUsbImp">
<property name="name" value="金士頓硬盤"></property>
</bean>
<!--
<bean id="usb" class="com.services.ChargerUsbImp">
<property name="name" value="小米充電器"></property>
</bean>
-->
package com.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.services.IUsb;
/*
* 測試
*/
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
// 通過接口多態,修改配置xml文件,可以實現接口多調用
IUsb iu =(IUsb) ac.getBean("usb");
iu.work();
}
}
依賴注入
即組件之間的依賴關係由容器在運行期決定,形象的來說,即由容器動態的將某種依賴關係注入到組件之中
依賴注入方式:手動裝配 和 自動裝配
手動裝配:一般進行配置信息都採用手動
基於xml裝配:構造方法、setter方法
基於註解裝配:
構造方法
package com.entity;
public class Student {
private String name;
private int age;
public Student(String name, int age) {
System.out.println("構造方法運行中....");
this.name = name;
this.age = age;
}
}
<bean id="stu" class="com.entity.Student">
<!-- 構造方法注入:
name :參數的名稱
value:設置普通數據
-->
<!-- 賦值的兩種方式 -->
<constructor-arg name="name" value="Micro"></constructor-arg>
<constructor-arg name="age">
<value>21</value>
</constructor-arg>
</bean>
setter方法
package com.entity;
public class Student {
private String name;
private int age;
public void setName(String name) {
System.out.println("姓名設置中.......");
this.name = name;
}
public void setAge(int age) {
System.out.println("年齡設置中.......");
this.age = age;
}
}
<bean id="stu" class="com.entity.Student">
<!-- setter注入 -->
<property name="name" value="Micro"></property>
<property name="age">
<value>21</value>
</property>
</bean>
ref屬性參考指定
package com.entity;
/*
* 班級實體類
*/
public class Classs {
private String clsno;
private String cname;
private String addr;
public void setClsno(String clsno) {
this.clsno = clsno;
}
public void setCname(String cname) {
this.cname = cname;
}
public void setAddr(String addr) {
this.addr = addr;
}
}
package com.entity;
public class Student {
private String name;
private int age;
private Classs classs;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setClasss(Classs classs) {
this.classs = classs;
}
}
<!-- 注入Classs -->
<bean id="classs" class="com.entity.Classs">
<property name="clsno" value="8801"></property>
<property name="cname" value="Java"></property>
<property name="addr" value="Beijing"></property>
</bean>
<!-- 注入Student -->
<bean id="stu" class="com.entity.Student">
<property name="name" value="Micro"></property>
<property name="age" value="21"></property>
<!-- 屬性爲引用數據類型:ref指向容器中的其他bean -->
<!--
<property name="classs" ref="classs"></property>
-->
<property name="classs">
<ref bean="classs"/>
</property>
</bean>
集合注入
package com.entity;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
/*
* 集合測試類
*/
public class Tests {
private List<String> list;
private Set<String> set;
private Map<String,String> map;
private Properties prop;
public void setList(List<String> list) {
this.list = list;
}
public void setSet(Set<String> set) {
this.set = set;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public void setProp(Properties prop) {
this.prop = prop;
}
}
<bean id="test" class="com.entity.Tests">
<!-- List集合 -->
<property name="list">
<list>
<value>墨漸生微</value>
<value>Micro</value>
</list>
</property>
<!-- Set集合 -->
<property name="set">
<set>
<value>Peter</value>
<value>Myth</value>
</set>
</property>
<!-- Map集合 -->
<property name="map">
<map>
<entry key="A" value="Rose"></entry>
<entry key="B" value="Gole"></entry>
</map>
</property>
<!-- Properties -->
<property name="prop">
<props>
<prop key="A">Sealr</prop>
<prop key="B">Bob</prop>
</props>
</property>
</bean>
自動裝配: autowire
no:默認情況下,不自動裝配,通過“ref”attribute手動設定
buName:根據Property的Name自動裝配,如果一個bean的name,和另一個bean中的Property的name相同,則自動裝配這個bean到Property中
<!-- 注入班級Classs -->
<bean id="classs" class="com.entity.Classs">
<property name="cname" value="Java"></property>
<property name="addr" value="NewYork"></property>
</bean>
<!-- byName:通過Student類的班級屬性名查找id爲此的bean自動裝配 -->
<bean id="stu" class="com.entity.Student" autowire="byName">
<property name="name" value="Micro"></property>
<property name="age" value="21"></property>
</bean>
byType:根據Property的數據類型(Type)自動裝配,如果一個bean的數據類型,兼容另一個bean中Property的數據類型,則自動裝配
<!-- 注入Classs -->
<bean id="classs" class="com.entity.Classs">
<property name="cname" value="Java"></property>
<property name="addr" value="NewYork"></property>
</bean>
<!-- byType:通過Student類的班級屬性的類型查找此類型的bean自動裝配 -->
<bean id="stu" class="com.entity.Student" autowire="byType">
<property name="name" value="Micro"></property>
<property name="age" value="21"></property>
</bean>
constructor :根據構造函數參數的數據類型,進行byType模式的自動裝配
autodetect:如果發現默認的構造函數,用constructor模式,否則,用byType模式