Spring注解配置(1)——@Autowired

@Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法。在使用@Autowired之前,我们对一个bean配置起属性时,是这样用的

<property name="属性名" value=" 属性值"/>    

通过这种方式来,配置比较繁琐,而且代码比较多。在Spring 2.5 引入了 @Autowired 注释

下面用案例来具体说明

UserRepository.java

1 package com.proc.bean.repository;
2
3 public interface UserRepository {
4
5     void save();
6 }

这里定义了一个UserRepository接口,其中定义了一个save方法

UserRepositoryImps.java

 1 package com.proc.bean.repository;
 2
 3 import org.springframework.stereotype.Repository;
 4
 5 @Repository("userRepository")
 6 public class UserRepositoryImps implements UserRepository{
 7
 8     @Override
 9     public void save() {
10         System.out.println("UserRepositoryImps save");
11     }
12 }

定义一个UserRepository接口的实现类,并实现save方法,在这里指定了该bean在IoC中标识符名称为userRepository

UserService.java

 1 package com.proc.bean.service;
 2
 3 import org.springframework.beans.factory.annotation.Autowired;
 4 import org.springframework.stereotype.Service;
 5
 6 import com.proc.bean.repository.UserRepository;
 7
 8 @Service
 9 public class UserService {
10
11     @Autowired
12     private UserRepository userRepository;
13
14     public void save(){
15         userRepository.save();
16     }
17 }

这里需要一个UserRepository类型的属性,通过@Autowired自动装配方式,从IoC容器中去查找到,并返回给该属性

applicationContext.xml配置

<context:component-scan base-package="com.proc.bean" />

测试代码:

1 ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
2
3 UserService userService=(UserService) ctx.getBean("userService");
4 userService.save();

输出结果:UserRepositoryImps save

那么使用@Autowired的原理是什么?

  其实在启动spring IoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性

 <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>  

  

 注意事项:

  在使用@Autowired时,首先在容器中查询对应类型的bean

    如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据

    如果查询的结果不止一个,那么@Autowired会根据名称来查找。

    如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false

举例说明:

在上面例子中,我们在定一个类来实现UserRepository接口

package com.proc.bean.repository;

import org.springframework.stereotype.Repository;

@Repository
public class UserJdbcImps implements UserRepository {

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

  这时在启动容器后,在容器中有两个UserRepository类型的实例,一个名称为userRepository,另一个为userJdbcImps。在UserService中

@Autowired
private UserRepository userRepository;

  输出结果:UserRepositoryImps save

  这里由于查询到有两个该类型的实例,那么采用名称匹配方式,在容器中查找名称为userRepository的实例,并自动装配给该参数。

  如果这里想要装载userJdbcImps的实例,除了将字段userRepository名称改成userJdbcImps外,可以提供了一个@Qualifier标记,来指定需要装配bean的名称,代码这样写

1 @Autowired
2 @Qualifier("userJdbcImps")
3 private UserRepository userRepository;

输出结果:UserJdbcImps save

原文地址:https://www.cnblogs.com/fengshine/p/10416801.html

时间: 2024-10-11 01:10:18

Spring注解配置(1)——@Autowired的相关文章

spring注解配置quartz

常规配置quartz可以参考我的另外一篇博文:http://www.cnblogs.com/yangzhilong/p/3349116.html spring配置文件里增加: 命令空间: http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd 配置: <task:annotation-driven/> 当然这还需要扫描注解等常规配置. ja

spring注解配置quartz应用

项目中会经常用到定时器,因此,其quartz的使用,我们必须要掌握.下面就以例子来讲解如何在spring中整合quartz, 使用注解配置的方式来实现定时执行任务. 一.引入jar包 项目中需引入quartz的jar包,由于整合到spring中,肯定也引入了spring的相关jar包. 例子中引用的是quartz-2.1.1版本,使用maven管理项目,pom文件需引入quartz依赖 二.spring配置文件中配置 (applicationContext.xml) 1)      xmlns和

关于Spring注解配置的步骤

今天分享一下 关于Spring注解配置的流程 1 导包:如下图所示 2 书写User和Car类  代码如下 package cn.lijun.bean; public class Car { private String name; private String color; public String getName() { return name; } public void setName(String name) { this.name = name; } public String g

0808 Spring 注解配置

 summarize 注解配置将替换手动 Spring 注解配置 导包 配置约束 eclipse导入spring配置文件约束.可能你觉得这种配置文件网上一大堆,直接复制粘贴就搞定了,可是假如你去的是某些机密单位呢?所以多学点总归是好的!这篇文章是本人全部手工写出来的,没有盗用其他人的图片和文字信息等,转载请注明出处,谢谢! 点击window选择Preferences选项,搜索catalog 点击add 选中file System找自己下载好的spring的解压包下的schema文件夹,点进去选择

Spring -- 注解配置Bean

通过注解配置Bean 特定组件包括: @Component: 基本注解, 标识了一个受 Spring 管理的组件 @Respository: 标识持久层组件 @Service: 标识服务层(业务层)组件 @Controller: 标识表现层组件 上面的组件可以混用,因为IOC容器并无法区分当前类是否为业务.持久.还是表现层. 对于扫描到的组件, Spring 有默认的命名策略: 使用非限定类名, 第一个字母小写. 也可以在注解中通过 value 属性值标识组件的名称 使用注解配置Bean前,我们

5.spring:注解配置 Bean

在classpath中扫描组件 组键扫描:能够从classpath下自动扫描,侦测和实例化具有特定注解的组件 特定的组件包括: ->@Componment:基于注解,标识一个受Spring管理的组键 ->@Respository:标识持久层组件 ->@Service:标识服务层 ->@controller:标识表现层组件 对于扫描到的组件,Spring有默认的命名策略,使用非限定类名,第一个字母小写,也可以通过注解中value属性值标识组建的名称 在classpath中扫描组键当在

spring注解配置启动过程

最近看起spring源码,突然想知道没有web.xml的配置,spring是怎么通过一个继承于AbstractAnnotationConfigDispatcherServletInitializer的类来启动自己的.鉴于能力有限以及第一次看源码和发博客,不到之处请望谅~ 我用的IDE是IntelliJ IDEA,这个比myEclipse看源码方便一点,而且黑色背景挺喜欢.然后项目是在maven下的tomcat7插件运行.spring版本是4.3.2.RELEASE. 如果写过纯注解配置的spri

Spring 注解配置原理

声明 源码基于Spring 5.0.8 1. 简介 自从Spring Boot流行,基于注解的配置逐渐取代了XML配置.因为突然而来的兴趣从而阅读了Spring 对Configuration注解的解析流程. 2. 原理介绍 解析@Configuration的入口是ConfigurationClassPostProcessor.ConfigurationClassPostProcessor实现了BeanDefinitionRegistryPostProcessor接口,使得Spring在初始过程中

Spring注解@Resource和@Autowired区别

一.相同点: @Autowired和@Resource作用基本相同,都是用于自动装配bean对象.都可以写在字段上,或写在setter方法上. 二.不同点: 1.出处不同 @Autowired(Spring注解,org.springframework.beans.factory.annotation.Autowired) @Resource(JAVA注解,javax.annotation.Resource).适用范围广,依赖小. 2.自动装配策略不同 @Resource 默认优先名称匹配, 具体