2-1 IOC及Bean容器
- 接口及面向接口編程
- 什麼是IOC
IOC:控制反轉,控制權的轉移,應用程序本身不負責依賴對象的創建和維護,而是由外部容器負責創建和維護
DI:依賴注入,是一種實現的方式
目的:創建對象並且組裝對象之間的關係 - Spring的Bean配置
- Bean的初始化
- Spring的常用注入方式
- 設值注入
- 構造注入
Spring的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">
<bean id="helloWorId" class="springTest.HelloWorld">
<property name="message" value="Hello Word"/>
</bean>
</beans>
Bean容器的初始化
- 基礎:兩個包
- org.springframework.beans
- org.springframework.context
- BeanFactory提供配置結構和基本功能,加載並初始化Bean
- ApplicationContext保存了Bean對象並在Spring中被廣泛使用
- 初始化方式,ApplicationContext
- 本地文件
- Classpath
- Web應用中依賴servlet或Listener
- 文件: FileSystemXmlApplicationContext context =
new FileSystemXmlApplicationContext(“D:/resourcess/spring-ioc.xml”);
- Classpath: ClassPathXmlApplicationContext applicationContext= new ClassPathXmlApplicationContext(springXmlPath.split("[,\s]"));
- Web應用
Spring注入
<?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">
<bean id="bookDao" class="com.torey.dao.impl.BookDaoImpl"></bean>
<bean id="bookService" class="com.torey.service.impl.BookServiceImpl">
<property name="bookDao" ref="bookDao"/>
</bean>
</beans>
構造注入
<?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">
<bean id="bookDao" class="com.torey.dao.impl.BookDaoImpl"></bean>
<bean id="bookService" class="com.torey.service.impl.BookServiceImpl">
<constructor-arg name="bookDao" ref="bookDao"/>
</bean>
</beans>
單元測試說明
- 下載
源碼
spring-ioc.xml
<?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">
<bean id="oneInterface" class="com.torey.springtest.OneInterfaceImpl"/>
</beans>
UnitTestBase.java
package com.torey.springtest.base;
import org.junit.After;
import org.junit.Before;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.util.StringUtils;
/**
* @ClassName:UnitTestBase
* @Description:
* @author: Torey
*/
public class UnitTestBase {
public UnitTestBase(){}
private String springXmlPath;
private ClassPathXmlApplicationContext applicationContext;
public UnitTestBase(String springXmlpath){
this.springXmlPath=springXmlpath;
}
@Before
public void before(){
if (StringUtils.isEmpty(springXmlPath)) {
springXmlPath="classpath*:spring-*.xml";
}
applicationContext= new ClassPathXmlApplicationContext(springXmlPath.split("[,\\s]"));
applicationContext.start();
}
@After
public void after(){
applicationContext.destroy();
}
public Object getBean(String beanId){
return applicationContext.getBean(beanId);
}
}
TestOneInterface .java
package com.torey.springtest.ioc;
import com.torey.springtest.OneInterface;
import com.torey.springtest.base.UnitTestBase;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.Test;
/**
* @ClassName:TestOneInterface
* @Description:
* @author: Torey
*/
@RunWith(BlockJUnit4ClassRunner.class)
public class TestOneInterface extends UnitTestBase {
public TestOneInterface(){
super("classpath*:spring-ioc.xml");
}
@Test
public void testHello(){
OneInterface oneInterface = (OneInterface)super.getBean("oneInterface");
System.out.println(oneInterface.hello("hello"));
}
}
2-2 Spring注入方式
設值注入源碼
BookDao.java
package com.torey.dao;
/**
* @ClassName:BookDao
* @Description:與數據庫交互
* @author: Torey
*/
public interface BookDao {
void addBook();
}
BookDaoImpl.java
package com.torey.dao.impl;
import com.torey.dao.BookDao;
/**
* @ClassName:BookDaoImpl
* @Description:
* @author: Torey
*/
public class BookDaoImpl implements BookDao {
@Override
public void addBook() {
System.out.println(this.getClass().getName()+"Dao一般與數據庫交互");
}
}
BookService.java
package com.torey.service;
/**
* @InterfaceName:BookService 用途:
* 作者: litaofeng
* 時間: 2019/8/18 8:56
*/
public interface BookService {
void addBook();
}
BookServiceImpl.java
package com.torey.service.impl;
import com.torey.dao.BookDao;
import com.torey.service.BookService;
/**
* @ClassName:BookServiceImpl
* @Description:
* @author: Torey
*/
public class BookServiceImpl implements BookService {
private BookDao bookDao;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
@Override
public void addBook() {
System.out.println(this.getClass().getName()+"service一般寫業務邏輯");
bookDao.addBook();
}
}
TestOneInterface.java單元測試類
package com.torey.springtest.ioc;
import com.torey.service.BookService;
import com.torey.springtest.base.UnitTestBase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;
/**
* @ClassName:TestOneInterface
* @Description:
* @author: Torey
*/
@RunWith(BlockJUnit4ClassRunner.class)
public class TestOneInterface extends UnitTestBase {
public TestOneInterface() {
super("classpath*:spring-ioc.xml");
}
@Test
public void testHello() {
BookService bookService = (BookService) super.getBean("bookService");
bookService.addBook();
}
}
執行結果
構造函數注入
package com.torey.service.impl;
import com.torey.dao.BookDao;
import com.torey.service.BookService;
/**
* @ClassName:BookServiceImpl
* @Description:
* @author: Torey
*/
public class BookServiceImpl implements BookService {
private BookDao bookDao;
public BookServiceImpl(){}
public BookServiceImpl(BookDao bookDao){
this.bookDao=bookDao;
}
@Override
public void addBook() {
System.out.println(this.getClass().getName()+"service一般寫業務邏輯");
bookDao.addBook();
}
}
spring-ioc.xml
<?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">
<bean id="bookDao" class="com.torey.dao.impl.BookDaoImpl"></bean>
<bean id="bookService" class="com.torey.service.impl.BookServiceImpl">
<constructor-arg name="bookDao" ref="bookDao"/>
</bean>
</beans>