[英]Design patterns - webapp without DI framework
我需要在沒有依賴項注入框架的情況下實現servlet 3.0 webapp。 哪種解決方案是最好的做法是什么? (就性能/內存使用情況和可伸縮性而言)
1)DAO和服務層的靜態方法
@WebServlet("/welcome")
public class MyController extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
MyService.doSomething(/*args*/);
}
}
public class MyService {
public static void doSomething(/*args*/) {
MyDAO.crud(/*args*/);
}
}
public class MyDAO {
public static void crud(/*args*/) {
//...
}
}
2)接口
@WebServlet("/welcome")
public class MyController extends HttpServlet {
private MyService myService;
public MyController() {
super();
if (myService != null) {
myService = new MyServiceImpl();
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
myService.doSomething(/*args*/);
}
}
public interface MyService {
void doSomething(/*args*/);
}
public class MyServiceImpl implements MyService {
private MyDAO myDAO;
public MyServiceImpl() {
if (myService != null) {
myDAO = new MyDAOImpl();
}
}
@Override
public void doSomething(/*args*/) {
myDAO.crud(/*args*/);
}
}
public interface MyDAO {
void crud(/*args*/);
}
public class MyDAOImpl implements MyDAO {
@Override
public void crud(/*args*/) {
//...
}
}
3)其他...
謝謝。
最好使application
MyService
和MyDAO
都為stateless
。 您可以將它們都設置為singletons
(這是所有spring
注入的beans
的default
范圍),只需在controller
使用它即可。 由於它是無stateless
因此concurrency
問題沒有問題。
不要使用靜態方法,因為它無法被模擬或注入。 盡管假設dao不在內存中(並且本身不是有狀態的),但它是線程安全的。
為什么沒有框架就必須這樣做?
查看是否要實現單例而不是創建一個
類public class FetchBean {
static Map<String, Object> beans; static { beans = new HashMap<String, Object>(); } public static Object getBean(Class bean) { try { if (!beans.containsKey(bean.getName())) { Object instance = bean.newInstance(); beans.put(bean.getName(), instance); } return beans.get(bean.getName()); } catch (Exception e) { e.printStackTrace(); } return null; } public static void main(String[] args) { Person person = (Person) FetchBean.getBean(Person.class); person.setName("Taher"); System.out.println(person.getName()); Person person2 = (Person) FetchBean.getBean(Person.class); person2.setName("Tinwala"); System.out.println(person2.getName()); } }
public class Person {
public Person() {
System.out.println("In person");
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.