Spring还支持使用@Resource(JSR250)和@Inject(JSR330)[java规范的注解]
* @Resource:
* 可以和@Autowired一样实现自动装配功能;默认是按照组件名称进行装配的;
* 没有能支持@Primary功能,没有支持@Autowired的(reqiured=false);
但可以用@Autowired(name="###")来指定到底使用哪个id的对象。
* @Inject:
* 需要导入javax.inject的包,和@Autowired的功能一样,支持@primary但没有@Autowired的required=false的功能;
* @Autowired:Spring定义的; @Resource、@Inject都是java规范
*
* AutowiredAnnotationBeanPostProcessor:解析完成自动装配功能;
综上:项目中推荐使用@Autowired,功能更全;但@Resource、@Inject是Java中的注解,如果不使用spring的情况下依然可以实现动态装配。
关于Spring支持的@Autowired参考博客:Spring中Bean的自动装配之@Autowired
一、@Resource
1、定义BookDao.java,默认lable的值为1
package com.atguigu.dao;
import org.springframework.stereotype.Repository;
//名字默认是类名首字母小写
@Repository
public class BookDao {
private String lable = "1";
public String getLable() {
return lable;
}
public void setLable(String lable) {
this.lable = lable;
}
@Override
public String toString() {
return "BookDao [lable=" + lable + "]";
}
}
2、 定义BookService.java
用@Resource标注自动装配:
package com.atguigu.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import com.atguigu.dao.BookDao;
@Service
public class BookService {
@Resource
private BookDao bookDao;
public void print(){
System.out.println(bookDao);
}
@Override
public String toString() {
return "BookService [bookDao=" + bookDao + "]";
}
}
3、定义BookController.java
package com.atguigu.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import com.atguigu.service.BookService;
@Controller
public class BookController {
@Autowired
private BookService bookService;
}
4、定义配置类
自己new一个bean,并设置lable值为2
并用@Primary表示先执行
package com.atguigu.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import com.atguigu.dao.BookDao;
@Configuration
@ComponentScan({"com.atguigu.service","com.atguigu.dao",
"com.atguigu.controller","com.atguigu.bean"})
public class MainConifgOfAutowired {
@Primary
@Bean("bookDao2")
public BookDao bookDao(){
BookDao bookDao = new BookDao();
bookDao.setLable("2");
return bookDao;
}
}
5、测试获得的对象是哪个
package com.atguigu.test;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.atguigu.config.MainConifgOfAutowired;
import com.atguigu.dao.BookDao;
import com.atguigu.service.BookService;
public class IOCTest_Autowired {
@Test
public void test01(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConifgOfAutowired.class);
BookService bookService = applicationContext.getBean(BookService.class);
System.out.println(bookService);
}
}
结果:
说明:@Resource默认是按照组件名称进行装配的;
但不支持@Primary功能,而且也不支持@Autowired的(reqiured=false)功能;
但可以用@Resource(name="###")来指定到底使用哪个id的对象,此处name为id值。
二、@Inject
Java中的注解
1、pom.xml中导入javax.inject的包
<!-- https://mvnrepository.com/artifact/javax.inject/javax.inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
2、 定义BookService.java
用@Inject标注自动装配:
package com.atguigu.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import com.atguigu.dao.BookDao;
@Service
public class BookService {
@Inject
private BookDao bookDao;
public void print(){
System.out.println(bookDao);
}
@Override
public String toString() {
return "BookService [bookDao=" + bookDao + "]";
}
}
3、依据上面的配置类和测试类,测试获得的对象是哪个
结果:
说明:和@Autowired的功能一样,支持@primary;但没有@Autowired的required=false的功能;