Spring IoC學習之基於XML的IoC
這裡實現一下基於XML方式的IoC,這裡沒有過多的理論,全是實際操作。
廢話不多說,直接寫程式碼。
這裡用的IDE是IDEA,用maven構建的專案,如果不會的依賴直接用jar包也行。先看專案結構和依賴。
這是專案結構使用maven構建的,如果不會直接構建簡單的java web專案手動建立包,然後下載相關jar包一樣可以實現的哦。
Pom檔案直接貼程式碼吧。
pom.xml
<?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.yijia</groupId> <artifactId>spring_ioc_xml</artifactId> <version>1.0-SNAPSHOT</version> <name>spring_ioc_xml</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring.version>4.3.13.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.13.RELEASE</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.3.13.RELEASE</version> <scope>test</scope> </dependency> </dependencies> <build> </build> </project>
嗯。。。程式碼到了關鍵部分在講吧,其他都直接按照開發順序貼程式碼了哈。
首先在model包下面新建User類:User.java。只有id和username兩個欄位。並生成get set方法以及toString方法。
public class User { private int id; private String username; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public User() { } public User(int id, String username) { super(); this.id = id; this.username = username; } @Override public String toString() { return "User [id=" + id + ", username=" + username + "]"; } }
然後在dao包下面新建介面IUserDao.java。
嗯。。。命名按照個人喜好哈,不過我還是喜歡將介面命名為UserDao,然後實現類命名為UserDaoImpl。
IUserDao.java 這裡只貼了一個方法,因為最後測試的時候只測試了add方法,不過其他方法都是類似的呀,學會一個,那其他也掌握了呀。
public interface IUserDao {
public void add(User user);
}
然後是 IUserDao.java的實現類UserDao.java這裡模擬新增使用者的操作,直接向控制檯輸出新增的物件user就是,不直接操作資料庫了,如果有對操作資料庫的需求,這裡寫操作資料庫的邏輯就是。
public class UserDao implements IUserDao {
public void add(User user) {
System.out.println("add user:" + user);
}
}
然後然後 就是service層啦,來到service包新建介面UserService.java
UserService.java
public interface UserService {
public void add(User user);
}
繼續.....寫UserService.java介面的實現類UserServiceImpl,java
UserServiceImpl,java
//這裡需要匯入IUserDao和User的包
public class UserServiceImpl implements UserService {
//引入IUserDao
private IUserDao userDao;
//userDao的get方法
public IUserDao getUserDao() {
return userDao;
}
//userDao的set方法
public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
}
//實現介面的add方法,呼叫Dao的add方法
public void add(User user) {
userDao.add(user);
}
}
由於所有的程式碼都沒有package,所有導包的程式碼在所有程式碼都沒有哦。。根據程式碼實際的的位置自己導包吧。
寫完service就是最後一層controller層了。
需要匯入User和UserService的包
UserController.java
//同樣需要匯入User和UserService的包
public class UserController {
private User user;
private UserService userService;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
//這裡才是新增使用者的程式碼哦,呼叫service層的add方法
public void add() {
userService.add(user);
}
}
java程式碼寫的差不多啦,然後就是beans.xml配置檔案啦。這裡很多解釋都解除安裝程式碼註釋裡面啦。
beans.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
">
<!--
這裡採用的是屬性注入
id就是獲取bean的例項物件名,相當於平常使用new方法獲取物件的變數名
class對應User類的包名 也就是類的全限定名
下面的兩個property標籤對應類的兩個屬性
name對應屬性名
value就是屬性的值
-->
<bean id="user" class="com.yijia.spring_ioc_xml.model.User">
<property name="id" value="2"></property>
<property name="username" value="我是使用者名稱"></property>
</bean>
<bean id="userDao" class="com.yijia.spring_ioc_xml.dao.UserDao"></bean>
<bean id="userService" class="com.yijia.spring_ioc_xml.service.UserServiceImpl">
<!--
name中的值會在userService物件中呼叫setXX方法來注入,諸如:name="userDao"
在具體注入時會呼叫setUserDao(IUserDao userDao)來完成注入
ref="userDao"表示是配置檔案中的bean中所建立的Dao的id
-->
<property name="userDao" ref="userDao"></property>
</bean>
<!--
scope="singleton"意思是該bean的作用範圍是單例的,每次獲取bean的時候都是同一個
-->
<bean id="userController"
class="com.yijia.spring_ioc_xml.controller.UserController" scope="singleton">
<property name="userService" ref="userService"></property>
<property name="user" ref="user"></property>
</bean>
</beans>
最後最後,當然要測試一下我們寫的程式碼啦。
寫一個測試類 ,UserController的包需要自己匯入
TestSpring.java
import org.springframework.beans.factory.BeanFactory;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSpring {
//建立spring的工廠
BeanFactory factory = new ClassPathXmlApplicationContext("beans.xml");
@Test
public void testUser() {
UserController userController = factory.getBean("userController", UserController.class);
System.out.println(userController.getUser());
}
}
通過ClassPathXmlApplicationContext傳入beans.xml檔名返回BeanFactory物件。
然後通過BeanFactory物件的getBean方法傳入bean的id:userController,也就是bean的名字返回一個UserController物件
由於在beans.xml中使用屬性注入的方法為user注入了值,所以這裡直接使用getUser方法就可以獲取到user的資訊了。相當於歲資料庫做查詢操作。
測試結果:
好吧。add方法沒有測試
那麼就測試一下吧。新增測試方法:
@Test
public void testAdd(){
//getBean的兩種方式都可以,只是前一種需要強制轉換一下
User user = (User) factory.getBean("user");
UserController userController = factory.getBean("userController", UserController.class);
//對user手動賦值
user.setId(2);
user.setUsername("add方法測試");
//手動注入user
userController.setUser(user);
userController.add();
}
測試結果:到這裡基於XML的IoC基本的操作就完成啦啦啦啦啦。