Spring中,@Resource和@Autowired都是做bean的注入时使用。使用过程中,有时候@Resource 和 @Autowired可以替换使用;有时,则不可以。
@Resource和@Autowired都可以作为注入属性的修饰,在接口仅有单一实现类时,两个注解的修饰效果相同,可以互相替换,不影响使用。
@Resource是Java自己具有的注解,@Resource有两个属性是比较重要的,分是name和type;
Spring将@Resource注解的name属性解析为bean的名字,
而type属性则解析为bean的类型(即class的全路径,如com.tulun.Bean.User)。
所以如果使用name属性,则使用byName的自动注入策略(即通过名称找到类,然后再注入到属性里),
而使用type属性时则使用byType自动注入策略。
如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Autowired是spring提供的注解,是spring2.5版本引入的,Autowired只根据type进行注入,不会去匹配name。
如果涉及到type无法辨别注入对象(;例如接口有多个实现类)时,那需要依赖@Qualifier或@Primary注解一起来修饰。
在创建的bean文件夹下的类头添加@Component,声明bean的id、并提供set、get、toString方法
package com.tulun.bean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("book")
public class Book {
@Value("4")
private Integer id;
@Value("书名")
private String name;
@Value("描述")
private String desc;//描述
@Override
public String toString() {
return "Book{" +
"id=" + id +
", name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Book(Integer id, String name, String desc) {
this.id = id;
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public Book() {
}
}
对基本数据类型赋值使用@Value("。。。")
自定义类型使用 @Resource(name="。。。") //bean里的id
package com.tulun.bean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
//是单例模式
@Component("user")//注解中user 等价于 applicationcontext.XML配置形式中bean里的 id属性
public class User {
@Value("3")
private Integer id;
@Value("基础班3")
private String name;
@Resource(name="book") //bean里的id
private Book book;//依赖
// 注入集合类型
private Map<String ,String> map; //map 类型属性
//1、数组类型属性
private String[] courses;
//2、list集合类型属性
private List<String> list;
//4、set集合类型属性
private Set<String> sets;
//有参构造函数 new User(12,"zhangsan")
public User(Integer id, String name, Book book) {
this.id = id;
this.name = name;
this.book = book;
}
//setter方法注入
public User(Integer id, String name) {
this.id = id;
this.name = name;
}
public String[] getCourses() {
return courses;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", book=" + book +
", map=" + map +
", courses=" + Arrays.toString(courses) +
", list=" + list +
", sets=" + sets +
'}';
}
public void setCourses(String[] courses) {
this.courses = courses;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Set<String> getSets() {
return sets;
}
public void setSets(Set<String> sets) {
this.sets = sets;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
// 如果指定了有参构造函数,(就不会生成默认的无参构造函数,xml里通过 无参 构造函数实例化就会报错),
public User() {
}
public Integer getId() {
return id;
}
public String getName() {
return name;
}
public Book getBook() {
return book;
}
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setBook(Book book) {
this.book = book;
}
}
在配置文件里开启注解扫描
<?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/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!--开启 扫描 注解: 指定的包 路径下的类,会扫描的到类的方法,属性上-->
<context:component-scan
base-package="com.tulun.bean"/>
<!--只 扫描 类中 属性 的注解(不建议使用)-->
<!--<context:annotation-config></context:annotation-config>-->
</beans>
在主函数里测试生成对象
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("springconfig.xml");//注解形式获取
User user3 = (User) applicationContext.getBean("user");
System.out.println(user3);
输出:
User{id=3, name='基础班3', book=Book{id=4, name='书名', desc='描述'}