Spring(二十三):Spring自动注入的实现方式
注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解包含:Autowrired/Resource/Qualifier/Service/Controller/Repository/Component。
- Autowired:自动注入,自动从spring的上下文找到合适的bean来注入;
- Resource:用来指定bean名称注入;
- Qualifier和Autowired配合使用:指定bean的名称来注入;
- Service、Contoller、Repository分别标记类:Service层类、Contoller层类、数据层存储层的类,Spring扫描注解配置时,会标记这些类要生成bean;
- Component是一种泛指:标记类是组件,Spring扫描注解配置时,会标记这些类要生成bean。
它们之间的区别:
- Autowired、Resource用来修饰字段、构造函数、或者设置方法实现注入的;
- Service、Controller、Repository、Component是修饰类,标记这些类要生成bean。
接下来我们新建一个maven项目来看看spring注解自动注入的使用:
使用AnnotationConfigApplicationContext(basePackages)初始化ApplicationContext方式
1)新家maven项目(Learn-Spring-01)
在Pom.xml引入spring依赖:
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <maven.compiler.source>1.8</maven.compiler.source>
- <maven.compiler.target>1.8</maven.compiler.target>
- <!--Spring版本号 -->
- <org.springframework.version>5.2.0.RELEASE</org.springframework.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-webmvc</artifactId>
- <version>${org.springframework.version}</version>
- </dependency>
- 。。。
- </dependencies>
2)新建Article和ArticleDao类,并给ArticleDao类上加上 @Repository 注解
Article实体类:
- package com.dx.test.model;
- public class Article {
- private Long id;
- private String title;
- private String author;
- private String content;
- 。。。。
- @Override
- public String toString() {
- return "Article [id=" + id + ", title=" + title + ", author=" + author + ", content=" + content + "]";
- }
- }
ArticleDao类(数据操作类):
- package com.dx.test.dao;
- import org.springframework.stereotype.Repository;
- import com.dx.test.model.Article;
- @Repository
- public class ArticleDao {
- /**
- * 根据文章id,查询文章详情实体
- *
- * @param id 文章id
- * @return 返回查找到的文章详情
- */
- public Article getById(Long id) {
- Article article = new Article();
- article.setId(1L);
- article.setTitle("Test Article");
- article.setAuthor("Admin");
- article.setContent("The Article's Content");
- return article;
- }
- }
3)新建Service类ArticleService,并在ArticleService类上加上 @Service 注解,在这个类中定义 ArtileDao的字段,并通过 @Autowired 来修饰该字段,这样上面定义的 ArticleDao 类的实例就会自动被注入到 ArticleService 的实例中:
- package com.dx.test.service;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import com.dx.test.dao.ArticleDao;
- import com.dx.test.model.Article;
- @Service
- public class ArticleService {
- @Autowired
- private ArticleDao articleDao;
- /**
- * 根据文章id,查询文章实体详情
- *
- * @param id 文章id
- * @return 返回查找文章详情
- */
- public Article getById(Long id) {
- return articleDao.getById(id);
- }
- }
注意:@Autowired 注解有一个可以为空的required属性,可以用来指定字段是否是必须的,如果必须的,则在找不到合适的实例时会抛出异常。
4)在com.dx.test.App的main方法中使用Spring代码方式自动注入ArticleDao、ArticleService。
- package com.dx.test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.annotation.AnnotationConfigApplicationContext;
- import com.dx.test.model.Article;
- import com.dx.test.service.ArticleService;
- /**
- * Hello SpringFramework!
- */
- public class App {
- public static void main(String[] args) {
- ApplicationContext applicationContext = new AnnotationConfigApplicationContext("com.dx.test.dao",
- "com.dx.test.service");
- ArticleService articleService = applicationContext.getBean(ArticleService.class);
- Article article = articleService.getById(1L);
- System.out.println(article);
- }
- }
上面的main方法中首先我们初始化了applicationContext实例,它是AnnonationConfigApplicationContext,它的构造函数接受 basePackages 的名称,来限定扫描的package范围。然后就可以通过applicationContext#getBean()方法获得 ArticleService 的实例。
此时运行控制打印信息如下:
- Article [id=1, title=Test Article, author=Admin, content=The Article's Content]
使用代码注入+spring xml配置文件方式
实际上在SSM(Spring+SpringMVC+Mybatis)项目中,更多的习惯于使用注解+spring xml配置方式,实现自动注入。
在maven测试工程中的src/main/resources下,新建applicationContext.xml的spring配置文件,其内容如下:
- 实际上在SSM(Spring+SpringMVC+Mybatis)项目中,更多的习惯于使用注解+spring xml配置方式,实现自动注入。
- 在maven测试工程中的src/main/resources下,新建applicationContext.xml的spring配置文件,其内容如下:
- <?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-4.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-4.0.xsd ">
- <!-- bean annotation driven -->
- <context:annotation-config />
- <context:component-scan base-package="com.dx.test.dao,com.dx.test.service" >
- </context:component-scan>
- <bean id="testArticleDao" class="com.dx.test.dao.ArticleDao" />
- </beans>
在上面配置中,我们通过 <context:annotation-config /> 和 <context:component-scan ... /> 两个配置节点,来指定要扫描注解注入,然后又定义了一个 id 为 testArticleDao 的bean。
因为这里我们使用注解+spring xml配置的方式实现自动注入,那么在初始化ApplicationContext类的方式就需要修改下,加载配置文件方式在Spring中包含两个接口:ClassPathXmlApplicationContext 或 FileSystemXmlApplicationContext,这里我们采用 ClassPathXmlApplicationContext 方式来实现初始化ApplicationContext。实现代码如下:
- package com.dx.test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import com.dx.test.model.Article;
- import com.dx.test.service.ArticleService;
- /**
- * Hello SpringFramework!
- */
- public class App {
- public static void main(String[] args) {
- ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
- ArticleService articleService = applicationContext.getBean(ArticleService.class);
- Article article = articleService.getById(1L);
- System.out.println(article);
- }
- }
运行程序输出为:
- Article [id=1, title=Test Article, author=Admin, content=The Article's Content]
上面applicationContext.xml中我们定义了一个id为 testArticleDao 的bean,那么在 ArticleService 中注入 ArticleDao的bean时,我们可以通过@Resource(name="testArticleDao")的方式注入:
- @Resources(name="testArticleDao")
- private ArticleDao articleDao;
当然我们也可以使用 @Qualifier("testArticleDao")+@Autowired 的方式替代 @Resources(mane="testArticleDao")的方式。
- @Autowired
- @Qualifier("testArticleDao")
- private ArticleDao articleDao;
注意:
1)Resource本身不是spring提供的,从它的命名空间可以得知:javax.annotation.Resource;
2)@Resource注解实现的效果等同于 @Autowired+@Qualifier的效果。
Spring(二十三):Spring自动注入的实现方式的更多相关文章
- Quartz与Spring集成 Job如何自动注入Spring容器托管的对象
在Spring中使用Quartz有两种方式实现:第一种是任务类继承QuartzJobBean,第二种则是在配置文件里定义任务类和要执行的方法,类和方法可以是普通类.很显然,第二种方式远比第一种方式来的 ...
- spring练习,使用Eclipse搭建的Spring开发环境,属性注入通过构造方法方式实现,模拟用户的正常登录。
相关 知识 >>> 相关 练习 >>> 实现要求: 使用Eclipse搭建的Spring开发环境,属性注入通过构造方法方式实现,模拟用户的正常登录.要求如下: 通过 ...
- Spring框架使用ByName自动注入同名问题剖析
问题描述 我们在使用spring框架进行项目开发的时候,为了配置Bean的方便经常会使用到Spring当中的Autosire机制,Autowire根据注入规则的不同又可以分为==ByName==和 ...
- spring mvc:属性无法自动注入
在使用spring mvc 3开发一个项目模块时,遇到这样一个奇怪的问题: 前端页面发送的请求中,所有参数都无法自动注入到指定的@ModelAttribute对象中,经过检查,参数名称与接受对象的属性 ...
- spring boot测试类自动注入service或dao
使用Spring Boot进行单元测试时,发现使用@Autowired注解的类无法自动注入,当使用这个类的实例的时候,报出NullPointerException,即空指针异常. Spring Boo ...
- Spring Boot @Autowired 没法自动注入的问题
Application 启动类: @SpringBootApplication @EnableConfigurationProperties @ComponentScan(basePackages = ...
- Spring学习(十三)-----Spring 表达式语言(Spring EL)
本篇讲述了Spring Expression Language —— 即Spring3中功能丰富强大的表达式语言,简称SpEL.SpEL是类似于OGNL和JSF EL的表达式语言,能够在运行时构建复杂 ...
- Spring扩展:Spring的IoC容器(注入对象的方式和编码方式)
二.Spring的IoC容器 IoC:Inversion of Control(控制反转) DI:Dependency Injection(依赖注入) 三.依赖注入的方式 (1)构造注入 (2)set ...
- Spring IOC - 控制反转(依赖注入) - 创建对象的方式
a.通过类的无参构造方法创建对象 在入门案例中就是这种方式.当用最普通的方式配饰一个<bean>时,默认就是采用类的 无参构造创建对象.在Spring容器初始化时,通过<bean&g ...
随机推荐
- Python之数据分析
什么是数据分析? 运用不同行业中,专门从事行业数据搜集.整理.分析,并依据数据做出行业研究.评估和预测的专业人员. 熟悉行业知识.公司业务及流程,最好有自己独到的见解,若脱离行业认知和公司业务背景,分 ...
- docker命令小全 this is my note.
服务器类型:linux =>centos 7.X以上版本 常用命令使用紫色加粗标明 1.安装yum-util(为配置docker安装时使用阿里镜像做准备):yum install -y yum- ...
- Httpd服务进阶知识-基于Apache Modele的LAMP架构之WordPress案例
Httpd服务进阶知识-基于Apache Modele的LAMP架构之WordPress案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装依赖包及数据库授权 博主推荐阅读 ...
- k8s创建harbor私有镜像仓库
1. 部署准备 准备harbor软件包 在部署节点上: mv harbor-offline-installer-v1.4.0.tgz /opt/ && cd /opt tar zxvf ...
- TKey SSO 单点登录系统介绍
Introduction TKey = Token Key 以 OAuth 2.0 标准为接口设计原则的单点登录系统(SSO) 初衷: 做国内各种登录场景的配件,以完善的学习资料为主核心竞争力 纯粹的 ...
- 100% 成功率的 offer 收割机是怎样练成的?
都说今年的形势不好,各种找工作不顺利,但我身边就有一位同学,每次面试都拿到offer,我特意邀请他来给大家分享下经验,虽然不同人的技术领域未必相同,但很多东西是相通的,希望本文能对大家有所帮助. 下面 ...
- 锤子手机做appium自动化测试时,运行脚本总是弹出警告框的问题
当运行脚本的时候,总是提示若干个如上提示框,必须点击同意才能进行下一步:解决方案: 在设置,全局高级设置,开发者选项中打开“总是允许USB安装应用”即可解决:
- httprunner学习11-辅助函数debugtalk.py
前言 在httprunner里面,每个 YAML / JSON 文件的脚本都是独立运行的,有时候我们希望能跨文件使用公用的参数. 比如登录生成一个token,后面的用例都可以去引用这个token值,或 ...
- ArcGIS 生成等值线图
1.打开ArcCatalog,准备工作(1)菜单:Customize -> Extensions...,在打开的对话框中把里面的东西都勾上.实际要用的应该是GeoStatistical Anal ...
- python应用-21根火柴游戏
""" 21跟火柴 """ from random import randint def main(): total=21 while to ...