Spring 依賴注入
Spring框架的核心功能之一就是通過依賴注入的方式來管理Bean之間的依賴關系。
1、屬性注入
IService:

1 public interface IUserService { 2 /* 3 * 說話 4 */ 5 void Say(String msg); 6 }
ServiceImp:

1 public class UserServiceImpl implements IUserService { 2 3 private IUserDao iUserDao; 4 5 public void setUserDao(IUserDao dao) { 6 this.iUserDao=dao; 7 } 8 9 /* 10 * 說話 11 */ 12 public void Say(String msg) { 13 this.iUserDao.Say(msg); 14 } 15 }
IDao:

1 public interface IUserDao { 2 /* 3 * 說話 4 */ 5 void Say(String msg); 6 }
DaoImp:

1 public class UserDaoImpl implements IUserDao { 2 /* 3 * 說話 4 */ 5 public void Say(String msg) { 6 System.out.println(msg); 7 } 8 }
Bean:

1 <beans xmlns="http://www.springframework.org/schema/beans" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://www.springframework.org/schema/beans 4 http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 6 <bean id="userServerId" class="serviceImpl.UserServiceImpl"> 7 <!-- 此處是set屬性注入,name值必須和UserServiceImpl中屬性名一致 --> 8 <property name="userDao" ref="userDaoId"></property> 9 </bean> 10 </beans>
測試輸出:

1 public class MainShow { 2 public static void main(String[] args) { 3 System.out.println("開始執行。。。"); 4 5 ApplicationContext context=new ClassPathXmlApplicationContext("resources/beans.xml"); 6 IUserService idog=(IUserService)context.getBean("userServerId"); 7 idog.Say("汪汪汪。。。"); 8 } 9 }
2、構造注入
IService:

1 public interface IDogService { 2 /* 3 * 叫 4 */ 5 void Call(String msg); 6 }
ServiceImp:

1 public class DogServiceImpl implements IDogService { 2 3 private IDogDao idogdao; 4 5 public DogServiceImpl(DogDaoImpl dogDao) { 6 System.out.println("開始構造注入....."); 7 this.idogdao=dogDao; 8 } 9 10 /* 11 * 叫聲 12 */ 13 public void Call(String msg) { 14 idogdao.Call(msg); 15 } 16 }
IDao:

1 public interface IDogDao { 2 /* 3 * 叫 4 */ 5 void Call(String msg); 6 }
DaoImp:

1 public class DogDaoImpl implements IDogDao { 2 3 public void Call(String msg) { 4 System.out.println("汪汪汪:"+msg); 5 } 6 }
Bean:

1 <beans xmlns="http://www.springframework.org/schema/beans" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://www.springframework.org/schema/beans 4 http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 6 <!-- 構造注入 --> 7 <bean id="dogId" class="serviceImpl.DogServiceImpl"> 8 <constructor-arg ref="dogDao"/> 9 </bean> 10 11 <bean id="dogDao" class="daoImpl.DogDaoImpl"></bean> 12 </beans>
3、內部注入
IService:

1 public interface ICarService { 2 /* 3 * 汽車啟動 4 */ 5 void Start(); 6 }
ServiceImp:

1 private ICarDao idao; 2 3 public void setIdao(CarDaoImpl impl) { 4 this.idao = impl; 5 } 6 7 public void Start() { 8 idao.Start(); 9 } 10 }
IDao:

1 public interface ICarDao { 2 /* 3 * 汽車啟動 4 */ 5 void Start(); 6 }
DaoImp:

1 public class CarDaoImpl implements ICarDao { 2 3 public void Start() { 4 System.out.println("汽車開始啟動。。。。。。"); 5 } 6 }
Bean:

