在日常的开发过程中,我们把程序分为3层:Controller层,Service层,DAO层。Controller类似于Servlet,也就是MVC中的控制层。
调用的顺序是:
Controller层调用Service层,Service层调用DAO层,并且Service层和DAO层为接口(符合Java开发的面向接口编程),是一个典型的MVC模式。
基于xml配置方式
步骤:
1、创建一个Controller类,Service接口,Service的实现类,DAO的接口以及DAO的实现类
1 //Controller类 2 public class UserController { 3 4 private UserService userService; 5 6 public UserService getUserService() { 7 return userService; 8 } 9 10 public void setUserService(UserService userService) {11 this.userService = userService;12 }13 14 public User getUserById(int id){15 return userService.getUserById(id);16 }17 }18 //Service接口19 public interface UserService {20 public User getUserById(int id);21 }22 //Service的实现类23 public class UserServiceImpl implements UserService{24 25 private UserDAO userDAO;26 27 public UserDAO getUserDAO() {28 return userDAO;29 }30 31 public void setUserDAO(UserDAO userDAO) {32 this.userDAO = userDAO;33 }34 35 @Override36 public User getUserById(int id) {37 // TODO Auto-generated method stub38 return userDAO.getUserById(id);39 }40 41 }42 //DAO接口43 public interface UserDAO {44 public User getUserById(int id);45 }46 47 //DAO的实现类48 public class UserDAOImpl implements UserDAO{49 50 private static Map<Integer,User> users;51 52 static{53 users = new HashMap<Integer,User>();54 users.put(1, new User(1, "张三"));55 users.put(2, new User(2, "李四"));56 users.put(3, new User(3, "王五"));57 }58 59 @Override60 public User getUserById(int id) {61 // TODO Auto-generated method stub62 return users.get(id);63 }64 65 }
2、创建一个实体类
public class User { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public User(int id, String name) { super(); this.id = id; this.name = name; } public User() { super(); } }
3.在spring的配置文件中配置Controller,Service,DAO三层,并完成依赖注入。
说明:由上面的代码可以看出来,在Controller中有Service属性,在Service中有DAO属性,在DAO中没有任何属性,因此在DAO中不需要依赖注入,在Service中需要注入DAO,在Controller中需要注入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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 配置Controller层 --> <bean id="userController" class="com.test.controller.UserController"> <property name="userService" ref="userService"></property> </bean> <!-- 配置Service层 --> <bean id="userService" class="com.test.service.impl.UserServiceImpl"> <property name="userDAO" ref="userDAO"></property> </bean> <!-- 配置DAO层 --> <bean id="userDAO" class="com.test.dao.impl.UserDAOImpl"></bean></beans>
4、测试,查看结果
public class Test { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); UserController userController = (UserController) applicationContext.getBean("userController"); User user = userController.getUserById(1); System.out.println(user); } }
基于注解的方式
上述描述是在配置文件中进行注入,而实际开发中,最常用的是使用基于注解的方式来架构分层。
步骤:
第一步:修改配置文件,将UserController,UserService,UserDAO类扫描到IOC容器中。
第二步:在类中设置注解完成依赖注入。
IOC中常用的四种注解:@Controller @Service @Repository @Component
这四种注解在效果上没有任何区别,在编码过程中可以随意使用其中的任意一个。
但是程序员在开发过程中为了区分类,一般选择使用@Controller,@Service,@Repository分别去表示Controller层,Service层和DAO层。这也就成了一种规范。
第三步:编写测试用例,进行测试。
<?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-4.0.xsd"> <!-- 将类扫描到IOC容器中,这样好使用注解 可以使用精确到包,也可以精确到类 常用包扫描器,这样可以做到扫描包以及子包下的所有类,方便快捷 --> <context:component-scan base-package="com.test"/></beans>
/** *添加注解 */ @Controller //Controller层的注解,表示该类作为一个控制器。 public class UserController { @Autowired //自动注入的注解 private UserService userService; public User getUserById(int id){ return userService.getUserById(id); } } @Service //Service层的注解,表示该类是业务层。public class UserServiceImpl implements UserService{ @Autowired private UserDAO userDAO; @Override public User getUserById(int id) { // TODO Auto-generated method stub return userDAO.getUserById(id); } } @Repository //DAO层的注解,表示该类是数据接口层public class UserDAOImpl implements UserDAO{ private static Map<Integer,User> users; static{ users = new HashMap<Integer,User>(); users.put(1, new User(1, "张三")); users.put(2, new User(2, "李四")); users.put(3, new User(3, "王五")); } @Override public User getUserById(int id) { // TODO Auto-generated method stub return users.get(id); } }
注意:IOC容器自动完成装载(Autowired),默认是byType的方式。
自动装载除了byType的方式,还可以使用byName的方式,使用byName的方式,需要结合@Qualifier注解一起使用。
例如:
/***byName的方式,是通过属性名去匹配对应bean的id属性值 *在类中添加注解时,已经设置了默认的id,即类名首字母小写其余默认。 * *我们也可以手动设置ID值,写法:@Service("ID值")*/@Service("myUserService")public class UserServiceImpl implements UserService{ @Autowired private UserDAO userDAO; @Override public User getUserById(int id) { // TODO Auto-generated method stub return userDAO.getUserById(id); } } @Controllerpublic class UserController { //@Qualifier中的值必须和Service的ID值一致。 @Autowired() @Qualifier("userService") private UserService userService; public User getUserById(int id){ return userService.getUserById(id); } }
原文出处:https://www.cnblogs.com/JiangLai/p/9565646.html
共同学习,写下你的评论
评论加载中...
作者其他优质文章