小编这次要给大家分享的是浅谈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.stereotype.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。
看完这篇关于浅谈Springboot中Autowried及Resouce的文章,如果觉得文章内容写得不错的话,可以把它分享出去给更多人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。