Spring学习笔记七、自动装配 @Resource(JSR250)和@Inject(JSR330)、 @Autowired(Spring)

一、配置文件及说明 以及区别说明

package com.hao.config;

import com.hao.dao.BookDAO;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

/**
 * @author haoxiansheng
 * @date 2020-06-02
 * 自动装配:
 * spring 利用依赖注入(DI),完成对IOC 容器中各个组件的依赖关系赋值
 * 1、{@link org.springframework.beans.factory.annotation.Autowired} spring 定义的
 * 1) 默认优先按照类型去容器中找对应的组件:applicationContext.getBean(BookDAO.class)
 * 2) 如果找到多个相同类型的主键,在将属性名称作为组件id去容器中查找applicationContext.getBean("bookDAO")
 * 3) @Qualifier("booDAO") 明确指定使用的组件id
 * 4) 自动装配一定要将属性赋值好,没有就会报错 @Autowired(required = false)
 * 5) @Primary: 默认指定首选装配 也可以使用@Qualifier 指定具体需要装配的
 * 6) 可以用在:构造方法、参数、方法、属性
 * <p>
 * 2、Spring 还支持使用@Resource(JSR250)和@Inject(JSR330) java 规范
 * 1) @Resource 可以和@Autowired 一样实现自动装配功能,默认是按照组件名称进行装配的。
 * 缺点没有支持 @Autowired(required = false) 和 @Primary 功能
 * 2)@Inject 和 @Autowired 功能一样但是没有属性
 * 需要导入依赖
 * <dependency>
 *    <groupId>javax.inject</groupId>
 *    <artifactId>javax.inject</artifactId>
 *     <version>1</version>
 * </dependency>
 *
 * 3、{@link org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor} 做解析功能
 */
@Configuration
@ComponentScan({"com.hao.controller", "com.hao.dao", "com.hao.service"})
public class MainConfigOfAutowired {

    /**
     * @return
     */
    @Primary
    @Bean("bookDAO2")  // 如果不指定这个 bookDAO2 则启动加载生效的是configuration的bookDAO
    public BookDAO bookDAO() {
        BookDAO bookDAO = new BookDAO();
        bookDAO.setLable("2");
        return bookDAO;
    }
}

二、测试类

package com.hao.test;

import com.hao.config.MainConfigOfAutowired;
import com.hao.config.MainConfigOfLifeCycle;
import com.hao.controller.BookController;
import com.hao.dao.BookDAO;
import com.hao.service.BookService;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * @author haoxiansheng
 * @date 2020-05-29
 */
public class IOCAutowiredTest {

    // 测试第一种
    @Test
    public void test01() {
        // 1、传入配置类 创建IOC 容器
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAutowired.class);
        System.out.println("ioc 容器创建完成");
        // 获取
        BookService bookService = applicationContext.getBean(BookService.class);
        System.out.println(bookService.toString());

        //BookDAO bookDAO = applicationContext.getBean(BookDAO.class);
        //System.out.println(bookDAO.toString());

        // 2、关闭容器
        applicationContext.close();
    }
}



package com.hao.dao;

import org.springframework.stereotype.Repository;

/**
 * @author haoxiansheng
 * @date 2020-05-28
 */
// 名字默认是类名首字母小写
@Repository
public class BookDAO {

    private String lable = "1";

    public void insert() {
        System.out.println("我是BookDAO 做一些操作");
    }

    public String getLable() {
        return lable;
    }

    public void setLable(String lable) {
        this.lable = lable;
    }

    @Override
    public String toString() {
        return "BookDAO{" +
                "lable='" + lable + '\'' +
                '}';
    }
}



package com.hao.service;

import com.hao.dao.BookDAO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.inject.Inject;

/**
 * @author haoxiansheng
 * @date 2020-05-28
 */
@Service
public class BookService {

    //@Qualifier("bookDAO")
    //@Autowired()
    //@Resource(name = "bookDAO2")
    @Inject
    private BookDAO bookDAO;

    public void create() {
        System.out.println("我是service 做一些操作");
    }

    @Override
    public String toString() {
        return "BookService{" +
                "bookDAO=" + bookDAO +
                '}';
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值