Spring框架提供了@Component、@Repository、@Service、@Controller注解,关于这些注解的命名方式,它们的作用差不多,都是将对象识别为bean对象,然后将bean对象交给Spring容器进行管理。只是为了区分业务场景所采取的特定功能化的注解组件,它们本质的原理(暴露实现类)是相同的。官方的原话是:带此注解的类看为组件,当使用基于注解的配置和类路径扫描的时候,这些类就会被实例化。其他类级别的注解也可以被认定为是一种特殊类型的组件。
1、@Controller注解:实现控制器层(Controller层)。
2、@Service注解:实现业务逻辑服务层(Service层)。
3、@Repository注解:实现数据库访问层(Dao层)。
4、@Component注解:把普通POJO实例化到Spring容器中,相当于配置文件中的<bean id="" class=""/>。
下面以配置Dao层及Service层的bean加载为例,用于指定接口对应的实现类,然后在相关的bean中注入,一般的配置会如下:
<bean name="userDao" class="com.pjb.ssm.dao.impl.UserDaoImpl"/>
<bean name="userService" class="com.pjb.ssm.service.impl.UserServiceImpl"/>
但是这里不配置类似上面的bean加载,为了简化配置,使用@Repository注解和@Service注解来暴露和引入相关的Dao层及Service层对应的bean。
为此,只需要在相关的Dao层实现类上添加@Repository注解,在相关的Service层实现类上添加@Service注解,分别表示一个Dao类的暴露bean和一个Service类的暴露bean。例如Service实现类“UserServiceImpl”,那么默认暴露出一个id为“userServiceImpl”的bean配置(以类名首字母小写为准)。还可以手动指定暴露的名称,在注解中加name属性即可。例如要将“UserServiceImpl”类的名称暴露为“testUserServiceImpl”,那么在注解中添加该名称既可以如:@Service(“testUserServiceImpl”),Dao层暴露的道理与此相同。
在其他类中引入暴露的bean时,使用@Resource注解并放置在成员变量或者set方法上部即可。例如UserServiceImpl类中要引入id为“userDaoImpl”的Dao层的bean对象,代码如下:
@Service
public class UserServiceImpl implements UserService
{
@Resource
private UserDao userDao;
//忽略其他代码...
}
最后当对象标识了上述注解后,还需要在SpringMVC的核心配置文件中,使用<context:component-scan>组件扫描标签,进行包的扫描,找出所有使用@Component、@Repository、@Service、@Controller注解的对象,将这些对象识别为bean对象。配置如下:
<!-- 包扫描:Entity层,Dao层,Service层 -->
<context:component-scan base-package="com.pjb.ssm.entity,com.pjb.ssm.dao,com.pjb.ssm.service"/>
<!-- 包扫描:Controller层 -->
<context:component-scan base-package="com.pjb.ssm.controller"/>
综合实例
【实例】创建JavaWeb项目,在项目中使用@Component、@Repository、@Service、@Controller注解。实现获取用户信息业务,并在页面中显示用户信息。执行结果如下图:
(1)创建项目
创建JavaWeb项目,搭建项目结构,如下图:
(2)实体层(Entity层)
在Entity目录(实体层),创建用户信息实体类(UserInfo.java)。
package com.pjb.ssm.entity;
import org.springframework.stereotype.Component;
/**
* 用户信息实体类
*
* @author pan_junbiao
**/
@Component
public class UserInfo
{
private int userId; //用户ID
private String userName; //用户姓名
private String blogUrl; //博客地址
private String remark; //备注
//省略getter与setter方法...
}
(3)数据访问层(Dao层)
创建用户信息数据库访问接口(UserDao.java)。
package com.pjb.ssm.dao;
import com.pjb.ssm.entity.UserInfo;
/**
* 用户信息数据库访问接口
*
* @author pan_junbiao
**/
public interface UserDao
{
/**
* 获取用户信息
*/
public UserInfo getUserInfo();
}
创建用户信息数据库访问类(UserDaoImpl.java),并标识@Repository注解,实现UserDao接口,实现获取用户信息,模拟读取数据库获取数据方法。
package com.pjb.ssm.dao.impl;
import com.pjb.ssm.dao.UserDao;
import com.pjb.ssm.entity.UserInfo;
import org.springframework.stereotype.Repository;
/**
* 用户信息数据库访问类
*
* @author pan_junbiao
**/
@Repository
public class UserDaoImpl implements UserDao
{
/**
* 获取用户信息
*/
public UserInfo getUserInfo()
{
//获取用户信息(模拟读取数据库获取数据)
UserInfo userInfo = new UserInfo();
userInfo.setUserId(1);
userInfo.setUserName("pan_junbiao的博客");
userInfo.setBlogUrl("https://blog.csdn.net/pan_junbiao");
userInfo.setRemark("您好,欢迎访问 pan_junbiao的博客");
return userInfo;
}
}
(4)业务逻辑服务层(Service层)
创建用户信息业务逻辑接口(UserService.java)。
package com.pjb.ssm.service;
import com.pjb.ssm.entity.UserInfo;
/**
* 用户信息业务逻辑接口
*
* @author pan_junbiao
**/
public interface UserService
{
/**
* 获取用户信息
*/
public UserInfo getUserInfo();
}
用户信息业务逻辑类(UserServiceImpl.java),并实现UserService接口。
package com.pjb.ssm.service.impl;
import com.pjb.ssm.dao.UserDao;
import com.pjb.ssm.entity.UserInfo;
import com.pjb.ssm.service.UserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* 用户信息业务逻辑类
*
* @author pan_junbiao
**/
@Service
public class UserServiceImpl implements UserService
{
@Resource
private UserDao userDao;
/**
* 获取用户信息
*/
public UserInfo getUserInfo()
{
return userDao.getUserInfo();
}
}
(5)控制器层(Controller层)
创建用户信息控制器(UserController.java)。
package com.pjb.ssm.controller;
import com.pjb.ssm.entity.UserInfo;
import com.pjb.ssm.service.UserService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
/**
* 用户信息控制器
*
* @author pan_junbiao
**/
@Controller
@RequestMapping("user")
public class UserController
{
@Resource
private UserService userService;
/**
* 获取用户信息
*/
@RequestMapping(value = "/getUserInfo", method = RequestMethod.GET)
public ModelAndView getUserInfo()
{
//访问业务逻辑层,获取用户信息
UserInfo userInfo = userService.getUserInfo();
//创建返回结果ModelAndView对象
ModelAndView modelAndView = new ModelAndView();
//保存结果
modelAndView.addObject("userInfo", userInfo);
//指定视图
modelAndView.setViewName("/user/user_info.jsp");
//返回结果
return modelAndView;
}
}
(6)表现层(View层)
在web中创建user目录,并在该目录下创建user_info.jsp页面。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户信息</title>
<meta name="author" content="pan_junbiao的博客">
<style>
table {
border-collapse: collapse;
}
table, table tr th, table tr td {
border: 1px solid #000000;
padding: 5px 10px;
}
</style>
</head>
<body>
<table align="center">
<caption>用户信息</caption>
<tr>
<th>用户编号</th>
<td>${userInfo.userId}</td>
</tr>
<tr>
<th>用户姓名</th>
<td>${userInfo.userName}</td>
</tr>
<tr>
<th>博客地址</th>
<td>${userInfo.blogUrl}</td>
</tr>
<tr>
<th>备注信息</th>
<td>${userInfo.remark}</td>
</tr>
</table>
</body>
</html>
(7)相关配置
在SpringMVC的核心配置文件中,使用<context:component-scan>组件扫描标签,进行包的扫描,找出所有使用@Component、@Repository、@Service、@Controller注解的对象,将这些对象识别为bean对象。
<!-- 包扫描:Entity层,Dao层,Service层 -->
<context:component-scan base-package="com.pjb.ssm.entity,com.pjb.ssm.dao,com.pjb.ssm.service"/>
<!-- 包扫描:Controller层 -->
<context:component-scan base-package="com.pjb.ssm.controller"/>