关于spring的几种注入方式

理解类之间的关联关系

一,set注入

在这之前我们得spring的jar包,可以去官网下,添加到WebContent下 WEB-INF 下 lib里

这种方式就得首先实现set方法,现在以英雄(Hero接口)和武器(weapon)为例讲解

第一步,首先我们创建两个接口

英雄接口

package com.inter;public interface Hero {void fight();
}

武器接口


package com.inter;public interface Weapon {void attack();
}

第二步,然后我们建立两个实现类吕布(Lvbu)实现Hero接口,方天画戟(FangTianHuaJi)实现Weapon


package com.test;import com.inter.Hero;
import com.inter.Weapon;public class Lvbu implements Hero{Weapon weapon;public Weapon getWeapon() {return weapon;}//shipublic void setWeapon(Weapon weapon) {this.weapon = weapon;}@Overridepublic void fight() {System.out.println("吕布拿起武器");weapon.attack();}}

package com.test;import com.inter.Weapon;public class FangTianHuaJi implements Weapon {@Overridepublic void attack() {// TODO Auto-generated method stubSystem.out.println("方天画戟卡卡砍");}}

再来一个武器青龙偃月刀


package com.test;import com.inter.Weapon;public class Qing implements Weapon{@Overridepublic void attack() {// TODO Auto-generated method stubSystem.out.println("青龙偃月杀杀");}}

第三步,我们得创建一个配置文件spring.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/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">  <bean id="lvbu" class="com.test.Lvbu"><!-- set注入 --><property name="weapn" ref="fang"></property></bean><bean id="fang" class="com.test.FangTianHuaJi"></bean></beans>

第四步,建立一个测试main


package com.test;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.inter.Hero;
import com.inter.Performer;public class Test {public static void main(String[] args) {// TODO Auto-generated method stub//获取配置文件ApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");//得到英雄类Hero per=(Hero)context.getBean("lvbu");per.fight();    }
}

结果

二,自动装配autowire

byName,当我们的吕布有两个属性的时候,也就是说他有两把武器的时候,我们还是这样写,就会报错。将FangTianHuaJi类的id去了一个和lvbu类的属性weapon一样的名字,并且在lvbu bean中添加了autowire="byName"用于指明装配类型是byName自动装配。这个时候lvbu bean就是在上下文中找名为weapon的bean装配到他自己的weapon属性中。

byType,这里已经不用关注FangTianHuaJi类对应的bean的id是什么了,因为已经定义lvbu bean的autowire属性为"byType"。这个时候lvbu bean会在上下文中寻找和weapon具有相同类型的类对应的bean。这里两把刀是相同的属性,所以还这样写就会报错

一种方法是将其中一个bean的primary属性设为false,比如:将青龙偃月Qing bean的primary属性设为true,那么吕布的武器就变成青龙偃月刀了

三,使用注解 @Autowired 自动装配

通过基于注解的方式,可以不用在xml文件中为guanyu bean添加autowire属性了,但是注意加启动注解标签

spring.xml


<!-- 当我们使用注解时需要启动注解 --><context:annotation-config /><bean id="lvbu" class="com.test.Lvbu" ></bean><bean id="weapon" class="com.test.FangTianHuaJi" ></bean>

还有要在吕布的武器属性上加@Autowired,表明注解自动注入


package com.test;import org.springframework.beans.factory.annotation.Autowired;import com.inter.Hero;
import com.inter.Weapon;public class Lvbu implements Hero{//需要在属性头上添加注解@AutowiredWeapon weapon;public Weapon getWeapon() {return weapon;}//set注入,时必须写public void setWeapon(Weapon weapon) {this.weapon = weapon;}@Overridepublic void fight() {System.out.println("吕布拿起武器");weapon.attack();}
}

注意这里我们和上面一样,我们有两个同类型的武器时,我们还是要做区分,添加@Qualifier注解

xml添加

<!-- 当我们使用注解时需要启动注解 --><context:annotation-config /><bean id="lvbu" class="com.test.Lvbu" ></bean><bean id="fang" class="com.test.FangTianHuaJi" ><qualifier value="weaponoflvbu"></qualifier></bean><bean id="qing" class="com.test.Qing"></bean>

这里的吕布武器也要添加@Qualifier注解


package com.test;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;import com.inter.Hero;
import com.inter.Weapon;public class Lvbu implements Hero{//需要在属性头上添加注解@Autowired//要和配置的对应@Qualifier("weaponoflvbu")Weapon weapon;public Weapon getWeapon() {return weapon;}//set注入,时必须写public void setWeapon(Weapon weapon) {this.weapon = weapon;}@Overridepublic void fight() {System.out.println("吕布拿起武器");weapon.attack();}}

也可以更简单的写,直接在@Qalifier();里加id

<!-- 当我们使用注解时需要启动注解 --><context:annotation-config /><bean id="lvbu" class="com.test.Lvbu" ></bean><bean id="fang" class="com.test.FangTianHuaJi" ></bean><bean id="qing" class="com.test.Qing"></bean>

四,spring的自动检测

context:component-scan元素会扫描指定的包以及所有子包,并查找出能够自动注册为Spring Bean的类。base-package属性标示了context:component-scan元素所扫描的包。

为自动检测标注Bean

默认情况下,context:component-scan查找使用构造型(stereotype)注解所标注的类,这些特殊的注解如下:

类型 说明
@component 通用的构造型注解,标示该类为Spring 组件。
@Controller 标识将该类定义为Spring MVC controller。
@Repository 标识将该类定义为数据仓库(例如:Dao层)。
@Service 标识将该类定义为服务(例如:Service层)。

这里我们就是普通的写,所以就使用@component ,其实这几个注解都可以用,只是我们感觉其他的不合适

xml配置

 <context:component-scan base-package="com.test"></context:component-scan> <bean id="lvbu" class="com.test.Lvbu" ></bean><!-- 用注解对应了就不用写bean了 -->

package com.test;import org.springframework.stereotype.Component;import com.inter.Weapon;//属于吕布的武器
@Component("weaponOflvbu")
public class FangTianHuaJi implements Weapon {@Overridepublic void attack() {// TODO Auto-generated method stubSystem.out.println("方天画戟卡卡砍");}}
package com.test;import org.springframework.stereotype.Component;import com.inter.Weapon;//属于关羽 的武器
@Component("weaponOfguanyu")
public class Qing implements Weapon{@Overridepublic void attack() {// TODO Auto-generated method stubSystem.out.println("青龙偃月杀杀");}}
package com.test;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;import com.inter.Hero;
import com.inter.Weapon;public class Lvbu implements Hero{//需要在属性头上添加注解@Autowired//要和配置的对应,如果一个接口只对应一个实现类的话就都不用写qualifier@Qualifier("weaponOflvbu")Weapon weapon;public Weapon getWeapon() {return weapon;}//set注入,时必须写public void setWeapon(Weapon weapon) {this.weapon = weapon;}@Overridepublic void fight() {System.out.println("吕布拿起武器");weapon.attack();}}

如果一个接口只对应一个实现类的话就都不用写qualifier,一般别人写项目的时候都是一个接口对应一个实现类,所以一般都看不到qualifier

转载于:https://www.cnblogs.com/liu-ya/p/9577774.html

spring的基本用法相关推荐

  1. Spring 异步@Async注解用法 Spring @Async注解用法总结 Spring @Async基本用法示例

    Spring 异步@Async注解用法 Spring @Async注解用法总结 Spring @Async基本用法示例 一.概述 在日常开发的工作中,经常会使用异步进行开发.Spring 提供一个简单 ...

  2. Spring中@Value用法收集

    一.配置方式 @Value需要参数,这里参数可以是两种形式: @Value("#{configProperties['t1.msgname']}") 或者 @Value(" ...

  3. Spring中@Async用法总结

    转载自 https://blog.csdn.net/blueheart20/article/details/44648667 引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的 ...

  4. spring中@Autowired用法

    @Autowired注解是Spring中非常重要且常见的,接下来就简要的介绍一下它的用法. @Autowired默认是通过set方法,按照类型自动装配JavaBean,set方法可省略不写,它主要是修 ...

  5. Spring 定时任务@Scheduled用法

    基本用法 @Scheduled 由Spring定义,用于将方法设置为调度任务.如:方法每隔十秒钟被执行.方法在固定时间点被执行等 1. @Scheduled(fixedDelay = 1000)    ...

  6. 【Spring学习】spring依赖注入用法总结

    顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.Service.Controller.Repository.Componen ...

  7. 补习系列(22)-全面解读 Spring Profile 的用法

    目录 一.简介 二. 区分Bean对象 三. 设置Profile 3.1 WebApplicationInitializer接口 3.2 通过 web.xml定义 3.3 JVM启动参数 3.4 环境 ...

  8. 7 -- Spring的基本用法 -- 6... Spring 3.0 提供的Java配置管理

    7.6 Spring 3.0 提供的Java配置管理 Spring 允许使用Java类进行配置管理,可以不使用XML来管理Bean,以及Bean之间的依赖关系. Interface :Person p ...

  9. Spring的基础用法

    前言 上面的目录内容本文章不一定都会写到,本次的文章将非常简略,主写主要内容,次要内容需要读者有一定的学习基础才可以看懂以及掌握,本文章比较偏向于理论复习,注意是理论,本文章代码不多,代码比较多的是高 ...

最新文章

  1. [微信小程序]给data的对象的属性赋值
  2. 安装SecureCRT
  3. HashTable, HashMap, LinkedHashMap, ConcurrentHashMap
  4. ActiveMQ入门实例
  5. docker容器构建_我如何容器化构建系统
  6. [Android 泥水匠] Android基础 之一:浅谈Android架构到HelloWorld案例的剖析
  7. TensorFlow strides 参数讨论
  8. Centos7.2下安装redis通用键值命令
  9. 第四回. 实数系的性质
  10. C语言实现的简易FTP客户端
  11. 计算机开机跳过硬盘检查,怎样取消电脑开机磁盘自检 关闭硬盘自检方法全析...
  12. 班章管家分享五一假日什么理财产品会有收益?五一假日理财攻略
  13. Lipschitz条件
  14. 评联想收购IBM PC
  15. 王道计算机组成原理课代表 - 考研计算机 第六章 总线 究极精华总结笔记
  16. 通过路由器连接JetsonNano与地面站
  17. oracle与u8比较,看网友的用友U8、金蝶K3、SAP、Oracle几大模块比较
  18. 输出指定要求的回文日期与字符串拼接
  19. 国内oschina Maven公共仓库
  20. RedHat 7.8下Redis安装和配置

热门文章

  1. vue使用better-scroll实现下拉刷新、上拉加载
  2. Saltstack_使用指南17_salt-ssh
  3. C++const的多种用法
  4. pycharm的安装
  5. Windows消息队列一
  6. asp.net记录错误日志的方法
  7. java初学者笔记总结day6
  8. python 竖线 绘图_Python可视化 | Seaborn5分钟入门(二)——barplot countplot
  9. 支付宝回调接口验签失败
  10. CentOS7 3.项目持续交付脚本