1. 程式人生 > >Spring框架及介紹控制反轉

Spring框架及介紹控制反轉

什麼是Spring

   Spring是一個開源框架,它由Rod Johnson建立。它是為了解決企業應用開發的複雜性而建立的。    Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。    然而,Spring的用途不僅限於伺服器端的開發。從簡單性、可測試性和鬆耦合的角度而言,任何Java應用都可以從Spring中受益。    目的:解決企業應用開發的複雜性    功能:使用基本的JavaBean代替EJB,並提供了更多的企業應用功能    範圍:任何Java應用    簡單來說,Spring是一個輕量級的控制反轉(IoC)和麵向切面(AOP)的容器框架。核心是控制反轉(IoC)和麵向切面(AOP)。

Spring的控制反轉(或依賴注入) 

什麼是控制反轉

控制反轉(IoC=Inversion of Control)IoC,用白話來講,就是由容器控制程式之間的(依賴)關係,而非傳統實現中,由程式程式碼直接操控。這也就是所謂“控制反轉”的概念所在:(依賴)控制權由應用程式碼中轉到了外部容器,控制權的轉移,是所謂反轉。

IoC還有一個另外的名字:“依賴注入 (DI=Dependency Injection)”  ,即由容器動態的將某種依賴關係注入到元件之中 

簡單的說:就是將以前由程式設計師例項化物件/賦值的工作交給了spring處理

準備

1.在pom.xml中依賴jar包

<dependency>   <groupId>org.springframework</groupId>   <artifactId>spring-context</artifactId>   <version>4.3.10.RELEASE</version> </dependency>

2、使用spring之前,可以在eclipse安裝外掛spring tool suite,專為Spring開發定製的,方便建立除錯執行維護Spring應用。

spring tool suite官方下載地址:http://spring.io/tools/sts/all 

案例講解IOC的用途:

userAction   沒用spring之前是要例項化物件的,用了spring之後將例項化物件或賦值的工作交給spring處理,記得要實現setget方法

package com.zking.spring.ioc.web;

import com.zking.spring.ioc.biz.UserBiz;
import com.zking.spring.ioc.biz.impl.UserBizImpl;

public class UserAction {
//	private UserBiz userBiz = new UserBizImpl();//x
	private UserBiz userBiz;//√
	
	public UserBiz getUserBiz() {
		return userBiz;
	}
	public void setUserBiz(UserBiz userBiz) {
		this.userBiz = userBiz;
	}
	public void aaa() {
		this.userBiz.doSomething();
	}
	public void bbb() {
		this.userBiz.doSomething();
	}
}

spring-context.xml     將例項化物件或賦值的工作交給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"
	default-autowire="byName"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 講解IOC的用途 -->
<bean class="com.zking.spring.ioc.biz.impl.UserBizImpl" id="userBiz2"></bean>
<bean class="com.zking.spring.ioc.biz.impl.UserBizImpl2" id="userBiz"></bean>
<bean class="com.zking.spring.ioc.web.UserAction" id="userAction">
	<property name="userBiz" ref="userBiz"></property>
</bean>
</beans>

測試: 通過spring自動建模獲取spring的上下文,獲取到工程中的所有類

package com.zking.ioc.test;

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

import com.zking.spring.ioc.web.ClzAction;
import com.zking.spring.ioc.web.StudentAction;
import com.zking.spring.ioc.web.TeaAction;
import com.zking.spring.ioc.web.UserAction;

public class IocTest {
	public static void main(String[] args) {
		//通過建模獲取spring的上下文,獲取到工程中的所有類
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-context.xml");
		UserAction userAction = (UserAction) applicationContext.getBean("userAction");
		userAction.aaa();
	
}

總結IOC的用途:將例項化物件或賦值的工作交給spring處理

案例講解IOC注入的型別及方式  

set注入         基本資料型別注入         集合注入         物件注入     構造注入         基本資料型別注入     自動裝配

........

studentAction

package com.zking.spring.ioc.web;

import java.util.List;

public class StudentAction {
	private Integer sid;
	private String sname;
	private List<String> hobbies;
	
	
	public StudentAction(Integer sid, String sname) {
		super();
		this.sid = sid;
		this.sname = sname;
	}
	public StudentAction() {
		
	}
	public void ccc() {
		System.out.println(this.sid+","+this.sname+","+this.hobbies);
	}
	public List<String> getHobbies() {
		return hobbies;
	}
	public void setHobbies(List<String> hobbies) {
		this.hobbies = hobbies;
	}
	
}

spring-context.xml

自動裝配一般byName用的多  default-autowire="byName"。

 byType:根據管理的JavaBean的介面屬性,在spring的上下中自動尋找實現類去注入, 當找到兩個以上時會報錯,與spring的上下文的id圍觀  byName:根據管理的Javabean中的介面名,在上下文中去尋找同名的id,進行注入。  

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	default-autowire="byName"<!--注意了-->
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!--ioc注入的型別以及方式  -->
<bean class="com.zking.spring.ioc.web.StudentAction" id="stuAction">
	<!--set方法注入  -->
	<!-- <property name="sid" value="22"></property>
	<property name="sname" value="包子"></property> -->
	<!-- 構造方法 -->
	<constructor-arg name="sid" value="38"></constructor-arg>
	<constructor-arg name="sname" value="吃肥包"></constructor-arg>
	<property name="hobbies">
		<list>
			<value>吃肉包</value>
			<value>啊哈哈</value>
		</list>
	</property>
</bean>
<!-- spring的新特性自動裝配 -->
<!-- byType:根據管理的JavaBean的介面屬性,在spring的上下中自動尋找實現類去注入,
當找到兩個以上時會報錯,與spring的上下文的id圍觀
	byName:根據管理的Javabean中的介面名,在上下文中去尋找同名的id,進行注入。
 -->
<bean class="com.zking.spring.ioc.biz.impl.StuBizImpl" id="stuBizImpl"></bean>
<bean class="com.zking.spring.ioc.web.ClzAction" id="clzAction">
	<!-- <property name="stuBiz" ref="stuBizImpl"></property>
	<property name="userBiz" ref="userBiz"></property> -->
</bean>

</beans>