SpringMVC使用@Component、@Repository、@Service、@Controller注解

SpringMVC框架提供了@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"/>
发布了354 篇原创文章 · 获赞 208 · 访问量 165万+

猜你喜欢

转载自blog.csdn.net/pan_junbiao/article/details/104193210