1.Spring IOC
IOC Inverse of Control 反轉控制:將原本在程序中手動創建UserService對象的控制權,交由Spring框架管理
- 創建對象的控制權被反轉到了Spring框架
1.1.原理
1-1.jpg
通過工廠+反射+配置文件的方式將對象創建進行解耦
1.2.開發流程
- 添pom.xml中加Spring依賴
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
- 編寫Spring核心配置文件
resources目錄下創建applicationContext.xml文件:
1-2.jpg
beans下添加bean標簽:
<!-- UserSerivce的創還能權交給了Spring-->
<bean id="userService" class="com.ioc.demo1.UserServiceImpl"></bean>
- 在程序中讀取Spring配置文件,通過Spring框架獲得Bean,完成相應操作
測試代碼:
/**
* Spring的方式實現
*/
@Test
public void sayHelloBySpring(){
//創建Spring的工廠類
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//通過工廠獲得類
UserService userService = (UserService) applicationContext.getBean("userService");
userService.sayHello();
}
運行結果:
Hello Spring
2.DI依賴注入
DI Dependency Injection 依賴注入,就是在Spring創建對象過程中,將這個對象所以來的屬性注入進去
2.1.開發流程
-
在被注入類中添加屬性和測試方法
private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public void sayHelloName() { System.out.println("Hello Spring " + name); }
-
xml中添加依賴注入的配置
<!-- UserSerivce的創還能權交給了Spring--> <bean id="userService1" class="com.ioc.demo1.UserServiceImpl"> <!-- 設置屬性--> <property name="name" value="李四"></property> </bean>
-
測試代碼
/** * 測試依賴注入 */ @Test public void sayHelloBySpring1(){ //創建Spring的工廠類 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); //通過工廠獲得類 UserService userService = (UserService) applicationContext.getBean("userService1"); userService.sayHelloName(); }
-
運行結果
Hello Spring 李四
3.1.Spring工廠類
1-3.jpg
主要使用的是
- ApplicationContext接口
- ClassPathXmlApplicationContext類
- FileSystemXmlApplicationContext類
- BeanFactory接口
3.1.1.FileSystemXmlApplicationContext使用
在e盤根目錄下創建xml
1-4.jpg
xml配置如下
<!-- UserSerivce的創還能權交給了Spring-->
<bean id="userService1" class="com.ioc.demo1.UserServiceImpl">
<!-- 設置屬性-->
<property name="name" value="磁盤李四"></property>
</bean>
添加測試代碼
/**
* 磁盤加載xml
*/
@Test
public void sayHelloBySpring2(){
//創建Spring的工廠類
ApplicationContext applicationContext = new FileSystemXmlApplicationContext("e:\\applicationContext.xml");
//通過工廠獲得類
UserService userService = (UserService) applicationContext.getBean("userService1");
userService.sayHelloName();
}
運行結果
Hello Spring 磁盤李四
3.1.2.BeanFactory使用
測試方法
/**
* 傳統方式的工廠類:BeanFactory
*/
@Test
public void sayHelloByFactory(){
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
// BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("e:\\applicationContext.xml"));
UserService userService = (UserService) beanFactory.getBean("userService1");
userService.sayHelloName();
}
運行結果:
Hello Spring 磁盤李四