首页 > 其他分享 >Spring的包扫描开发与@Autowired与@Resource注解的区别(五)

Spring的包扫描开发与@Autowired与@Resource注解的区别(五)

时间:2022-11-10 20:32:44浏览次数:47  
标签:Resource Autowired Spring new userList User UserService userService 注解


东家蝴蝶西家飞,白骑少年今日归。 愿,所有迷茫的人,都不再迷茫的,愿,所有努力工作的人,都可以得到应有的回报,愿,所有的人,都可以找到回家的方向,愿,再无苦痛,再无离别。
上一章简单介绍了Spring与Struts2的整合案例及XML配置的具体使用(四),如果没有看过,请​​观看上一章​​。

一.注解开发的意义

前面第四章所用的是XML配置的方式进行的开发,在实际的开发中,Action有多个,所对应的Service与Dao也有很多个,会导致存在很多的bean的情况。 而且,特别是简单的实体类POJO 会有很多的属性,会导致要写很多的<property> 进行注入,这样非常的不好,可以采用注解的方式进行相应的配置,可以简化开发。

例子与第四章的例子是一样的。

所使用的jar包有:

Spring的包扫描开发与@Autowired与@Resource注解的区别(五)_Spring包扫描开发


其中,spring-aop 与struts2-spring-plugin 的jar包是这次要用到的。其余的,都是上次第四章用到的。

二. 注解开发

添加注解,需要用到 aop的jar包。

二.一 添加aop 的jar 包。

Spring的包扫描开发与@Autowired与@Resource注解的区别(五)_@Autowired注解_02

二.二 在applicationContext.xml 中添加约束

添加的约束为 context。
添加后的约束为:

<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">

二.三 添加组件扫描

其中,base-package 指定要扫描的包名, 如果有多个的话,之间用,进行隔开。
这个包名要尽量小,这样就可以少扫描一些无用的包,但要把

<!-- 组件扫描 -->
<context:component-scan base-package="com.yjl"></context:component-scan>
<!--多个的话-->
<context:component-scan base-package="com.yjl,com.abc,com.bcd"></context:component-scan>

二.四 在service中添加dao的引用

@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserDao userDao;
@Override
public List<User> listAll() {
System.out.println("输出userDao:"+userDao);
return userDao.listAll();
}
}

在UserServiceImpl 上,添加了一个@Service 的类注解, 在userDao 属性上面添加了一个@Autowired 的注解。 这里并没有实现userDao的setter和getter 方法。

二.五 UserDaoImpl

@Repository
public class UserDaoImpl implements UserDao {
@Override
public List<User> listAll() {
List<User> userList=new ArrayList<User>();
User user1=new User(1,"父亲","男",50);
User user2=new User(2,"母亲","女",48);
User user3=new User(3,"慧芳","女",27);
User user4=new User(4,"正伟","男",28);
User user5=new User(5,"莉莉","女",25);
User user6=new User(6,"敬龙","男",26);
User user7=new User(7,"两个蝴蝶飞","男",24);
userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
userList.add(user5);
userList.add(user6);
userList.add(user7);
return userList;
}
}

在UserDaoImpl 上添加了 @Repository 的注解, listAll() 的方法改成了普通的方法。

二.六 在Action 中注入service

@Controller
public class UserAction extends ActionSupport{
private static final long serialVersionUID = 1L;
@Autowired
private UserService userService;
/**
* @author yuejl
* @Description 查询全部
* @return
*/
public String list(){
System.out.println("输出userService:"+userService);
List<User> userList=userService.listAll();
ServletActionContext.getRequest().setAttribute("userList",userList);
return "list";
}
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}

在UserAction 上面有一个@Controller 的类注解, userService 属性上有一个@Autowired 的属性注解。

二.七 struts.xml 文件

<!--注意,此时class仍然为全限定名称-->
<action name="User_*" class="com.yjl.web.UserAction" method="{1}">
<result name="list">list.jsp</result>
</action>

二.八 重启服务器,看是否成功

Spring的包扫描开发与@Autowired与@Resource注解的区别(五)_spring_03


Spring的包扫描开发与@Autowired与@Resource注解的区别(五)_spring_04


可以正常的进行注入。

二.九 将action中@Autowired 注入到setter方法上

Spring的包扫描开发与@Autowired与@Resource注解的区别(五)_spring_05


也是可以正常通过的。

Spring的包扫描开发与@Autowired与@Resource注解的区别(五)_@Autowired注解_06

三. 类注解

类上的注解有四个, @Component, @Controller,@Service, @Repository

