前言
今天在写注解时,不小心把@Configuration写成了@Configurable,这两个长得很像,所以顺便探究下,有什么区别。

@Configuration
该注解是可以用来替代XML文件。
以前我们配置bean时,都是写在applicationContext.xml文件中的。
有了这个注解后,我们就可以编写一个类在其上面加上该注解。即配置类。
在配置类中可以在方法上加@Bean注解定义其中的Bean

@Configurable
现在假设,我们想在非Spring管理的类中使用依赖注入;
比如:手动new出来的对象,正常情况下,Spring是无法依赖注入的,这个时候可以使用@Configurable注解;

现在假设我们有如下代码:

public class CarSalon {
    //...
    public void testDrive() {
        Car car = new Car();
        car.startCar();
    }
}
 
@Component
public class Car {
    @Autowired
    private Engine engine;
    @Autowired
    private Transmission transmission;
 
    public void startCar() {
        transmission.setGear(1);
        engine.engineOn();
        System.out.println("Car started");
    }
}
 
@Component
public class Engine {
//...
}
 
@Component
public class Transmission {
//...
}

代码运行时,会把Null异常。因为正常情况下,Spring无法对new出来的对象进行依赖注入;

在此基础上,我们使用@Configurable注解进行修改,如下:

@Configurable(preConstruction = true)
@Component
public class Car {
 
    @Autowired
    private Engine engine;
    @Autowired
    private Transmission transmission;
 
    public void startCar() {
        transmission.setGear(1);
        engine.engineOn();
 
        System.out.println("Car started");
    }
}

讲解:
@Configurable(preConstruction = true) 这个注解的作用是:
告诉Spring在构造函数运行之前将依赖注入到对象中。

使用该注解需要注意的地方:
① 需要在项目中添加如下jar包:aspectj-x.x.x.jar, aspectjrt.jar, aspectjveawer-x.x.x.jar
② 将基于Spring的java代理添加到运行配置中:-javaagent:"PATH\spring-instrument-x.x.x.jar"

现在,运行就不会报错了。

参考地址:
Spring dependency injection – @Configurable
Spring framework @Configurable vs @Configuration
————————————————

原文链接:https://blog.csdn.net/u013066244/article/details/89061676

Spring注解中@Configuration和@Configurable的区别相关推荐

  1. Spring框架中ApplicationContext与BeanFactory的区别

    前言 Spring框架中ApplicationContext与BeanFactory的区别.其中,BeanFactory为ApplicationContext的父类,是一种继承关系,Applicati ...

  2. spring boot 中@Mapper和@Repository的区别

    一:前言 @Mapper和@Repository是常用的两个注解,两者都是用在dao上,两者功能差不多,容易混淆,有必要清楚其细微区别: 二:区别 @Repository需要在Spring中配置扫描地 ...

  3. Spring Boot中Configuration problem: Cannot locate BeanDefinitionParser for element 的问题分析

    环境信息 Spring Boot 2.0.2 JDK 8, OS: windows 7 问题的提出 今天在开发中,碰到一下类似的错误信息: 15:44:09.198 INFO com.jd.ai.cv ...

  4. 理解Spring Security中permitAll()和anonymous()的区别

    从 Spring文档: 采用"默认拒绝"通常被认为是良好的安全实践,您可以明确指定允许的内容并禁止其他所有内容.定义未经身份验证的用户可以访问的内容是类似的情况,尤其是对于 Web ...

  5. spring security中Authority、Role的区别

    最近在研究spring security时,大概研究了一下Authority.Role之间到底有什么本质的区别. 如果你使用的是hasRole方法来判断你的登录用户是否有权限访问某个接口,那么你初始化 ...

  6. Spring框架中IOC和DI的区别

    IOC:全称Inversion of Control,中文释义为控制反转. 简单地说,IOC就是把对象的实例化工作交由Spring容器来完成.IOC可以说是一种思想,传统的应用程序是我们自己去创建(n ...

  7. Spring 注解之@RestController与@Controller的区别

    https://www.cnblogs.com/east7/p/10462279.html

  8. spring注解 声明式事务

    在spring注解中,使用声明式事务,需要用到两个核心的注解:@Transactional注解和@EnableTransactionManagement注解.将@Transactional注解加在方法 ...

  9. EVCache缓存在 Spring Boot中的实战

    2019独角兽企业重金招聘Python工程师标准>>> 文章共 727字,阅读大约需要 2分钟 ! 概 述 EVCache 是 Netflix开源的分布式缓存系统,基于 Memcac ...

最新文章

  1. 万字长文,理解Elasticsearch和面试总结
  2. 优质的空间服务商对网站优化的重要性
  3. webApp之meta标签
  4. Jenkins持续集成环境之tomcat的安装和配置
  5. 方程的根的个数C语言xtu_零度根轨迹的绘制及情况讨论、以及参数根轨迹的原理介绍...
  6. 喜提 redir contributor
  7. HDU 3530 Subsequence
  8. Maven之自定义pom类型的基础项目
  9. java 对象 序列化 文件中_如何将一个java对象序列化到文件里
  10. mysql改原始密码mac_MAC版修改MySQL初始密码的方法
  11. php 什么函数获取ip,在PHP中获取ip地址的方法有哪些
  12. 免费证书https://lamp.sh/ssl.html
  13. !!!SQL sever 函数表达
  14. 圆台下料展开计算方法_冲压件展开计算方法(二),转发给每一位冲压人
  15. 解决Maven下载慢的问题
  16. 《网络工程师教程(第五版)》大纲及与第四版比较
  17. VMWare station 14密钥
  18. kali2020.3 安装IDA freeware
  19. win7计算机属性里面的图标变白,Win7系统桌面图标白边如何解决
  20. 计算机课程教学调查问卷,《初中生信息技术课程学习现状调查问卷》分析报告...

热门文章

  1. 23行代码_动图展示——快排详解(排序最快的经典算法)
  2. mysql5.5安装最后一步一直无反应_【MATLAB R2019b】保姆级安装教程
  3. java 10000阶乘_Java ForkJoinPool: 3秒计算100万的阶乘
  4. 点击打印出现IE已经阻止此站点用不安全方式使用 ActiveX 控件解决方
  5. 语言设计谁年龄大_这桌子谁设计的?脑洞够大,除能360°翻转,打台球,乒乓球都行...
  6. 怎么获取web开发怎么获取手机的唯一标识_PYTHON实现北京住宅小区数据抓取-(Web服务API-地点检索服务)
  7. 基于spring cloud 的灰度发布实践_【收藏】基于spring cloud灰度发版方案
  8. mysql子查询sysdate_Oracle向MySQL 迁移相关事项
  9. python两个列表合并 从小到大排列_Python对两个有序列表进行合并和排序的例子...
  10. linux脚本 set env,linux 中 set,env,export,declare显示shell变量的区别