当前位置: 首页 > news >正文

太月星网站建设程序开发百度一下 你就知道官网 新闻

太月星网站建设程序开发,百度一下 你就知道官网 新闻,赤壁网站建设,顺德网站建设合理使用颜色搭配_方能达到最佳视觉效果Autowired:实现自动装配功能的注解 Autowired注解能够标识的位置: 标识在成员变量上,此时不需要设置成员变量的set方法标识在成员变量对应的set方法上标识在为当前成员变量赋值的有参构造上使用注解进行自动装配,只要在其成员变量…

@Autowired:实现自动装配功能的注解

@Autowired注解能够标识的位置:

 标识在成员变量上,此时不需要设置成员变量的set方法标识在成员变量对应的set方法上标识在为当前成员变量赋值的有参构造上

使用注解进行自动装配,只要在其成员变量上添加@Autowired即可在之前基于XML的自动装配时,我们使用的是autowire属性,我们需要为其成员变量设置set和get方法,但使用注解的方式进行自动装配是不需要要这一过程的

控制层:调用service处理业务逻辑

package springIocAnnotation_packages.spring_controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import springIocAnnotation_packages.spring_Service.UserService;@Controller("controller")
public class UserController {@Autowired //使用@Autowired表示为自动装配private UserService userService;public void saveUser(){userService.saveUser();}
}

业务层:

package springIocAnnotation_packages.spring_Service;import org.springframework.stereotype.Service;@Service
public interface UserService {void saveUser();
}

业务层的实现类:业务层中调用Dao实现持久化操作

package springIocAnnotation_packages.spring_Service.impl;import org.springframework.stereotype.Service;
import springIocAnnotation_packages.spring_Dao.UserDao;
import springIocAnnotation_packages.spring_Service.UserService;@Service
public class UserServiceImpl implements UserService {@Autowiredprivate  UserDao userDao;@Overridepublic void saveUser() {userDao.saveUser();}
}

持久层:

package springIocAnnotation_packages.spring_Dao;public interface UserDao {void saveUser();
}

持久层实现类:

package springIocAnnotation_packages.spring_Dao.impl;import org.springframework.stereotype.Repository;
import springIocAnnotation_packages.spring_Dao.UserDao;@Repository
public class UserDaoImpl implements UserDao {@Overridepublic void saveUser() {System.out.println("保存成功~");}
}

spring-ioc-annotation.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 https://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="springIocAnnotation_packages"></context:component-scan>
</beans>

