1. 程式人生 > >Spring中Bean的自動裝配之@Resource、@Inject

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規範

 *       * AutowiredAnnotationBeanPostProcessor:解析完成自動裝配功能;     

綜上:

一、@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的功能;