Spring使用注解(Annotation)进行bean的装配总结+实例
  anLrwkgbyYZS 2023年12月30日 14 0


1. 常用的注解 

常用的注解有如下几种:@Component、 @Repository 、@Service、 @Controller 、@Autowired 、@Resource 、@Qualifier。下面列出一个表格,详细的介绍一下它们。

注解名称

注解描述

@Component

可以使用这个注解去描述Spring中的Bean,是一个泛化的概念,标注于Java类上,表示该类是一个组件,可用于任何层次。

@Repository

其功能和@Component相同,将@Component细化,用于标识数据访问层(DAO层)的类,工程层次看起来更加清晰。

@Service

其功能和@Component相同,将@Component细化,用于标识业务层(Service层)的类,工程层次看起来更加清晰。

@Controller

其功能和@Component相同,将@Component细化,用于标识控制器(Controller),工程层次看起来更加清晰。

@Autowired

用于对Bean的属性变量,属性的setter方法以及构造方法进行标注,配合对应的注解处理器完成bean的自动配置。默认按照Bean的类型进行装配。

例:UserDAO userDAO;Bean的类型为 UserDAO, Bean的实例名称为 userDAO

     @Autowired 的 执行步骤如下。

  1. 先按照Bean的类型进行装配,如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据。
  2. 如果按照Bean的类型查询的结果不止一个,那么@Autowired会根据名称来查找。
  3. 如果根据名称查询,查询的结果为空,报出异常。

@Resource

用于对Bean的属性变量,属性的setter方法以及构造方法进行标注,配合对应的注解处理器完成bean的自动配置。默认按照Bean的实例名称进行装配。

例:UserDAO userDAO;Bean的类型为 UserDAO, Bean的实例名称为 userDAO

@Qualifier

与@Autowired配合使用,会将 默认按照Bean的模式进行装配 改为 默认按照Bean的实例名称进行装配,Bean的实例名称由@Qualifier的参数指明。

2. 工程实例

下面给出工程的源码,创建一个 spring 工程可参考 : IntelliJ IDEA 创建 第一个 Spring 项目 (入门实例),创建完项目后再添加这个jar 包:javax.annotation-api-1.3.2.jar。jar包可以自行下载,也可以在云盘里面下载:https://pan.baidu.com/s/1G9JWQjusUgiAZd7lXKjeVw 提取码:xr3z 。项目的工程目录如下:

Spring使用注解(Annotation)进行bean的装配总结+实例_spring

2.1  service 层源码 

UserService.java 源代码如下:

package com.study.spring.service;

public interface UserService {
    public void save();
}

UserServiceImpl.java 源代码如下:

package com.study.spring.service.impl;

import com.study.spring.dao.UserDAO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.study.spring.service.UserService;

import javax.annotation.Resource;

@Component("userService")
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDAO userDAO;

    @Resource
    private UserDAO userDAO01;

    public void save() {
        this.userDAO.save();
        this.userDAO01.save();
        System.out.println("userService save...");
    }
}

2.2 DAO层源码

DAO 中有一个用户接口,两个用户接口的实现类。

UserDAO.java 源代码如下:

package com.study.spring.dao;

public interface UserDAO {
    public void save();
}

UserDAOImpl.java 源代码如下:

package com.study.spring.dao.impl;

import com.study.spring.dao.UserDAO;
import org.springframework.stereotype.Repository;

@Repository("userDAO")
public class UserDAOImpl implements UserDAO {

    @Override
    public void save() {
        System.out.println("userDao save ...");
    }
}

UserDAOImpl01.java 源代码如下:

package com.study.spring.dao.impl;

import com.study.spring.dao.UserDAO;
import org.springframework.stereotype.Repository;

@Repository("userDAO")
public class UserDAOImpl implements UserDAO {

    @Override
    public void save() {
        System.out.println("userDao save ...");
    }
}

2.3 控制器源码

UserController.java 源代码如下:

package com.study.spring.controller;

import org.springframework.stereotype.Controller;
import com.study.spring.service.impl.UserServiceImpl;

import javax.annotation.Resource;

@Controller("userController")
public class UserController {
    @Resource(name = "userService")
    private UserServiceImpl userService;
    public void save() {
        this.userService.save();
        System.out.println("userController save...");
    }
}

2.4 测试类 

test.java 源代码如下:

package com.study.spring.test;

import com.study.spring.controller.UserController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class test {
    public static void main(String args[]) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserController userController = (UserController) context.getBean("userController");
        userController.save();
    }
}

2.5 applicationContext.xml

<?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="com.study.spring.controller"/>
  <context:component-scan base-package="com.study.spring.service.impl"/>
  <context:component-scan base-package="com.study.spring.dao.impl"/>
</beans>

3. 工程测试

3.1 测试一

运行 test.java , 运行截图如下。

Spring使用注解(Annotation)进行bean的装配总结+实例_java_02

3.2 测试二

将   @Repository("userDAO")  修改 为  @Repository,运行 test.java , 报错,错误截图如下:

Spring使用注解(Annotation)进行bean的装配总结+实例_实例名_03

错误原因:如果按照Bean的类型查询的结果不止一个,那么@Autowired会根据名称来查找。如果根据名称查询,查询的结果为空,报出异常。

3.3 测试三

添加 @Qualifier 注解 , 如下:

Spring使用注解(Annotation)进行bean的装配总结+实例_实例名_04

运行截图:

Spring使用注解(Annotation)进行bean的装配总结+实例_实例名_05

原因:@Qualifier与@Autowired配合使用,会将 默认按照Bean的模式进行装配 改为 默认按照Bean的实例名称进行装配,Bean的实例名称由@Qualifier的参数指明

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月30日 0

暂无评论

推荐阅读
  8s1LUHPryisj   14小时前   5   0   0 Java
anLrwkgbyYZS