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:解析完成自动装配功能;     

综上:项目中推荐使用@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的功能;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值