以前只有一个注解 @Component, 现在扩充了后面的三个。 目前来说,这四个没有区别,但以后可能会扩充后面三个的意义,所以一般:
@Controller 用于Web层
@Service 用于事务层
@Repository 用于持久层

四. @Autowired 注解

@AutoWired 是按照类型,即byType 的方式进行装配的,默认是必须要存在的。

  1. 如果不存在的话,即在Action中注入service时,而将 service的注解进行去除:

    这个时候,会报错的。 是在服务器启动的时候,就报错了。
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field:
private com.yjl.service.UserService com.yjl.web.action.UserAction.userService;
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type [com.yjl.service.UserService] found for dependency:
expected at least 1 bean which qualifies as autowire candidate for this dependency.
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

可以手动设置 为非必须。

@Autowired(required=false)
private UserService userService;

在访问 User_list.action 时会报错,是空指向的异常。 服务器启动的时候不报错。

Spring的包扫描开发与@Autowired与@Resource注解的区别(五)_spring_07


2. 是按照类型进行的自动装配,现在 UserService 接口只有一个实现 UserServiceImpl 类,所以按照类型找的话,只会找到这一个,可以自动进行装配。 如果现在UserService 多了一个实现类型,即UserServiceImpl2时,这个时候会怎么样呢?

@Service
public class UserServiceImpl2 implements UserService{
@Autowired
private UserDao userDao;
@Override
public List<User> listAll() {
System.out.println("输出userDao:"+userDao);
return userDao.listAll();
}
}

那么这个Action的话:

@Autowired
private UserService userService;

这个时候会产生异常:

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: 
private com.yjl.service.UserService com.yjl.web.action.UserAction.userService;
nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException:
No qualifying bean of type [com.yjl.service.UserService] is defined:
expected single matching bean but found 2: userServiceImpl,userServiceImpl2

这个时候,如果按照类型的 话, 会找到两个实现, userServiceImpl 和userServiceImpl2 时,这个时候是没有办法区分的装配的,会出现错误。
3. 解决,针对上面的问题,可以添加另外一个注解 @Qualifier ,这个来指定名称。
如: ​​​@Qualifier(value="userServiceImpl")​​​ 这个userServiceImpl 表示的就是UserServiceImpl, ​​@Qualifier(value="userServiceImpl2")​​​ 表示的就是UserServiceImpl2,
其中,有一个对应的关系, value 的名称为类名称首字母小写。

解决方式: 添加一个@Qualifier 的注解。

五 @Resource 注解

@Resource 的注解来源包是: ​​import javax.annotation.Resource;​​​ 是java 规范的,而@Autowired来源包是: ​​import org.springframework.beans.factory.annotation.Autowired;​​ 故最好使用 @Resouce 的注解。 使用@Resource 需要指定一下名称。

五.一 UserDaoImpl

/**
@author:yuejl
@date: 2019年4月20日 上午10:17:09
@Description 类的相关描述
*/
// 需要添加一个 value的值
@Repository(value="userDaoImpl")
public class UserDaoImpl implements UserDao {
@Override
public List<User> listAll() {
List<User> userList=new ArrayList<User>();
User user1=new User(1,"父亲","男",50);
User user2=new User(2,"母亲","女",48);
User user3=new User(3,"慧芳","女",27);
User user4=new User(4,"正伟","男",28);
User user5=new User(5,"莉莉","女",25);
User user6=new User(6,"敬龙","男",26);
User user7=new User(7,"两个蝴蝶飞","男",24);
userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
userList.add(user5);
userList.add(user6);
userList.add(user7);
return userList;
}

}

五.二 UserServiceImpl

//指定一个 value
@Service(value="userService")
public class UserServiceImpl implements UserService{
// 用name 指定是哪一个实现, 放置在属性上
@Resource(name="userDaoImpl")
private UserDao userDao;
@Override
public List<User> listAll() {
System.out.println("输出userDao:"+userDao);
return userDao.listAll();
}
}

五.三 UserAction

@Controller
public class UserAction extends ActionSupport{
private static final long serialVersionUID = 1L;
private UserService userService;
/**
* @author yuejl
* @Description 查询全部
* @return
*/
public String list(){
System.out.println("输出userService:"+userService);
List<User> userList=userService.listAll();
ServletActionContext.getRequest().setAttribute("userList",userList);
return "list";
}

public UserService getUserService() {
return userService;
}
// 放置在setter方法上。
@Resource(name="userService")
public void setUserService(UserService userService) {

this.userService = userService;
}
}

