Spring Bean基于注释的定义与自动注入方法

什么是Bean

Bean是由Spring Ioc容器管理的Java对象,可以被Spring框架的其他部分引用(依赖注入)。

Bean的定义方法

Spring可以通过org.springframework.context.annotation中的四个注解对Bean进行定义,这四个注解主要区别在于定义框架中不同层的Bean:

注释修饰对象定义Bean的不同
@Bean方法,本质是修饰方法的返回值/
@Service定义服务层的Bean
@Controller定义控制层的Bean,除了注释Bean以外还为类提供控制器的相关方法
@Repository定义数据访问层的Bean,除了注释Bean以外,还为类提供处理数据访问相关异常的处理方法
@Component定义未明确层次的Bean

Bean基于注释的自动注入

Bean基于注释的自动注入主要通过@Autowired、@Resource、@Inject三种方法,其中@Autowired是Spring的注解(来源于org.springframework.beans.factory.annotation包),@Resource和@Inject是Java自己的注解(来源于javax包),在这两个java自己的注解中,@Resource是基于JSR-250的注解,@Inject是基于JSR-330的注解,两个注解实现的功能相似。Spring框架目前也完全支持基于Java的两个注解(也能够对做注解的类或方法进行扫描,并纳入IoC容器管理)。下面重点从匹配的优先顺序等方面说明三个注释的区别。

注解默认匹配顺序Package注入对象
@Autowired

By Type -> By Qualifier -> By Name

SpringField、setter、Constructor
@Resource

By Name -> By Type ->  By Qualifier

JavaxField、setter、Constructor
@InjectBy Type -> By Qualifier -> By NameJavaxField、setter、Constructor

其中三个注解的By Type、By Name和By Qualifier的形式不同:

注解By TypeBy NameBy Qualifier
@Autowired@Autowired@Autowired*@Autowired @Qualifier("namedFile")
@Resource@Resource

@Resource(name="namedFile")(name属性如果不设置,默认是类名)

@Resource

@Qualifier("namedFile")

@Inject@Inject

@Inject

@Named("namedFile")(name属性如果不设置,默认是类名)

@Inject @Qualifier("namedFile")

*注意@Autowired的By Name要保证bean的name与@Autowired所注释的类(或者setter)的name一样,如:

public interface ArbitraryDependency{
    public String toString();
}

@Component(value="autowiredFieldDependency_1")
public class ArbitraryDependency_1 implement ArbitraryDependency{

    private final String label = "Arbitrary_Dependency_1";

    @Override
    public String toString() {
        return label;
    }
}
///
@Component(value="autowiredFieldDependency_2")
public class ArbitraryDependency_2 implement ArbitraryDependency{

    private final String label = "Arbitrary_Dependency_2";

    @Override
    public String toString() {
        return label;
    }
}


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
  loader=AnnotationConfigContextLoader.class,
  classes=ApplicationContextTestAutowiredName.class)
public class FieldAutowiredNameIntegrationTest {

    @Autowired
    private ArbitraryDependency autowiredFieldDependency_1;

    @Test
    public void givenAutowired_WhenSetOnField_ThenDependencyResolved(){
        assertNotNull(autowiredFieldDependency);
        assertEquals("Arbitrary Dependency",
          autowiredFieldDependency.toString());
	}
}

这个例子中,定义了两个与autowiredFieldDependency_1类型相同的Bean,因此@Autowired默认的By Type失效,通过By Name原则进行匹配,其中autowiredFieldDependency_1的name(@Autowire修饰类的name默认是类名)与@Component的value属性一致,因此匹配成功。

  • 41
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值