spring的基本用法

关于spring的几种注入方式

理解类之间的关联关系

一,set注入

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

1345586-20180903102725839-1217853258.png

这种方式就得首先实现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();    }
}

结果

1345586-20180903102701729-1059507850.png

二,自动装配autowire

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

1345586-20180903105615633-357317078.png

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

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

1345586-20180903111104395-1467804116.png

三,使用注解 @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>

1345586-20180903113546315-527784381.png

四,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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux下anaconda3安装教程,Ubuntu18.04 安装 Anaconda3的教程详解

Anaconda指的是一个开源的Python发行版本&#xff0c;其包含了conda、Python等180多个科学包及其依赖项。 因为包含了大量的科学包&#xff0c;Anaconda 的下载文件比较大(约 531 MB)&#xff0c;如果只需要某些包&#xff0c;或者需要节省带宽或存储空间&#xff0c;也可以使用…

实例14:python

#将一个正整数分解质因数。例如&#xff1a;输入90,打印出90233*5。 #对n进行分解质因数&#xff0c;应先找到一个最小的质数k&#xff0c;然后按下述步骤完成&#xff1a; #(1)如果这个质数恰等于n&#xff0c;则说明分解质因数的过程已经结束&#xff0c;打印出即可。 #(2)如…

call,apply,bind的用法与区别

1.call/apply/bind方法的来源 首先&#xff0c;在使用call&#xff0c;apply&#xff0c;bind方法时&#xff0c;我们有必要知道这三个方法究竟是来自哪里&#xff1f;为什么可以使用的到这三个方法&#xff1f; call&#xff0c;apply&#xff0c;bind这三个方法其实都是继承自…

幅值与峰峰值的计算_电厂振动测量、计算基础及汽轮机组振动标准!

法律顾问&#xff1a;张友全律师正文&#xff1a;电厂振动测量、计算基础及汽轮机组振动标准&#xff01;1. 常用的振动测量参数常用的振动测量参数有振幅、振动速度(振速)、振动加速度。对应单位表示为&#xff1a;mm、mm/s、mm/s。 振幅是表象&#xff0c;定义为在波动或振动…

实例15:python

#利用条件运算符的嵌套来完成此题&#xff1a;学习成绩>90分的同学用A表示&#xff0c;60-89分之间的用B表示&#xff0c;60分以下的用C表示。 #!/usr/bin/python -- coding: UTF-8 -- score int(input(‘输入分数:\n’)) if score > 90: grade ‘A’ elif score &g…

对比分析

【课程1.3】 对比分析对比分析 → 两个互相联系的指标进行比较绝对数比较&#xff08;相减&#xff09; / 相对数比较&#xff08;相除&#xff09; 结构分析、比例分析、空间比较分析、动态对比分析 import numpy as np import pandas as pd import matplotlib.pyplot as plt…

平面设计中的网格系统pdf_深入浅出,带你认识网格系统与版式设计

设计分享 研习设 设计Hello大家好&#xff0c;这里是研习设计分享。时不时分享/新鲜/有趣/有料/设计资讯和案例&#xff0c;欢迎大家订阅关注&#xff01;~预估阅读时间&#xff1a;10分钟ME研习设小研研&#xff1a;今天&#xff0c;和大家深入浅出&#xff0c;带你认识网格系…

实例16:python

#输出指定格式的日期。 import time print(time.time()) print(time.localtime()) print(time.asctime()) print(time.strftime(’%Y-%m-%d %H:%M:%S’,time.localtime())) import datetime print(datetime.date.today()) print(datetime.date.today().strftime(’%d/%m/%Y’…

cad直线和圆弧倒角不相切_曲线操作-直线,圆弧,圆,倒斜角

直线该命令用于创建直线段。执行直线命令&#xff0c;主要有以下两种方式。菜单:选择“菜单”“捕入”一“曲线” 一“直线” 命令。功能区:单击“曲线”选项卡“曲线” 组中的“直线”按钮。执行上述操作后&#xff0c;系统打开如图4.13 所示的“直线”对话框。“直线”对话框…

WPF vs2015,vs2012 添加ArcObjects SDK

