Springboot Autowried及Resouce使用对比解析

网友投稿 599 2023-05-27

Springboot Autowried及Resouce使用对比解析

Springboot Autowried及Resouce使用对比解析

在做项目时,发现项目中 加载类时,有的地方使用@Autowired,有的地方使用@Resource

在网上搜集了资料

共同点

@Resource和@Autowired都可以作为注入属性的修饰,在接口仅有单一实现类时,两个注解的修饰效果相同,可以互相替换,不影响使用。

不同点

@Resource是java自己的注解,@Resource有两个属性是比较重要的,分是name和type;Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。

@Autowired是spring的注解,是spring2.5版本引入的,Autowired只根据type进行注入,不会去匹配name。如果涉及到type无法辨别注入对象时,那需要依赖@Qualifier或@Primary注解一起来修饰。

写列子

新建 HumanService.java类

package com.komiles.study.service;

/**

* @author komiles@163.com

* @date 2020-03-23 11:46

*/

public interface HumanService {

/**

* 跑马拉松

* @return

*/

String runMarathon();

}

实现类 ManServiceImpl.java

package com.komiles.study.service.impl;

import com.komiles.study.service.HumanService;

import org.springframework.stereotype.Component;

import org.springframework.stereotype.Service;

/**

* @author komiles@163.com

* @date 2020-03-23 11:48

*/

@Service

public class ManServiceImpl implements HumanService {

/**

* 跑马拉松

*/

@Override

public String runMarathon() {

return " A man run marathon";

}

}

新建HumanController.java

package com.komiles.study.controller;

import com.komiles.study.service.HumanService;

import com.komiles.study.service.impl.ManServiceImpl;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

/**

* @author komiles@163.com

* @date 2020-03-23 11:49

*/

@RestController

@RequestMapping("/human")

public class HumanController {

@Autowired

private HumanService humanService;

@GetMapping("/run")

public String runMarathon()

{

return humanService.runMarathon();

}

}

运行程序

输出内容为: man run marathon

把controller里的 @Autowired 改成@Resource 也能正常访问。

假如我写多个实现类会怎么样呢?

新建一个 WomanServiceImpl.java

package com.komiles.study.service.impl;

import com.komiles.study.service.HumanService;

import org.springframework.context.annotation.Primary;

import org.springframework.stereotype.Component;

import org.springframework.sthttp://ereotype.Service;

/**

* @author komiles@163.com

* @date 2020-03-23 12:01

*/

@Service

public class WomanServiceImpl implements HumanService {

/**

* 跑马拉松

*/

@Override

public String runMarathon() {

return "A Woman run marathon";

}

}

运行程序,发现报错了,因为有两个实现类,程序不知道找那个了

怎么办呢?

有两种办法

第一种,在实现类中给类起名字,在引入的时候直接引入名字。

例如:在ManServiceImpl.java类,@Service上加值。@Service(value = "manService") 或者 @Component(value = "manService")

package com.komiles.study.service.impl;

import com.komiles.study.service.HumanService;

import org.springframework.stereotype.Component;

import org.springframework.stereotype.Service;

/**

* @author komiles@163.com

* @date 2020-03-23 11:48

*/

@Service(value = "manService")

//@Component(value = "manService")

public class ManServiceImpl implements HumanService {

/**

* 跑马拉松

*/

@Override

public String runMarathon() {

return " A man run marathon";

}

}

在Controller类中使用时,也需要制定一下名字。

如果使用@Resource 需要加上 @Resource(name="manService")

如果使用@Autowired 需要使用@Qualifier(value="manService")

package com.komiles.study.controller;

import com.komiles.study.service.HumanService;

import com.komiles.study.service.impl.ManServiceImpl;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

/**

* @author komiles@163.com

* @date 2020-03-23 11:49

*/

@RestController

@RequestMapping("/human")

public class HumanController {

@Autowired

@Qualifier(value = "manService")

// @Resource(name="manService")

private HumanService humanService;

@GetMapping("/run")

public String runMarathon()

{

return humanService.runMarathon();

}

}

如果想优先引用某一个类,可以在实现类上使用 @Primary。

项目代码:

https://github.com/KoMiles/springboot/blob/master/src/main/java/com/komiles/study/controller/HumanController.java

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:投资者修炼三部曲(一)—— 投资量化
下一篇:摩根大通技术负责人揭秘:摩根区块链布局全过程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~