Spring装配Bean——通过注解装配Bean

在大多时候,我们会考虑使用注解(annotation)的方式去装配Bean。

1、使用@Component装配Bean

首先定义一下POJO,代码如下:

@Component(value = "role")
public class Role {
    @Value("1")
    private Long id;
    @Value("role_name_1")
    private String roleName;
    @Value("role_note_1")
    private String note;
}

解释一下上面的注解:

  • 注解@Component代表Spring IoC会把这个类扫描生成Bean实例,而其中的value属性代表这个类在Spring中的id,这相当于XML方式定义的Bean的id,也可以简写成@Component(“role”)。
  • 注解@Value代表的是值的注入。

现在有了这个类,但是还不能进行测试,因为Spring IoC并不知道需要去哪里扫描对象,这个时候可以使用一个Java Config 来告诉它,代码如下:

@ComponentScan
public class PojoConfig {

}

这个类十分简单,几乎没有什么逻辑

  • 包名要和上面类的包名保持一致
  • @ComponentScan代表进行扫描,默认是扫描当前包的路径,POJO的包名和它保持一致才能扫描,否则是没有的。

这样之后我们就可以进行测试:

package Juice.test;

import Juice.main.pojo.PojoConfig;
import Juice.main.pojo.Role;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class AnnotationMain {
    public static void main(String[] args){
        ApplicationContext context=new AnnotationConfigApplicationContext(PojoConfig.class);
        Role role=context.getBean(Role.class);
        System.out.println(role.getId());
    }
}

@ComponentScan存在着两个配置项:第一个是basePackages,它可以配置一个Java包的数组,Spring会根据它的配置扫描对应的包和子包,将配置好的Bean装配起来;第二个是basePackageClasses,它可以配置多个类,Spring会根据配置的类所在的包,为包和子包进行扫描装配对于配置的Bean。

2、自动装配——@Autowired

@Autowired主要是注解注入对象,关于这个问题,在注解中略微有点复杂,在大部分情况下建议使用自动装配,因为这样可以减少配置的复杂度。
下面我们来测试自动装配。

package Juice.main.service;

import Juice.main.pojo.Role;

public interface RoleService {
    public void printRoleInfo(Role role);
}

这个接口采用了Spring推荐的接口方式,这样可以更为灵活,因为这样可以将定义和实现分离,接下来是其实现类,代码如下:

package Juice.main.service.impl;

import Juice.main.pojo.Role;
import Juice.main.service.RoleService2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component("RoleService2")
public class RoleServiceImpl2 implements RoleService2 {
    @Autowired
    private Role role=null;

    public Role getRole() {
        return role;
    }

    public void setRole(Role role) {
        this.role = role;
    }

    @Override
    public void printRoleInfo() {
        System.out.println("id="+role.getId());
        System.out.println("roleName="+role.getRoleName());
        System.out.println("note="+role.getNote());
    }
}

这里的@Autowired注解,表示在Spring IoC定位所有的Bean后,这个字段需要按类型注入,这样IoC容器就会寻找资源,然后将其注入。

@Autowired出来可以配置在属性之外,还允许方法配置,常见的Bean的setting方法也可以使用它来完成注入。
在大部分情况下,我还是建议使用@Autowired注解,这是Spring IoC自动装配完成的,是的配置大幅度减少,满足约定优于配置的原则,增强程序的健壮性。

3、@Primary和@Qualifier

@Autowired注解可以完成一些自动装配的功能,并且方法十分简单,但是有时候这样的方式并不能使用。因为该注解采用的是按类型来注入对象,但是Java中接口可以有多个实现类,这样就会造成通过类型获取Bean的不唯一,从而导致Spring IoC类似于按类型的方式无法获取得到唯一的实例化类。
为了解决这一方法,才推出了@Primary和@Qualifier这两个注解。

注解@Primary
注解@Primary代表首要的,当Spring IoC通过一个接口或者抽象类注入对象时,注解@Primary会告诉Spring IoC容器,请优先使用该类注入。
但是无论如何这个接口只能解决首要性问题,而不能解决选择性的问题,简而言之,他不能选择使用接口具体的实现类去注入。

注解@Qualifier
注解@Qualifier就好比是采用按名称查找的方法。

@Autiwired
@Qualifier("roleService")
private RoleService roleService=null;

4、使用@Bean装配Bean
对于Java而言,大部分的开发都需要引入第三方的包,而且往往并没有这些包的源码,这时候将无法为这些包的类加入@Component注解,让它们变为开发环境的Bean。
这个时候Spring给予了一个注解@Bean,它可以注解到方法之上,并且将方法返回的对象作为Spring的Bean,存放在IoC容器中。

@Bean(name="dataSource")
public DataSource getDataSource(){
	...
}

这样就能装配一个Bean,当Spring IoC容器扫描它的时候,就会为其生成对应的Bean。这里还配置了Bean的name为dataSource,这就意味着Spring生成该Bean的时候就会使用dataSource作为其BeanName。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值