經典三層框架初識(二)---Spring 2.3使用註解實現建立物件--補充
前面我們說的是資料持久層的dao物件的建立實現.現在我們希望加入業務邏輯層.那如何來做呢?
和使用xml實現bean裝配一樣,我們現在src下建立一個service包,裡面定義UserService介面
package service;
public interface UserService {
void addUser();
void deleteUser();
}
src下有一個子包impl,裡面定義 UserService介面的實現類UserServiceImpl
package service.impl; import service.UserService; public class UserServiceImpl implements UserService { @Override public void addUser() { } @Override public void deleteUser() { } }
由於我們想通過註解來實現UserServiceImpl這個類的建立,那們我們需要在類宣告上面加上@...註解.由於考慮分層,我們這裡最好使用@Service("userservice")這個註解,並起個名字"userservice"..由於在這裡我們需要呼叫dao的方法,所以我們這裡還需要新增一個成員屬性 private UserDao dao;如果是以前,我們使用xml的方式,我們還需要setter方法或者構造方法.但是使用註解就什麼都不用寫,直接宣告就可以了.但是這裡dao的值哪裡來呢?注意:前面我們已經讓配置檔案掃描dao這個包之後,已經在容器裡拿到了userdao這個物件了,那我們這裡就可以直接給宣告好的UserDao這個成員屬性上面標註@Autowired來注入.所以,更新後的UserServiceImpl的程式碼如下:
package service.impl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import dao.UserDao; import service.UserService; @Service("userservice") public class UserServiceImpl implements UserService { @Autowired @Qualifier("userdao") private UserDao dao; /* * 以前我們使用xml的方式還需要些構造方法或者是setter方法, * 使用註解就不用寫了,但是有個問題,dao的值從哪裡來呢? */ @Override public void addUser() { dao.addUser(); } @Override public void deleteUser() { dao.deleteUser(); } }
這裡我們已經在實現類中都標註好了註釋,這時候我們一定要記得在applicationContext.xml配置檔案中讓上下文去掃描這個service包裡的內容.
<?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="dao,service" ></context:component-scan>
</beans>
我們可以在context:component-scan base-package這個屬性裡面寫多個包名,用","分隔
下面我們寫一下測試類:這裡我們需要通過容器得到的是UserService這個介面的實現類物件:
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.UserService;
public class Test {
public static void main(String[] args) {
ApplicationContext ac =
new ClassPathXmlApplicationContext("applicationContext.xml");
UserService service = ac.getBean("userservice", UserService.class);
service.addUser();
service.deleteUser();
}
}
輸出結果就不展示了,和前面一樣的.
這裡再次提醒一遍:我們寫完註解後,一定要再配置檔案中讓上下文去掃描我們需要建立物件的類所在的包.