欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-24 11:29:34
...

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

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 +
                '}';
    }
}

 

相关标签: Spring注解的分析