spring注入方式,Spring三种注入方式实现

KLQ 2020-07-22 10:51:09 java常见问答 6018

下面要给大家介绍的就是spring三种自动注入方式,对于这个方面你都了解吗?不清楚的小伙伴可以通过下面的文章来进行简单的学习哦。

三种方式分别是@Autowired注解-由spring提供;@Resource注解-由JSR-250提供;@Inject注解-由JSR-330提供;

@Autowired注解的使用方法

@Target(
{
    ElementType.CONSTRUCTOR
    , ElementType.METHOD
    , ElementType.PARAMETER
    , ElementType.FIELD
    , ElementType.ANNOTATION_TYPE
})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired
{
    /**
     * Declares whether the annotated dependency is required.
     * <p>Defaults to {@code true}.
     */
    boolean required() default true;
}

spring注入方式

@Configuration
@ComponentScan(basePackages = {
    "cn.monolog.service"
})
public class AutowiredBeanConfig
{
    @Bean(value = "bookDao1")
    public BookDao bookDao1()
    {
        BookDao bookDao = new BookDao();
        bookDao.setLabel("bookDao1");
        return bookDao;
    }
    @Bean(value = "bookDao2")
    @Primary
    public BookDao bookDao2()
    {
        BookDao bookDao = new BookDao();
        bookDao.setLabel("bookDao2");
        return bookDao;
    }
    @Bean(value = "bookDao3")
    public BookDao bookDao3()
    {
        BookDao bookDao = new BookDao();
        bookDao.setLabel("bookDao3");
        return bookDao;
    }
}

自动注入方式:

@Autowired
@Qualifier(value = "bookDao1")
private BookDao bookDao3;

按照优先级顺序,@Qulifier(bookDao1) > @Primary(bookDao2) > 属性名(bookDao3),最终加载的是名称为bookDao1的组件。

@Resource注解的使用方法

@Resource注解的使用跟@Autowired注解类似。

要注意:

不支持@Primary注解,也不支持reuqired=false,也就是不允许注入null。

这个注解有一个属性name,类似于@Qualified精准匹配,优先级最高。

默认按照属性名跟bean的名称匹配查找,假如,不存在,再按类型匹配查找。

例:

下面这个容器中有两个CarDao组件

@Configuration
@ComponentScan(basePackages = {
    "cn.monolog.service"
})
public class ResourceBeanConfig
{
    @Bean(value = "carDao1")
    public CarDao carDao1()
    {
        CarDao carDao = new CarDao();
        carDao.setLabel("1");
        return carDao;
    }
    @Bean(value = "carDao2")
    public CarDao carDao()
    {
        CarDao carDao = new CarDao();
        carDao.setLabel("2");
        return carDao;
    }
}

自动注入方式如下,会按属性名注入carDao2组件。

//自动注入
@Resource
private CarDao carDao2;

但是改为下面这种注入方式:

//自动注入
@Resource(name = "carDao1")
private CarDao carDao2;

因为,使用了name精准匹配,会忽略属性名,注入carDao1组件。

@Inject注解的使用方法

@Inject注解的使用方法跟@Autowired也基本相似,但是需要注意

使用之前,需要导入jar包——javax.inject;

支持@Primary注解,而且因为没有精确匹配,@Primary的优先级最高;

不支持required=false,即不能注入null,如果找不到组件肯定报错;

默认按照属性名跟bean的名称匹配查找,如果不存在,再按类型匹配查找。

例如,下面这容器中有一个EmployeeDao组件

@Configuration
public class InjectBeanConfig
{
    @Bean(value = "employeeDao1")
    public EmployeeDao employeeDao1()
    {
        EmployeeDao employeeDao = new EmployeeDao();
        employeeDao.setLabel("1");
        return employeeDao;
    }
}

自动注入的方式如下:

@Inject
private EmployeeDao employeeDao3;

spring会先按属性名查找名称为employeDao3的组件,即applicationContext.getBean("employeeDao3"),结果不存在;

然后按照类型查找,即applicationContext.getBean(EmployeDao.class),找到employeDao1组件,成功注入。

假如,容器中有多个同类型组件,例如:

@Configuration
public class InjectBeanConfig
{
    @Bean(value = "employeeDao1")
    public EmployeeDao employeeDao1()
    {
        EmployeeDao employeeDao = new EmployeeDao();
        employeeDao.setLabel("1");
        return employeeDao;
    }
    @Bean(value = "employeeDao2")
    public EmployeeDao employeeDao2()
    {
        EmployeeDao employeeDao = new EmployeeDao();
        employeeDao.setLabel("2");
        return employeeDao;
    }
    @Bean(value = "employeeDao3")
    public EmployeeDao employeeDao3()
    {
        EmployeeDao employeeDao = new EmployeeDao();
        employeeDao.setLabel("3");
        return employeeDao;
    }
}

注入方式:

@Inject
private EmployeeDao employeeDao3;

依然会按属性名和bean的名称匹配,即applicationContext.getBean("employeeDao3"),找到employee3,成功注入。

可是,假如,其中某个组件加了@Primary注解,会忽略属性名,优先注入,例如:

@Configuration
public class InjectBeanConfig
{
    @Bean(value = "employeeDao1")
    public EmployeeDao employeeDao1()
    {
        EmployeeDao employeeDao = new EmployeeDao();
        employeeDao.setLabel("1");
        return employeeDao;
    }
    @Bean(value = "employeeDao2")
    @Primary public EmployeeDao employeeDao2()
    {
        EmployeeDao employeeDao = new EmployeeDao();
        employeeDao.setLabel("2");
        return employeeDao;
    }
    @Bean(value = "employeeDao3")
    public EmployeeDao employeeDao3()
    {
        EmployeeDao employeeDao = new EmployeeDao();
        employeeDao.setLabel("3");
        return employeeDao;
    }
}

不管注入的时候使用什么样的属性名,都会注入employeeDao2。

以上内容源于网络,仅供参考。

spring注入方式你都了解了吗?更多相关内容,请继续通过本站的常见问题栏目来了解。

推荐阅读:

Spring和SpringMVC的区别是什么?各自的优缺点是什么?

spring定时任务时间配置要怎么实现?

spring获取bean的几种方式有哪些?如何实现?