1 <beans xmlns="http://www.springframework.org/schema/beans" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://www.springframework.org/schema/beans 4 http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 6 <!-- 內部注入 --> 7 <bean id="carId" class="serviceImpl.CarServiceImpl"> 8 <property name="idao"> 9 <bean class="daoImpl.CarDaoImpl"></bean> 10 </property> 11 </bean> 12 </beans>
4、自動裝配
在Spring框架,可以用
auto-wiring 功能會自動裝配Bean。要啟用它,只需要在
<bean> 定義“
autowire”屬性。
<beans/>
標簽可以定義 default-autowire-candidate="false" 屬性讓它和它包含的所有 bean 都不做為候選bean。
1 <bean id="customer" class="com.yiibai.common.Customer" autowire="byName" />
在Spring中,支持 5 自動裝配模式。
- no – 缺省情況下,自動配置是通過“ref”屬性手動設定
- byName – 根據屬性名稱自動裝配。如果一個bean的名稱和其他bean屬性的名稱是一樣的,將會自裝配它。
- byType – 按數據類型自動裝配。如果一個bean的數據類型是用其它bean屬性的數據類型,兼容並自動裝配它。
- constructor – 在構造函數參數的byType方式。
- autodetect – 如果找到默認的構造函數,使用“自動裝配用構造”; 否則,使用“按類型自動裝配”。
ServiceImp:

1 public class UserServiceImpl implements IUserService { 2 3 private IUserDao userDao; 4 5 public void setUserDao(UserDaoImpl dao) { 6 this.userDao=dao; 7 } 8 9 /* 10 * 說話 11 */ 12 public void Say(String msg) { 13 this.userDao.Say(msg); 14 } 15 }
IDao:

1 public interface IUserDao { 2 /* 3 * 說話 4 */ 5 void Say(String msg); 6 }
DaoImp:

1 public class UserDaoImpl implements IUserDao { 2 /* 3 * 說話 4 */ 5 public void Say(String msg) { 6 System.out.println(msg); 7 } 8 }
通常情況下,進行明確的裝配目標 Bean

1 <beans xmlns="http://www.springframework.org/schema/beans" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://www.springframework.org/schema/beans 4 http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 6 7 <bean id="userServerId" class="serviceImpl.UserServiceImpl"> 8 <!-- 此處是set屬性注入,name值必須和UserServiceImpl中屬性名一致 --> 9 <property name="userDao" ref="userDaoId"></property> 10 </bean> 11 12 <bean id="userDaoId" class="daoImpl.UserDaoImpl"></bean> 13 </beans>
1、由類型 (Type) 自動裝配:
1 <beans xmlns="http://www.springframework.org/schema/beans" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://www.springframework.org/schema/beans 4 http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 6 <!-- Type自動裝配注入 --> 7 <bean id="userServerId" class="serviceImpl.UserServiceImpl" autowire="byType"/> 8 <bean id="userDaoId" class="daoImpl.UserDaoImpl"></bean> 9 </beans>
2、由類型 (Name) 自動裝配:
1 <beans xmlns="http://www.springframework.org/schema/beans" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://www.springframework.org/schema/beans 4 http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 6 <!-- Name 自動裝配注入 --> 7 <bean id="userServerId" class="serviceImpl.UserServiceImpl" autowire="byName"/> 8 <bean id="userDao" class="daoImpl.UserDaoImpl"></bean> 9 </beans>
3、構造函數自動裝配:
ServiceImp:

1 public class DogServiceImpl implements IDogService { 2 3 private IDogDao idogdao; 4 5 public DogServiceImpl(DogDaoImpl dogDao) { 6 System.out.println("開始構造注入....."); 7 this.idogdao=dogDao; 8 } 9 10 /* 11 * 叫聲 12 */ 13 public void Call(String msg) { 14 idogdao.Call(msg); 15 } 16 }
IDao:

1 public interface IDogDao { 2 /* 3 * 叫 4 */ 5 void Call(String msg); 6 }
DaoImp:

1 public class DogDaoImpl implements IDogDao { 2 3 public void Call(String msg) { 4 System.out.println("狗叫:"+msg); 5 } 6 }
通常情況下,使用構造注入Bean,配置如下:
1 <beans xmlns="http://www.springframework.org/schema/beans" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://www.springframework.org/schema/beans 4 http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 6 <!-- 構造注入 --> 7 <bean id="dogId" class="serviceImpl.DogServiceImpl"> 8 <constructor-arg ref="dogDao"/> 9 </bean> 10 <bean id="dogDao" class="daoImpl.DogDaoImpl"></bean> 11 </beans>
自動裝配用構造函數啟用后,你可以不設置構造器屬性。Spring會找到兼容的數據類型,並自動裝配它。
<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.xsd"> <!-- Constructor 構造自動裝配 --> <bean id="dogId" class="serviceImpl.DogServiceImpl" autowire="constructor"/> <!-- 有無Id都可以 --> <bean id="dogDaos" class="daoImpl.DogDaoImpl"></bean> </beans>