spring @Autowired、@Resource、@Inject 自动装配

一、@Autowired:

1、配置文件:

package com.zdc.sp.autowire.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import com.zdc.sp.autowire.dao.BookDao;

/**
 * 自动装配:
 *         spring 利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系赋值;
 * 1)@Autowired:自动注入
 *         1)、默认优先按照类型去找容器中找对应组件:
 *         2)、如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中找
 *         3)使用@Qualifier("bookDao2") ;使用@Qualifier指定需要装配的组件的ID,而不是使用属性名
 *         4)、自动装配默认一定要将属性赋值好,没有就会报错;可以使用@Autowired(required=false);required设置成false;
 *             就不会报错了。
 *         5)、@Primary:让spring进行自动装配的时候,默认使用首先的bean;
 *                         也可以继续使用@Qualifier指定需要装配的bean的名字
 *
 */

@Configuration
@ComponentScan({"com.zdc.sp.autowire.dao","com.zdc.sp.autowire.service","com.zdc.sp.autowire.controller"})
public class AutowireConfig1 {

    @Primary
    @Bean("bookDao2")
    public BookDao bookDao(){
        BookDao bookDao = new BookDao();
        bookDao.setFlag("2");
        return bookDao;
    }
}

2、dao类:

package com.zdc.sp.autowire.dao;

import org.springframework.stereotype.Repository;

//名字默认类名首字母小写
@Repository
public class BookDao {

    //该标记作为后面测试用,为后面含有多个相同bean类型的时候是调用哪一个bean
    private String flag  = "1";

    public String getFlag() {
        return flag;
    }

    public void setFlag(String flag) {
        this.flag = flag;
    }

    @Override
    public String toString() {
        return "BookDao [flag=" + flag + "]";
    }
    
}
 

3、servcie:

package com.zdc.sp.autowire.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import com.zdc.sp.autowire.dao.BookDao;


@Service
public class BookService {

    @Qualifier("bookDao2")
    @Autowired(required=false)
    private BookDao bookDao;
    
    public void print(){
        System.out.println(bookDao);
    }

    @Override
    public String toString() {
        return "BookService [bookDao=" + bookDao + "]";
    }
    
    
}
4测试类:

package com.zdc.sp.autowire.test;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.zdc.sp.autowire.config.AutowireConfig1;
import com.zdc.sp.autowire.service.BookService;

public class AutowireTest {

    public static void main(String[] args) {
        //获取配置文件
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AutowireConfig1.class);
        
        BookService bookService = context.getBean(BookService.class);
        System.out.println(bookService);

    }
}
二、关于@Resurce、@Inject注解

@Resorce(JSR250规范)-----》属于Java规范注解;      

             可以和@Autowried一样实现自动装配功能;默认是按照组件名称进行装配的;

@Injecct(JSR330规范)--------》属于Java规范注解

             需要导入javax.inject的包,和@Autowried的功能一样,但是没有required=false功能

 

          

你可能感兴趣的:(spring)