spring學習1:IOC的概念和作用
一、spring的優勢
1.1 方便解耦,簡化開發
通過spring提供的ioc容器,可以將對象間的依賴關系交給spring管理,避免硬編碼造成的程序過渡耦合
1.2 AOP編程的支持
通過spring的aop功能可以實現面向切面編程
1.3 聲明式的事務支持
1.4 方便集成其他第三方框架
二、ioc的概念和作用
ioc指的是控制反轉,指的就是以前我們獲取一個對象時采用的是自己創建一個的方式,這是一個主動的過程;而控制反轉后,當我們需要對象時就跟工廠要,而工廠來幫我們創建或者查找對象,這是一個被動的過程。
這種被動接收對象的方式就是控制反轉。
它的作用是削減計算機程序的耦合(解除代碼中的依賴關系)
三、spring ioc的簡單使用
創建一個maven工程,引入spring的依賴
pom文件的內容如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lyy</groupId>
<artifactId>spring01</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.16</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
創建一個UserService的接口和實現類,以下是實現類
public class UserServiceImpl implements IUserService {
@Override
public void findAllUser() {
userDao.findAll();
System.out.println("查詢全部用戶");
}
}
在resources目錄下創建spring的配置文件applicationContext.xml,在其中配置一個userService的bean
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!--把對象的創建交給spring來管理-->
<bean id="userService" class="com.lyy.service.impl.UserServiceImpl">
</bean>
</beans>
測試使用ioc來獲取對象
public class Test2 {
public static void main(String[] args) {
//加載配置文件,初始化spring容器
ApplicationContext app=new ClassPathXmlApplicationContext("applicationCotext0.xml");
//獲取bean
IUserService userService= (IUserService) app.getBean("userService");
//執行bean的方法
userService.findAllUser();
}
}
以上的測試方法中,先初始化了spring容器,在這個過程中spring會將配置文件中配置的bean對象都放在容器中。然后再從容器中根據bean的id獲取對象,執行對象的方法。
四、實例化bean的三種方式
4.1 使用無參數構造函數
默認情況下spring會使用bean的class指定的類中的無參數構造函數來創建bean,如果沒有無參構造就會創建失敗。
4.2 spring管理靜態工廠,使用靜態工廠的方法來創建bean對象
模擬一個靜態工廠
public class UserServiceFactory {
public static IUserService getInstance(){
return new UserServiceImpl();
}
}
在spring配置文件中使用工廠
<bean id="userService2" class="com.lyy.util.UserServiceFactory" factory-method="getInstance"></bean>
4.3 spring管理實例工廠,使用實例工廠的方法來創建bean對象
模擬一個實例工廠
public class UserServiceFactory2 {
public IUserService getUserService(){
return new UserServiceImpl();
}
}
在spring配置文件中先把實例工廠配置為bean,在使用實例工廠來創建對象
<bean id="userServiceFactory2" class="com.lyy.util.UserServiceFactory2">
</bean>
<bean id="userService3" factory-bean="userServiceFactory2" factory-method="getUserService">
</bean>
五、spring的依賴注入
通過控制反轉, 把對象的創建交給了 spring,但是代碼中不可能出現沒有依賴的情況。 ioc 解耦只是降低他們的依賴關系,但不會消除。例如service層的實現類肯定會依賴dao層。使用spring后可以讓spring來維護這種依賴關系,就是讓框架把持久層的對象傳到service層
5.1 構造方法注入
在配置bean的標簽中使用constructor-arg 標簽來給bean注入屬性
以下是一個用戶類
public class User {
private String name;
private String age;
}
下面通過構造方法在配置bean時傳入屬性
<bean id="user" class="com.lyy.domain.User">
<constructor-arg name="name" value="張三"/>
<constructor-arg name="age" value="18"/>
</bean>
5.2 set方法注入
在bean對應的類中提供set方法,在配置文件中使用proerty標簽來傳遞屬性值
<bean id="user2" class="com.lyy.domain.User">
<property name="name" value="李四"/>
<property name="age" value="22"/>
</bean>
5.3 p名稱空間注入,本質還是set方法
5.4 注入集合屬性
5.4.1 數組
用來給bean中的數組類型的屬性注入值
<bean id="user3" class="com.lyy.domain.User">
<property name="myArray">
<array>
<value>element1</value>
<value>element2</value>
<value>element3</value>
</array>
</property>
</bean>
5.4.2 List
用來給bean中的List類型的屬性注入值
<bean id="user4" class="com.lyy.domain.User">
<property name="myList">
<list>
<value>1</value>
<value>2</value>
<value>3</value>
</list>
</property>
</bean>
5.4.3 Set
用來給bean中的Set類型的屬性注入值
<bean id="user5" class="com.lyy.domain.User">
<property name="mySet">
<set>
<value>1</value>
<value>2</value>
<value>3</value>
</set>
</property>
</bean>
5.4.4 Map
用來給bean中的Map類型的屬性注入值
<bean id="user6" class="com.lyy.domain.User">
<property name="myMap">
<map>
<entry key="a" value="1"></entry>
<entry key="b" value="1"></entry>
<entry key="c" value="1"></entry>
</map>
</property>
</bean>
5.4.5 Properties
用來給bean中的Properties類型的屬性注入值
<bean id="user7" class="com.lyy.domain.User">
<property name="myProperties">
<props>
<prop key="x">1</prop>
<prop key="y">1</prop>
<prop key="z">1</prop>
</props>
</property>
</bean>