Spring中Bean的自動裝配之@Resource、@Inject
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規範
綜上:
一、@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;
}
}
4、測試獲得的物件是哪個
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);
}
}
結果:
說明:@Autowired預設是按照元件名稱進行裝配的; 但不支援@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的功能;