依賴注入
Spring依賴注入。。。。。。。。。。。。。。。。,兩種方式我們可以達到把Spring容器創建的對象注入到我們需要用的位置。第一個式配置文件方式(配置文件中配置),另一種式注解的方式注入指定位置(簡單,方便)。
1.配置文件注入
配置文件的注入方式也有setter注入,構造函數注入,p命名空間的注入,SpEl表達式注入,集合(List,Set,Map)Properties等的注入等注入方式。如下實現常用的幾個注入方式:
方式一:Set注入
UserDao:

package com.spring.demo02; public class UserDao { public void save() { System.out.println("持久層。。。"); } }
UserService:

package com.spring.demo02; public class UserService { //配置文件注入:提供成員屬性,設置set方法 private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void save() { System.out.println("業務層。。。"); //調用 userDao.save(); } }
配置文件設置依賴注入:

<?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.xsd"> <!-- 演示的依賴注入 --> <bean id="userDao" class="com.spring.demo02.UserDao"/> <bean id="userService" class="com.spring.demo02.UserService"> <property name="userDao" ref="userDao"/> </bean> </beans>
測試依賴注入:

package com.spring.demo02; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestDI { @Test public void run() { //創建容器對象,加載配置文件,創建userDao對象,userService也被創建 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //獲取userService對象 UserService userService = (UserService) context.getBean("userService"); //調用save方法 userService.save(); } }
運行結果:
方式二:構造函數注入
User:

package com.spring.demo03; public class User { private String name; private Integer age; public User(String name, Integer age) { this.name = name; this.age = age; } @Override public String toString() { return "User [name=" + name + ", age=" + 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.xsd"> <!-- 方式一:Set注入 --> <bean id="userDao" class="com.spring.demo02.UserDao"/> <bean id="userService" class="com.spring.demo02.UserService"> <property name="userDao" ref="userDao"/> </bean> <!-- 方式二:構造方法的注入方式:name是屬性名稱,value是注入的值,如果要出入引用使用raf標簽 --> <bean id="user" class="com.spring.demo03.User"> <constructor-arg name="name" value="Tom"/> <constructor-arg name="age" value="18"/> <!-- 第二種方式 index寫序號就行 --> <!-- <constructor-arg index="0" value="Tom"/> <constructor-arg name="1" value="18"/> --> </bean>
測試:

package com.spring.demo03; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestDI { @Test public void run() { //創建容器對象,加載配置文件,創建User類的對象,並構造函數初始化 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //獲取user對象 User user = (User) context.getBean("user"); System.out.println(user); } }
運行結果:
方式三:p命名空間注入方式
User:

package com.spring.demo03; public class User { private String name; private Integer age; public void setName(String name) { this.name = name; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "User [name=" + name + ", age=" + 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.xsd"> <!-- 方式三:p命名空間注入方式 --> <bean id="user" class="com.spring.demo03.User" p:name="Tom" p:age="18" /> </beans>
配置文件中需要設置命名空間p
測試:

package com.spring.demo03; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestDI { @Test public void run() { //創建容器對象,加載配置文件,創建User類的對象,並構造函數初始化 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //獲取user對象 User user = (User) context.getBean("user"); System.out.println(user); } }
運行結果;
方式四:集合方式
2.注解注入
Spring中提供一些作用在類上的注解,我們使用這些注解可以標志對應的類對象。還有通過一些屬性的注解把容器創建的對象注入到指定位置,還有注入一些基本類型的值。還有一些作用范圍的注解來控制對象的單例或者多例,生命周期等。
類上使用注解:
@Component //每個層都可以,作用在類上 @Controller //作用在web層 @Service //作用在業務層 @Repository //作用在持久層 這三個注解都放在每層的類上面,會創建對應的對象,Component可以每層類上但建議使用其他三個注解增強
屬性注解:
@Value //用於注入基本類型 @Autowired //用於對象注入,默認按類型進行自動裝配 @Qualifier //用於對象注入,按名稱注入 @Resource //相當於@Autowired與Qualifier一起使用,JDK提供的注解,Spring支持
作用范圍
@Scope(value="prototype") //Bean的作用范圍注解,作用在類上,singleton:單例(默認) prototype:多例 @PostConstruct //相當於init-method @PreDestroy //相當於destroy-method
實現注解方式
UserService:
package com.spring.demo04; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; /** * 組件注解,標記該類 * 相當於:<bean id="userService" class="com.spring.demo04.UserService"> */ @Component(value="userService") public class UserService { //屬性注解:基本數據類型 @Value(value="業務層") private String name; //@Resource(name="userDao") JDK提供的注解,spring支持 //對象注解:按類型自動裝配 @Autowired @Qualifier(value="userDao") //也可以不寫,一旦寫名稱必須一致 private UserDao userDao; public void save() { System.out.println(name+"啟動。。。"); userDao.save(); } }
UserDao:
package com.spring.demo04; import org.springframework.stereotype.Repository; /** * UserDao交給IOC容器 * 相當於:<bean id="userDao" class="com.spring.demo04.UserDao"> */ @Repository(value="userDao") public class UserDao { public void save() { System.out.println("持久層啟動。。。。"); } }
配置文件:
<?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: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/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 開啟注解的掃描:掃描該包下的所有類 --> <context:component-scan base-package="com.spring.demo04" /> </beans>
測試:
package com.spring.demo04; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestDI { @Test public void run() { //創建容器對象,加載配置文件 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //獲取userService對象 UserService userService = (UserService) context.getBean("userService"); //調用save方法 userService.save(); } }
運行結果: