注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解包含:Autowrired/Resource/Qualifier/Service/Controller/Repository/Component。

  1. Autowired:自动注入,自动从spring的上下文找到合适的bean来注入;
  2. Resource:用来指定bean名称注入;
  3. Qualifier和Autowired配合使用:指定bean的名称来注入;
  4. Service、Contoller、Repository分别标记类:Service层类、Contoller层类、数据层存储层的类,Spring扫描注解配置时,会标记这些类要生成bean;
  5. 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自动注入的实现方式的更多相关文章

  1. Quartz与Spring集成 Job如何自动注入Spring容器托管的对象

    在Spring中使用Quartz有两种方式实现:第一种是任务类继承QuartzJobBean,第二种则是在配置文件里定义任务类和要执行的方法,类和方法可以是普通类.很显然,第二种方式远比第一种方式来的 ...

  2. spring练习,使用Eclipse搭建的Spring开发环境,属性注入通过构造方法方式实现,模拟用户的正常登录。

    相关 知识 >>> 相关 练习 >>> 实现要求: 使用Eclipse搭建的Spring开发环境,属性注入通过构造方法方式实现,模拟用户的正常登录.要求如下: 通过 ...

  3. Spring框架使用ByName自动注入同名问题剖析

    问题描述   我们在使用spring框架进行项目开发的时候,为了配置Bean的方便经常会使用到Spring当中的Autosire机制,Autowire根据注入规则的不同又可以分为==ByName==和 ...

  4. spring mvc:属性无法自动注入

    在使用spring mvc 3开发一个项目模块时,遇到这样一个奇怪的问题: 前端页面发送的请求中,所有参数都无法自动注入到指定的@ModelAttribute对象中,经过检查,参数名称与接受对象的属性 ...

  5. spring boot测试类自动注入service或dao

    使用Spring Boot进行单元测试时,发现使用@Autowired注解的类无法自动注入,当使用这个类的实例的时候,报出NullPointerException,即空指针异常. Spring Boo ...

  6. Spring Boot @Autowired 没法自动注入的问题

    Application 启动类: @SpringBootApplication @EnableConfigurationProperties @ComponentScan(basePackages = ...

  7. Spring学习(十三)-----Spring 表达式语言(Spring EL)

    本篇讲述了Spring Expression Language —— 即Spring3中功能丰富强大的表达式语言,简称SpEL.SpEL是类似于OGNL和JSF EL的表达式语言,能够在运行时构建复杂 ...

  8. Spring扩展:Spring的IoC容器(注入对象的方式和编码方式)

    二.Spring的IoC容器 IoC:Inversion of Control(控制反转) DI:Dependency Injection(依赖注入) 三.依赖注入的方式 (1)构造注入 (2)set ...

  9. Spring IOC - 控制反转(依赖注入) - 创建对象的方式

    a.通过类的无参构造方法创建对象 在入门案例中就是这种方式.当用最普通的方式配饰一个<bean>时,默认就是采用类的 无参构造创建对象.在Spring容器初始化时,通过<bean&g ...

随机推荐

  1. 13、vue如何解决跨域问题

    开发环境:配置config文件夹中index.js文件: proxyTable: { '/api': { target: 'http://10.10.1.242:8245',//后端地址 // sec ...

  2. 小tips:在JS语句执行机制涉及的一种基础类型Completion

    看一个如下的例子.在函数 foo 中,使用了一组 try 语句.在 try 中有 return 语句,finally 中的内容还会执行吗? function foo(){ try{ return 0; ...

  3. Linux 下的7种文件类型

    普通文件类型 (-)Linux中最多的一种文件类型, 包括 纯文本文件(ASCII):二进制文件(binary):数据格式的文件(data);各种压缩文件.第一个属性为 [-] ,这些文件一般是用一些 ...

  4. java list map在初始化的时候添加元素

    List<String> list = new ArrayList<String>(){{ add("First Object"); add("S ...

  5. jQuery循环之each()

    /** *定义和用法:$(selector).each(function(index,element)) *each()函数会对每个匹配到的元素运行函数(返回false可终止循环). *each()函 ...

  6. 解决Android studio导航tools下没有android怎么打开DDMS工具

    因为这个功能用的人少, 新版本就去掉菜单入口了, 但这个功能并没有删除,打开方式:点开terminal ,也就是AS自带的命令行工具, 输入monitor 回车就启动了, 1.点开terminal 2 ...

  7. 【Spring Boot】Spring Boot之整合RabbitMQ并实现消息的发送和接收

    一.项目配置 1)引入maven坐标 <!--amqp--> <dependency> <groupId>org.springframework.boot</ ...

  8. RHEL6+GFS2+MYSQL高可用

    RHCS集群安装部署 组件介绍: luci: luci是一个基于web的,用来管理和配置RHCS集群,通过luci可以轻松的搭建一个功能强大的集群系统,节点主机可以使用ricci来和luci 管理段进 ...

  9. Httpd服务入门知识-Httpd服务常见配置案例之MPM( Multi-Processing Module)多路处理模块

    Httpd服务入门知识-Httpd服务常见配置案例之MPM( Multi-Processing Module)多路处理模块 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一.M ...

  10. K-th Path CodeForces - 1196F

    题目链接:https://vjudge.net/problem/CodeForces-1196F 题意:从图中找出第K短的最短路,最短路:从一个点到另一个的最短距离. 思路:题目说了,每两个点之间的边 ...