1. 程式人生 > >spring學習總結1

spring學習總結1

博文參考連結:https://www.yiibai.com/spring/spring-auto-wiring-beans-with-autowired-annotation.html

//什麼是spring

參考連結:https://blog.csdn.net/qq_22172133/article/details/81487134

spring 是一個開源框架,核心為 IOC(依賴注入/控制反轉),AOP(面向切面)

這兩個概念後面會詳細介紹

//spring優點

1.方便解耦,對依賴物件的建立和管理交給spring容器

2.aop面向切面程式設計,對通用的異常,監控等進行統一的管理

3.宣告式事務,方便事務管理

4.方便程式測試,Spring對Junit4支援,可以通過註解方便的測試Spring程式

 

spring  IOC使用方法:

依賴注入與自動裝配的區別

依賴注入是為引用的物件進行賦值,自動裝配是進行賦值時的一種方法

如:

public class Customer 
{
	private Person person;
	
	public Customer(Person person) {
		this.person = person;
	}
	
	public void setPerson(Person person) {
		this.person = person;
	}
	//...
}
public class Person 
{
	//...
}

<bean id="customer" class="com.yiibai.common.Customer" autowire="byName" />	
<bean id="person" class="com.yiibai.common.Person" />
其中紅色部分是一個依賴注入,Customer類引用了Person類,所以注入了person物件,自動裝配模式為 byName,即為這個引用物件(person)賦值時採用的是按名稱匹配的方法

依賴注入有兩種:setter, 構造器  

自動裝配有五種:

  • no – 預設情況下,自動配置是通過“ref”屬性手動設定
     <bean id="customer" class="com.yiibai.common.Customer">
                  <property name="person" ref="person" />
	</bean>

	<bean id="person" class="com.yiibai.common.Person" />
  • byName – 根據屬性名稱自動裝配。如果一個bean的名稱和其他bean屬性的名稱是一樣的,將會自裝配它。
    • <bean id="customer" class="com.yiibai.common.Customer" autowire="byName" />	
      <bean id="person" class="com.yiibai.common.Person" />
  • byType – 按資料型別自動裝配。如果一個bean的資料型別是用其它bean屬性的資料型別,相容並自動裝配它。
    • <bean id="customer" class="com.yiibai.common.Customer" autowire="byType" />
      <bean id="person" class="com.yiibai.common.Person" />
    • 如果有多個相同型別,裝配時會報錯,因為spring不知道應該注入哪個
    • <bean id="customer" class="com.yiibai.common.Customer" autowire="byType" />
      <bean id="person" class="com.yiibai.common.Person" />
      <bean id="student" class="com.yiibai.common.Person" />
    • 標紅部分為兩個相同型別(Person)按型別注入會報錯
  • constructor – 在建構函式引數的byType方式。
  •         <bean id="customer" class="com.yiibai.common.Customer" autowire="constructor" />
    	
    	<bean id="person" class="com.yiibai.common.Person" />
    • 按建構函式注入,實際上是根據建構函式中引數的型別進行匹配(因此,如果有多個型別相同的bean,注入時也會報錯)
  • autodetect – 如果找到預設的建構函式,使用“自動裝配用構造”; 否則,使用“按型別自動裝配”
  • 參考連結:https://www.yiibai.com/spring/spring-autowiring-by-autodetect.html

以上為通過xml進行配置,下面介紹下通過註解配置

@Autowired

可以用於 setter方法,建構函式,屬性欄位

public class Customer 
{
@Autowired 用於屬性欄位 private Person person; /*@Autowired 用於建構函式 public Customer(Person person) { this.person = person; }*/ /*@Autowired 用於setter方法 public void setPerson(Person person) { this.person = person; }*/ //... }
public class Person 
{
	//...
}

 

 

@Autowired註解是通過匹配資料型別自動裝配Bean

想要使用@Autowired註解,有兩種方法

1.xml引入如下配置

<beans 
	//...
	xmlns:context="http://www.springframework.org/schema/context"
	//...
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-2.5.xsd">
	//...

	<context:annotation-config />
	//...
</beans>

2.xml中引入AutowiredAnnotationBeanPostProcessor
<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">

<bean 
class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
	
	<bean id="CustomerBean" class="com.yiibai.common.Customer">
		<property name="action" value="buy" />
		<property name="type" value="1" />
	</bean>

	<bean id="PersonBean" class="com.yiibai.common.Person">
		<property name="name" value="yiibai" />
		<property name="address" value="address ABC" />
		<property name="age" value="29" />
	</bean>
	
</beans>

@Qualifier註解,當Autowired注入時有多個相同型別的bean,通過該註解可以指定要注入哪個bean
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-2.5.xsd">

	<context:annotation-config />

	<bean id="CustomerBean" class="com.yiibai.common.Customer">
		<property name="action" value="buy" />
		<property name="type" value="1" />
	</bean>

	<bean id="PersonBean1" class="com.yiibai.common.Person">
		<property name="name" value="yiibai-1" />
		<property name="address" value="address-1" />
		<property name="age" value="29" />
	</bean>
	
	<bean id="PersonBean2" class="com.yiibai.common.Person">
		<property name="name" value="yiibai-2" />
		<property name="address" value="address-2" />
		<property name="age" value="28" />
	</bean>
	
</beans>
public class Customer 
{
	@Autowired
	@Qualifier("PersonBean1")
	private Person person;
	private int type;
	private String action;
	//getter and setter methods
}