一&#xff1a;如果是vs2015&#xff0c;找到注册表中HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0\下面的这两个&#xff0c;并且将名称和数据记下来。如图&#xff1a; &#xff08;如果是vs2012,只添加InstallDir及其数据值就行了。&#xff09; 二…

实例17:python

#输入一行字符&#xff0c;分别统计出其中英文字母、空格、数字和其它字符的个数。 #!/usr/bin/python3 a input(‘请输入一串字符:’) 英文 0 空格 0 数字 0 其他 0 for i in a: if i.isalpha(): 英文 1 elif i.isspace(): 空格 1 elif i.isnumeric(): 数字 1 else: 其他…

bow 折叠键盘 linux,bow便携折叠蓝牙键盘体验

bow便携折叠蓝牙键盘体验2019-10-07 02:29:3913点赞8收藏0评论买了个键盘 bow的hb188似乎对蓝牙键盘一直以来都有一种执念&#xff0c;自从想要写点什么东西的想法在脑子里面生根发芽之后&#xff0c;一直都在找一种相对来讲比较便携的键盘。一开始的时候想买苹果的原装键盘&am…

admin——django自带数据库管理工具

admin是Django自带的数据库管理工具&#xff0c;是一个app 在admin.py中可以自己定制类来使admin数据库管理页面展现自己想要查看的信息 models.py from django.db import models# Create your models here.class Book(models.Model):title models.CharField(max_length32)pri…

remote addr 取到内网ip_内网穿透工具frp

前言渗透渗透中面对的大部分目标除了暴露在互联网的部分&#xff0c;还有隐藏在内网的大量资产&#xff0c;这部分资产往往无法联通外网&#xff0c;很少暴露在攻击者面前&#xff0c;与此同时安全一般也没有外部资产做的全面 。如果我们从某一外部互联网入口成功进入了内网&am…

实例18:python

#题目&#xff1a;求saaaaaaaaaaaa…a的值&#xff0c;其中a是一个数字。例如222222222222222(此时共有5个数相加)&#xff0c;几个数相加由键盘控制。 #!/usr/bin/env python3 -- coding: utf-8 -- n int(input(n )) a int(input(a )) sum 0 total 0 for i in range(…

AQS是什么?

AQS介绍AQS&#xff0c;即AbstractQueuedSynchronizer, 队列同步器&#xff0c;它是Java并发用来构建锁和其他同步组件的基础框架。来看下同步组件对AQS的使用&#xff1a;AQS是一个抽象类&#xff0c;主是是以继承的方式使用。AQS本身是没有实现任何同步接口的&#xff0c;它仅…

实例19:python

#题目&#xff1a;一个数如果恰好等于它的因子之和&#xff0c;这个数就称为"完数"。 #例如61&#xff0b;2&#xff0b;3.编程找出1000以内的所有完数。 #!/usr/bin/python3 list2 [] for x in range(1, 1001): list1 [] for i in range(1, int(x / 2) 1): if x…

实例20:python

#题目&#xff1a;一球从100米高度自由落下&#xff0c;每次落地后反跳回原高度的一半&#xff1b;再落下 #&#xff0c;求它在第10次落地时&#xff0c;共经过多少米&#xff1f;第10次反弹多高&#xff1f; #!/usr/bin/python -- coding: UTF-8 -- tour [] height [] h…

圆弧齿轮啮合原理_图解八种齿轮的加工原理

齿形有多种形式&#xff0c;其中以渐开线齿形最为常见。渐开线齿形常用的加工方法有两大类&#xff0c;即成形法和展成法。1铣齿采用盘形模数铣刀或指状铣刀铣齿属于成形法加工&#xff0c;铣刀刀齿截面形状与齿轮齿间形状相对应。2成形磨齿也属于成形法加工&#xff0c;成形砂…

单片机c语言1602怎么接线,lcd1602中文资料分享:lcd1602接线图_lcd1602与单片机连接图 - 全文...

lcd1602液晶屏在很懂工业产品上都有应用&#xff0c;LCD1602能够能够同时显示32个字符&#xff0c;价格便宜&#xff0c;编程简单而且稳定可靠。lcd1602液晶屏是一种图形点阵显示器&#xff0c;显示原理简单易懂&#xff0c;都是液晶屏内部的液晶材料变化而显示不同的字符&…