博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring的基本用法
阅读量:5126 次
发布时间:2019-06-13

本文共 5310 字,大约阅读时间需要 17 分钟。

关于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;    }    //shi    public void setWeapon(Weapon weapon) {        this.weapon = weapon;    }    @Override    public void fight() {        System.out.println("吕布拿起武器");        weapon.attack();    }}
package com.test;import com.inter.Weapon;public class FangTianHuaJi implements Weapon {    @Override    public void attack() {        // TODO Auto-generated method stub       System.out.println("方天画戟卡卡砍");    }}

再来一个武器青龙偃月刀

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

第三步,我们得创建一个配置文件spring.xml

第四步,建立一个测试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

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

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

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

xml添加

这里的吕布武器也要添加@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;    }    @Override    public void fight() {        System.out.println("吕布拿起武器");        weapon.attack();    }}

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

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配置

package com.test;import org.springframework.stereotype.Component;import com.inter.Weapon;//属于吕布的武器@Component("weaponOflvbu")public class FangTianHuaJi implements Weapon {    @Override    public void attack() {        // TODO Auto-generated method stub       System.out.println("方天画戟卡卡砍");    }}
package com.test;import org.springframework.stereotype.Component;import com.inter.Weapon;//属于关羽 的武器@Component("weaponOfguanyu")public class Qing implements Weapon{    @Override    public void attack() {        // TODO Auto-generated method stub        System.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;    }    @Override    public void fight() {        System.out.println("吕布拿起武器");        weapon.attack();    }}

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

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

你可能感兴趣的文章
autopep8
查看>>
GIT在Linux上的安装和使用简介
查看>>
基于C#编程语言的Mysql常用操作
查看>>
s3c2440实验---定时器
查看>>
MyEclipse10安装SVN插件
查看>>
[转]: 视图和表的区别和联系
查看>>
Regular Experssion
查看>>
图论例题1——NOIP2015信息传递
查看>>
CocoaPods的安装和使用那些事(Xcode 7.2,iOS 9.2,Swift)
查看>>
Android 官方新手指导教程
查看>>
幸运转盘v1.0 【附视频】我的Android原创处女作,请支持!
查看>>
UseIIS
查看>>
集合体系
查看>>
vi命令提示:Terminal too wide
查看>>
引用 移植Linux到s3c2410上
查看>>
MySQL5.7开多实例指导
查看>>
[51nod] 1199 Money out of Thin Air #线段树+DFS序
查看>>
Red and Black(poj-1979)
查看>>
分布式锁的思路以及实现分析
查看>>
腾讯元对象存储之文件删除
查看>>