其中 @Resource 的顺序 是:

Spring的包扫描开发与@Autowired与@Resource注解的区别(五)_@Autowired注解_08


如果指定类的话:

@Resource(name="userService",type=UserServiceImpl.class)

如果只有一个类型与其对应的话,可以直接即可。

@Resource
private UserService userService;

建议使用@Resouce

六. struts2-spring-plugin.jar

现在struts.xml 的配置依然是:

<action name="User_*" class="com.yjl.web.action.UserAction" method="{1}">
<result name="list">list.jsp</result>
</action>
</package>

这个时候Dao,Service 的创建交给了Spring, 但是Action的创建并没有交给Spring, 仍然是Struts2 进行的创建。 虽然在UserAction上添加了@Controller 的注解。 这个时候,UserAction会创建两次, Spring通过注解@Controller 创建一次, Struts2通过class 全限定名称创建一次。 如果这里直接 class=“userAction” 是会出现错误的,因为 Spring 与Struts2 并没有相应的整合,两个是互不关联的。 需要将Struts2与Spring 进行整合,引入相应的jar 包,添加到classpath 路径 下即可。

Spring的包扫描开发与@Autowired与@Resource注解的区别(五)_struts_09

重启服务器,即可。 一定不要忘记引入整合jar 包。

<package name="user" extends="struts-default" namespace="/">
<action name="User_*" class="userAction" method="{1}">
<result name="list">list.jsp</result>
</action>
</package>

Spring 创建的 实体bean 默认的是 类名称首字母小写的样式。 相当于xml配置的:

<bean id="userAction" class="com.yjl.web.action.UserAction">

谢谢!!!


标签:Resource,Autowired,Spring,new,userList,User,UserService,userService,注解
From: https://blog.51cto.com/u_13420484/5842019

相关文章

  • Spring整合Mybatis分析与编码
    Spring整合Mybatis分析与编码正文Mybatis在开发的过程中,必须要经过的步骤有数据表-实体类-实体类别名-mapper接口-mapper文件实现-mapper文件注册-mybatisAPI......
  • spring-boot 使用java -jar 启动失败
    问题 springcloudeureka项目打jar包,打成docker镜像,在k8s里起不来,没有日志,pod在无限次的重启。 dockerfile的启动命令sh-cjava-jareureka.jar排查过程1.新......
  • dubbo+zookeeper+springboot远程连接,虚拟机和主机分布式操作
    dubbo+zookeeper+springboot远程连接,虚拟机和主机分布式操作springboot版本:阿里云2.3.7实现目标在主机上的消费者可以调用虚拟机中生产者的接口方法项目目录pom.xml......
  • SpringCloudAlibaba 微服务组件 Nacos 之配置中心源码深度解析
    大家好,这篇文章跟大家聊下SpringCloudAlibaba中的微服务组件Nacos。Nacos既能做注册中心,又能做配置中心,这篇文章主要来聊下做配置中心时client端的一些设计,主要从源......
  • springboot整合项目-商城项目订单系统以及aop监测
    订单系统1.持久层1.将数据插入到订单表中insertintot_order(oid除外所有的字段)values(字段的值)2.将数据还要插入订单项的表中insertintot_order_item(oid除......
  • Spring Boot数据
    SpringBoot集成了多种数据技术,包括SQL和NoSQL。1.SQL数据库Spring框架为使用SQL数据库提供了广泛的支持,从使用直接JDBC访问到​​JdbcTemplate​​完整的“对象......
  • SpringBoot 整合mybatis-plus
    SpringBoot整合mybatis-plus1、导入Maven依赖<dependencies><!--web依赖--><dependency><groupId>org.springframework.boot</groupId>......
  • spring注入和使用多个实现类
    spring注入多个实现类写一个接口publicinterfaceAccRuleFieldConvertProcessor{Objectexecute();}写三个实现类一、@Service(AccRuleField.WAY_CONST)pub......
  • SpringBoot启用Https(二十六)
    死亡的日子终究会到来,在那一天到来之前,别忘记,来我坟前再看一眼上一章简单介绍了SpringBoot自定义日志Starter(二十五),如果没有看过,​​请观看上一章​​关于这一章节的内......
  • Spring_Session解决Session共享的问题(二十三)
    二八佳人体似酥,腰间仗剑斩愚夫。虽然不见人头落,暗里教君骨髓枯。愿世人皆有所爱,皆可以爱。上一章简单介绍了SpringBoot整合Ehcache缓存(二十二),如果没有看过,​​请观看上......