Spring源码从入门到精通---@Resource&@Inject(十二)

简介: Spring源码从入门到精通---@Resource&@Inject(十二)

上篇文章介绍了自动装配的@Autowired注解

1)、AnnotationConfigApplicationContext.getBean(Bookdao.class)默认是按类型去IOC容器中找组件,若同一个对象找到两个以上组件,则会调用AnnotationConfigApplicationContext.getBean(""),按组件名称查到。

2)、他可以 和@Qualifier()一起用,指定组件名称。

3)、也可以设置@Autowired(required=false),默认是true,表示若ioc容器没有当前组件则报错,若设置为false,则会返回组件null,不会报错。

4)、也可以和@Primary注解指定主加载组件一起用。

感兴趣的同学可以点 下面链接🔗看看,上篇文章链接:

Spring源码从入门到精通---@Autowired&@Qualtify(十一)


这篇文章主要介绍@Resource和@Inject自动装配注解

@Autowired主要是spring的注解,@Resource和@Qualitifier是java的规范,JRE标准。

@Resource不可以和@Primary,也不支持@Autowired(required=false)一起用,可以直接加name参数定制加载的组件名称。

@Inject需要导入javax.inject包,和@Autowired一样,但也不支持@Autowired(required=false)

他们都是通过我们之前文章学的AutowiredAnnotationBeanPostProcessor类加载。


一、@Resource


bookDao继续用@Repository注解,默认注入bookDao组件,config也用@Bean加一个bookDao2组件2,修改bookService,注释掉之前的@Autowired注解,加上@Resource(name="bookDao2")注解,junitTest不变,和上篇一样,为了方便阅读 再贴一份代码:

@Service
public class BookService {
    //@Autowired(required = false)
    //@Qualifier("bookDao2")
    @Resource(name = "bookDao2")
    //@Inject
    private BookDao bookDao;
    public void print() {
        System.out.println("BookService注入的bookDao:" + bookDao);
    }
    @Override
    public String toString() {
        return "BookService{" +
            "bookDao=" + bookDao +
            '}';
    }
}
@Configuration
@ComponentScan(value = {"com.alibaba.controller", "com.alibaba.service", "com.alibaba.dao"})
public class ConfigOfAutowired {
    @Primary
    @Bean("bookDao2")
    public BookDao bookDao() {
        BookDao bookD = new BookDao();
        bookD.setLable("2");
        return bookD;
    }
}
@Repository
public class BookDao {
    private String lable = "1";
    public String getLable() {
        return lable;
    }
    public void setLable(String lable) {
        this.lable = lable;
    }
    @Override
    public String toString() {
        return "BookDao{" +
            "lable='" + lable + '\'' +
            '}';
    }
}
public class IOCTestAutowired {
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(
        ConfigOfAutowired.class);
    @Test
    public void test1() {
        //getBeanNames(applicationContext);
        BookService bookService = applicationContext.getBean(BookService.class);
        //BookDao bookDao = applicationContext.getBean(BookDao.class);
        System.out.println("bookService:" + bookService);
        //System.out.println("bookDao:" + bookDao);
        applicationContext.close();
    }
    private void getBeanNames(AnnotationConfigApplicationContext applicationContext) {
        String[] names = applicationContext.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }
}


打印结果可以看到,若指定name组件,则加载bookDao2,若没有指定,则加载bookDao:

image.png


二、@Inject


这个注解用的很少,需要导入mvn包,之后就把@Resource注释,加上这个,也可以自动装配组件,代码如下。

<!-- https://mvnrepository.com/artifact/javax.inject/javax.inject -->
    <dependency>
        <groupId>javax.inject</groupId>
        <artifactId>javax.inject</artifactId>
        <version>1</version>
    </dependency>
@Service
public class BookService {
    //@Autowired(required = false)
    //@Qualifier("bookDao2")
    //@Resource(name = "bookDao2")
    @Inject
    private BookDao bookDao;
    public void print() {
        System.out.println("BookService注入的bookDao:" + bookDao);
    }
    @Override
    public String toString() {
        return "BookService{" +
            "bookDao=" + bookDao +
            '}';
    }
}
相关文章
|
4月前
|
人工智能 Java API
Spring AI 实战|Spring AI入门之DeepSeek调用
本文介绍了Spring AI框架如何帮助Java开发者轻松集成和使用大模型API。文章从Spring AI的初探开始,探讨了其核心能力及应用场景,包括手动与自动发起请求、流式响应实现打字机效果,以及兼容不同AI服务(如DeepSeek、通义千问)的方法。同时,还详细讲解了如何在生产环境中添加监控以优化性能和成本管理。通过Spring AI,开发者可以简化大模型调用流程,降低复杂度,为企业智能应用开发提供强大支持。最后,文章展望了Spring AI在未来AI时代的重要作用,鼓励开发者积极拥抱这一技术变革。
1591 71
Spring AI 实战|Spring AI入门之DeepSeek调用
|
30天前
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。
|
5月前
|
安全 Java 数据库
Spring Security 实战指南:从入门到精通
本文详细介绍了Spring Security在Java Web项目中的应用,涵盖登录、权限控制与安全防护等功能。通过Filter Chain过滤器链实现请求拦截与认证授权,核心组件包括AuthenticationProvider和UserDetailsService,负责用户信息加载与密码验证。文章还解析了项目结构,如SecurityConfig配置类、User实体类及自定义登录逻辑,并探讨了Method-Level Security、CSRF防护、Remember-Me等进阶功能。最后总结了Spring Security的核心机制与常见配置,帮助开发者构建健壮的安全系统。
331 0
|
5月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
376 70
|
3月前
|
Java 关系型数据库 MySQL
【Spring】【事务】初学者直呼学会了的Spring事务入门
本文深入解析了Spring事务的核心概念与使用方法。Spring事务是一种数据库事务管理机制,通过确保操作的原子性、一致性、隔离性和持久性(ACID),维护数据完整性。文章详细讲解了声明式事务(@Transactional注解)和编程式事务(TransactionTemplate、PlatformTransactionManager)的区别与用法,并探讨了事务传播行为(如REQUIRED、REQUIRES_NEW等)及隔离级别(如READ_COMMITTED、REPEATABLE_READ)。
269 1
|
3月前
|
Java API 微服务
Java 21 与 Spring Boot 3.2 微服务开发从入门到精通实操指南
《Java 21与Spring Boot 3.2微服务开发实践》摘要: 本文基于Java 21和Spring Boot 3.2最新特性,通过完整代码示例展示了微服务开发全流程。主要内容包括:1) 使用Spring Initializr初始化项目,集成Web、JPA、H2等组件;2) 配置虚拟线程支持高并发;3) 采用记录类优化DTO设计;4) 实现JPA Repository与Stream API数据访问;5) 服务层整合虚拟线程异步处理和结构化并发;6) 构建RESTful API并使用Springdoc生成文档。文中特别演示了虚拟线程配置(@Async)和StructuredTaskSco
371 0
|
5月前
|
存储 安全 Java
Spring Security 入门与详解
Spring Security 是 Spring 框架中的核心安全模块,提供认证、授权及防护功能。本文详解其核心概念,包括认证(Authentication)、授权(Authorization)和过滤器链(Security Filter Chain)。同时,通过代码示例介绍基本配置,如 PasswordEncoder、UserDetailsService 和自定义登录页面等。最后总结常见问题与解决方法,助你快速掌握 Spring Security 的使用与优化。
1293 0
|
6月前
|
存储 监控 数据可视化
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
114 0

热门文章

最新文章