测试类如下:

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import springIocAnnotation_packages.spring_controller.UserController;public class spring_ByAnnotationTest {@Testpublic void test(){ApplicationContext ioc=new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");UserController userController= ioc.getBean( UserController.class);userController.saveUser();}
}

测试结果如下所示:

在这里插入图片描述

@Autowired:实现自动装配的原理

在之前的学习中,我们了解到,自动装配是将autowire属性的值设置为byName[将要赋值的属性的名字作为bean的id,再在IOC容器中去匹配到某一个bean为当前属性进行赋值]或者byType[根据类型在IOC容器中获取类型匹配的bean为当前的属性自动进行赋值]

那么现在我们使用注解的方式到底是根据byName还是byType呢?

答案:byType

那么为什么不能是byName呢?

我们这里要赋值的成员变量叫userservice,和它类型匹配的是UserServiceImpl,很明显当前的属性名和其id是不相同的,因为我们在上篇文章中就说过,使用注解
+扫描的方式管理的bean的id默认是其类的小驼峰形式,而UserServiceImpl的小驼峰形式为userServiceImpl,对于持久层也是如此,userDao和它类型匹配的是UserDaoImpl,它的小驼峰形式为userDaoImpl,由此可说明@Autowired默认通过byType的方式,在IOC容器中通过类型匹配到某个bean来为
尚属性进行赋值

既然是根据类型,那么就会发生匹配到多个类或者是一个都没匹配到,如下所示:

在XML文件中,添加两个bean对象,使其id和我们的成员变量一致

<bean id="userService" class="springIocAnnotation_packages.spring_Service.impl.UserServiceImpl"></bean>
<bean id="userDao" class="springIocAnnotation_packages.spring_Dao.impl.UserDaoImpl"></bean>

经过上述修改以及结合我们之前学过知识,我们知道这种情况下,会抛出无法匹配到唯一bean的异常,那么事实真的如此吗?

一测便知:

测试结果如下所示:

在这里插入图片描述

竟然输出了保存成功,难道是我们之前学习的知识有问题?

那当然不是,原因是 :默认情况下,它是通过byType实现自动装配,但是如果有多个类型匹配的bean,它将通过byName

既然byType不行,那就byName,但是有没有一种情况是二者都不满足呢?

也就是:如果byType和byName的方式都无法实现自动装配,即IOC容器中有多个类型匹配的bean,且这些bean的id和要赋值的的属性的属性名不一致,那么会抛出异常:NoUniqueBeanDefinitionException

测试如下:

手动修改id的值,使其与成员变量名不相同,下述这种情况就满足byType和byName都无法实现自动装配

<context:component-scan base-package="springIocAnnotation_packages"></context:component-scan>
<bean id="Service" class="springIocAnnotation_packages.spring_Service.impl.UserServiceImpl"></bean>
<bean id="Dao" class="springIocAnnotation_packages.spring_Dao.impl.UserDaoImpl"></bean>

测试结果如下:

在这里插入图片描述

针对上述这种情况,我们的解决办法为在其成员变量上添加@Qualifier注解,通过该注解的value值去指定某个bean的id,将这个bean为该属性赋值

如下所示:

在这里插入图片描述

在这里插入图片描述

测试结果如下所示:

在这里插入图片描述

那么如果byType一个都没匹配到呢?

若IOC容器中没有任何一个类型匹配的bean,此时抛出异常NoSuchBeanDefinitionException,在@Autowired注解中有个属性required,默认值为true,要求必须完成自动装配,可以将required设置为false,设置为false之后的效果即为能装配则装配,不能装配则使用属性的默认值

测试如下:

1:我们将XML文件中的bean对象删除
2:将所有的@Qualifier删除
3:删除UserServiceImpl类上@Service注解

三步完成之后,进行测试:

报错如下:

//没有任何一个UserService的类可用,至少需要一个bean来完成自动装配的效果,所依赖的Autowired注解中的required属性//导致异常产生的原因就是当前Autowired注解中的required属性的值为true,默认情况下必须完成自动装配,不完成自动装配直接报错
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'springIocAnnotation_packages.spring_Service.UserService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

上述所说的也是一种特殊情况,既然是Autowired注解中的required属性的值为true导致的异常产生,那么我们将其设置为 false是否可以解决这个问题呢?

测试结果如下:

在这里插入图片描述

上面我们说默认的byType不行,那么我们就使用byName,要是还不行,再使用新的注解@Qualifier,但这种特殊的情况在实际的开发中是非常少的,因为一个类型的bean,我们只会在IOC容器中配置一次,我们不可能配置多次,这个时候我们使用默认的byType即可

http://www.khdw.cn/news/45010.html

相关文章:

  • 医院网站党支部机构建设方案湖南网站seo公司
  • 好习惯网站搜索引擎付费推广
  • seopeixunwangseo优化网站词
  • 做网站需提供什么资料网络营销常用的工具
  • 女的可以学做网站关注公众号推广2元一个
  • 做的网站必须放在idc机房吗网络推广有哪几种方法
  • 珠海网站建设专线青岛网站建设微动力
  • 建设淘宝网站需要多少钱郑州网络推广
  • 宝塔windows建设网站备案查询官网
  • 微信小程序和网页哪个开发难seo 优化教程
  • 手机做任务网站有哪些网站快速优化排名
  • 公司建网站的详细步骤win优化大师有用吗
  • 桂林网站建设公司seo怎样优化网站
  • 企业网站如何做排名谷歌浏览器网址
  • seo网站推广是什么seo推广策略
  • 南京企业网站seo欧美网站建设公司
  • 优秀服装网站设计秦洁婷seo博客
  • 2015做哪些网站致富seo人员培训
  • java 做网站的开源平台上海seo顾问推推蛙
  • 单页营销网站设计专业黑帽seo推广
  • 网站建设公司能信吗在线生成个人网站源码
  • 中文网站做google广告好吗windows优化软件排行
  • 网站建设概述什么是软文营销
  • 橙子建站验证码有危险吗网站建设多少钱
  • 博罗做网站报价网站alexa排名查询
  • 贵州做网站kuhugz外贸推广平台哪家好
  • 广州珠吉网站建设杭州seo推广优化公司
  • 建设证件查询官方网站2023能用的磁力搜索引擎
  • 网站建设计入什么会计科目网络建设推广
  • 做电影网站一年赚多少钱线上销售怎么做