@component注解与@Configuration的理解

4 篇文章 0 订阅
订阅专栏

@component注解与@Configuration的理解

首先来解释下@Configuration在来解释@component再来讲述两者的区别

@Configuration

从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

注意:@Configuration注解的配置类有如下要求:

1、@Configuration不可以是final类型;
2、@Configuration不可以是匿名类;
3、嵌套的configuration必须是静态类。

用@Configuration加载spring
1.1、@Configuration配置spring并启动spring容器
1.2、@Configuration启动容器+@Bean注册Bean
1.3、@Configuration启动容器+@Component注册Bean
1.4、使用 AnnotationConfigApplicationContext 注册 AppContext 类的两种方法
1.5、配置Web应用程序(web.xml中配置AnnotationConfigApplicationContext)

二、组合多个配置类
2.1、在@configuration中引入spring的xml配置文件
2.2、在@configuration中引入其它注解配置
2.3、@configuration嵌套(嵌套的Configuration必须是静态类)
三、@EnableXXX注解
四、@Profile逻辑组配置
五、使用外部变量

@Configuration配置spring并启动spring容器
@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的,作用为:配置spring容器(应用上下文)

@Configuration启动容器+@Bean注册Bean,@Bean下管理bean的生命周期
@Bean标注在方法上(返回某个实例的方法),等价于spring的xml配置文件中的,作用为:注册bean对象
(1)、@Bean注解在返回实例的方法上,如果未通过@Bean指定bean的名称,则默认与标注的方法名相同;
(2)、@Bean注解默认作用域为单例singleton作用域,可通过@Scope(“prototype”)设置为原型作用域;
(3)、既然@Bean的作用是注册bean对象,那么完全可以使用@Component、@Controller、@Service、@Ripository等注解注册bean,当然需要配置@ComponentScan注解进行自动扫描。
在这里插入图片描述
在这里插入图片描述
@Bean下管理bean的生命周期
可以使用基于 Java 的配置来管理 bean 的生命周期。@Bean 支持两种属性,即 initMethod 和destroyMethod,这些属性可用于定义生命周期方法。在实例化 bean 或即将销毁它时,容器便可调用生命周期方法。生命周期方法也称为回调方法,因为它将由容器调用。使用 @Bean 注释注册的 bean 也支持 JSR-250 规定的标准 @PostConstruct 和 @PreDestroy 注释。如果您正在使用 XML 方法来定义 bean,那么就应该使用 bean 元素来定义生命周期回调方法。以下代码显示了在 XML 配置中通常使用 bean 元素定义回调的方法

@component注解

1、@controller 控制器(注入服务)
2、@service 服务(注入dao)
3、@repository dao(实现dao访问)
4、@component (把普通pojo实例化到spring容器中,相当于配置文件中的)
如果 Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释,而用 @Component 对那些比较中立的类进行注释。
在 一个稍大的项目中,通常会有上百个组件,如果这些组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找以及维护起来也不太方便。 Spring2.5为我们引入了组件自动扫描机制,他可以在类路径底下寻找标注了 @Component,@Service,@Controller,@Repository注解的类,并把这些类纳入进spring容器中管理。它的作用 和在xml文件中使用bean节点配置组件时一样的。

@component (把普通pojo实例化到spring容器中,相当于配置文件中的

泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。

说明:
<context:component-scan base-package=”com.*”>
上面的这个例子是引入Component组件的例子,其中base-package表示为需要扫描的所有子包。
共同点:被@controller 、@service、@repository 、@component 注解的类,都会把这些类纳入进spring容器中进行管理

@Component取代 或者 @Component(“id”) 取代配置文件applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context 
                           http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 组件扫描,扫描含有注解的类 -->
    <context:component-scan base-package="com.fly.spring.annotation"></context:component-scan>
</beans>

注解的类:

package com.fly.spring.annotation;
 
import org.springframework.stereotype.Component;
 
@Component("person")
public class Person {
 
    public void getString(){
        System.out.println("*********hello everyOne**********");
    }
}

@configuration和@component之间的区别

@configuration和@component之间的区别是:@Component注解的范围最广,所有类都可以注解,但是@Configuration注解一般注解在这样的类上:这个类里面有@Value注解的成员变量和@Bean注解的方法,就是一个配置类。

展示两个注解的配图
可以看出@Configuration注解中有@Component注解

在这里插入图片描述
从定义来看,@Configuration 注解本质上还是@Component,因此context:component-scan/ 或者 @ComponentScan都能处理@Configuration注解的类。

@Configuration标记的类必须符合下面的要求:

配置类必须以类的形式提供(不能是工厂方法返回的实例),允许通过生成子类在运行时增强(cglib 动态代理)。
配置类不能是 final 类(没法动态代理)。
配置注解通常为了通过 @Bean 注解生成 Spring 容器管理的类,
配置类必须是非本地的(即不能在方法中声明,不能是 private)。
任何嵌套配置类都必须声明为static。
@Bean 方法可能不会反过来创建进一步的配置类(也就是返回的 bean 如果带有 @Configuration,也不会被特殊处理,只会作为普通的 bean)。
加载过程

Spring 容器在启动时,会加载默认的一些PostPRocessor,其中就有ConfigurationClassPostProcessor,这个后置处理程序专门处理带有@Configuration注解的类,这个程序会在bean 定义加载完成后,在bean初始化前进行处理。主要处理的过程就是使用cglib动态代理增强类,而且是对其中带有@Bean注解的方法进行处理。

基于Java的配置我们通常使用@Configuration注解来声明Spring Bean
除此之外我们还能使用@Component声明Spring Bean


@Component
public class Configuration {

	@Bean
	public UserService userService() {
		return new UserService();
	}
}
@org.springframework.context.annotation.Configuration
public class Configuration {

	@Bean
	public UserService userService() {
		return new UserService();
	}
}

上面两段代码除Config类上的注解不同之外其他都相同,但Spring对两者的处理方式是完全不一样的。第一段代码会像我们期望的一样正常运行,因为new SimpleBeanConsumer(simpleBean())这段代码中simpleBean()方法会由Spring代理执行,Spring发现方法所请求的Bean已经在容器中,那么就直接返回容器中的Bean。所以全局只有一个SimpleBean对象的实例。第二段代码在执行new SimpleBeanConsumer(simpleBean()) 时simpleBean()不会被Spring代理,会直接调用simpleBean()方法获取一个全新的SimpleBean对象实例所以全局会有多个SimpleBean对象的实

使用Configuration时在driver和spring容器之中的是同一个对象,而使用Component时是不同的对象。
造成不同结果的原因在ConfigurationClassPostProcessor类之中,通过调用enhanceConfigurationClasses方法,为被注解@Configuration的类进行CGLIB代理
虽然Component注解也会当做配置类,但是并不会为其生成CGLIB代理Class,所以在生成Driver对象时和生成Car对象时调用car()方法执行了两次new操作,所以是不同的对象。当时Configuration注解时,生成当前对象的子类Class,并对方法拦截,第二次调用car()方法时直接从BeanFactory之中获取对象,所以得到的是同一个对象。

造成这种差异的原因如下:如果使用@Configuration,所有用@Bean标记的方法会被包装成CGLIB的wrapper其工作原理是:如果方式是首次被调用那么原始的方法体会被执行并且结果对象会被注册到Spring上下文中。之后所有的对该方法的调用仅仅只是从Spring上下文中取回该对象返回给调用者。在上面的第二段代码中,new SimpleBeanConsumer(simpleBean())只是纯JAVA方式的调用,多次调用该方法返回的是不同的对象实例。要修正第二段代码中的问题,可以使用@Autowired如下所示:

@Component
public class Configuration {

	@Autowired
	UserService UserService;
	
	@Bean
	public UserService userService() {
		return new UserService();
	}
}

https://www.cnblogs.com/duanxz/p/7493276.html

https://blog.csdn.net/tiantangdizhibuxiang/article/details/81784878

https://www.jb51.net/article/153430.htm

Spring注解配置:@Configuration 和 @Component 区别及原理详解
m0_73311735的博客
04-04 1767
Indexed​/***/​复制代码@Component​​​复制代码从定义来看, @Configuration 注解本质上还是 @Component,因此 @ComponentScan 能扫描到@Configuration 注解的类。@Component在Spring中是代表LITE模式的配置注解,这种模式下的注解不会被Spring所代理,就是一个标准类,如果在这个类中有@Bean标注的方法,那么方法间的相互调用,其实就是普通Java类的方法的调用。
@Component和@Configuration
qq_40820563的博客
04-30 2091
@Component和@Configuration作为配置类的差别 @Component和@Configuration都可以作为配置类 请看下面一段代码: @Configuration public class MyTestConfig { @Bean public Driver driver(){ Driver driver = new Driver(); driver.setId(1); driver.setName("driver");
@Configuration注解 -【Spring底层原理】
最新发布
2401_86359039的博客
09-04 1121
System.out.println(“User对象”);System.out.println(“User2对象”);
深入@component注解与@Configuration
weixin_41438466的博客
04-18 6606
1、@Configuration 从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。 注意:@Configuration注解的配置类有如下要求: 1、@Configuration不可以是final类型;
@Configuration和@Component
qq_40708942的博客
09-09 5812
@Configuration注解能够使得加了它的对应的配置类在spring容器中是一个cglib代理bean,让配置类实例变成cglib代理实例的作用就是防止@Bean方法B又调用@Bean方法A的这种场景破坏了bean的单例性。解决这种场景的原理就是在spring实例化@Bean方法B对应的bean的时候,会通过反射调用配置类的@Bean方法B,在反射调用之前@Bean方法B放到currentlyInvokedFactoryMethod中,然后由于配置类已经是一个cglib代理对象了,
@Component 和 @Configuration
qq_31217363的博客
04-01 2990
@Component 和 @Configuration 区别: 1.从定义来看, @Configuration 注解本质上还是 @Component,因此 context:component-scan/ 或者 @ComponentScan 都能处理@Configuration 注解的类。 2.配置了@Component的类没有通过动态代理来代理@Bean方法的调用,调用该方法返回的是不同实例 3.配置了@Configuration的类是有通过动态代理来代理@Bean方法的调用的,因此调用该方法返回的都是同
SpringBoot中@Configuration和@Component注解
plpldog的博客
03-28 3750
使用 @Configuration和@Component都是使用于配置类上以代替XML文件中<beans>标签; @Configuration是@Component的扩展,同样类似的扩展还有@Repository、@Service、@Controller、@RestController等等,而后面四个都是用于传统三层架构中使用的注解; 在被@Configuration注解的类中所有带有@Bean注解的方法都会被CGLib动态代理,而后每次调用这些方法时返回的都是第一次返回的实例; 被@Conf
Spring Boot技术知识点:如何深入理解@Component注解
06-18
虽然`@Component`注解可以创建bean,但更复杂的配置场景下,我们可能需要使用`@Configuration`注解的类,它们可以声明`@Bean`方法,更灵活地定义bean的创建逻辑。 9. **元注解和自定义注解** `@Component`是一个...
@Configuration与@Component作为配置类的区别详解
08-25
在上面的示例代码中,我们可以看到,使用@Configuration注解的MyBeanConfig类和使用@Component注解的MyBeanConfig类都可以生成Country和UserInfo实例,但是它们之间存在着一些关键的区别。当我们使用@Configuration...
Spring中@Component和@Configuration的区别
JAVAQXQ的博客
07-31 860
直接上总结加了@Configuration的类会被CGLIB进行动态代理,不加或者加@Component注解则不会被代理。
Spring注解深入解析:@Bean与@Component共存的奥秘
fudaihb的博客
04-19 1521
本文将深入探讨两个核心注解:@Bean和@Component,特别是它们在同一类中共存的情况。虽然这两个注解都用于定义Spring组件,但它们在功能和用法上有所不同,同时使用时也可能带来一些特殊的问题和挑战。通过本文,我们将详细解析它们的定义、使用方式以及最佳实践,帮助读者更好地理解和应用这两个注解,从而提高Spring应用的开发效率和质量。
@Component和@Configuration作为配置类的差别
热门推荐
一号搬砖手的博客
06-08 9万+
随着spingboot的大火,注解式配置受到了大家的热烈欢迎,而@Component和@Configuration都可以作为配置类,之前一直都没觉得这两个用起来有什么差别,可能有时程序跑的和自己想的有所区别也没注意到。 直到看到这篇文章:https://my.oschina.net/guangshan/blog/1807721 。我意识到@Component和@Configuration是有区别...
终于搞懂了 @Configuration 和 @Component 的区别
weixin_44421461的博客
02-14 2023
点击上方“Java基基”,选择“设为星标”做积极的人,而不是积极废人!每天14:00更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2021超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT 源码解析作业调度中间件 Elast...
@Component注解和@Configuration注解的之间的区别
wd521521的博客
03-02 5193
直白的说Component包含了Configuration的所用注解ConfigurationComponent都是注解在类上的,Configuration类中的方法成员变量是@Value注解,方法上的注解是@BeanComponent类中的方法和成员变量没有任何限制...
@Configuration 和 @Component 到底有啥区别?
S mile0804的博客
04-25 1万+
Spring 注解中 @Configuration 和 @Conponent 区别总结为一句话就是: @Configuration 中所有带 @Bean 注解的方法都会被动态代理(cglib),因此调用该方法返回的都是同一个实例。而 @Conponent 修饰的类不会被代理,每实例化一次就会创建一个新的对象。
Spring 之 @Component 和 @Configuration 两者区别以及源码分析
龚小帅的博客
12-20 3420
之前一直搞不清 @Component 和 @Configuration 这两个注解到底有啥区别,一直认为被这两修饰的类可以被 Spring 实例化嘛,不,还是见识太短,直到今天才发现这两玩意有这么大区别。很幸运能够及时发现,后面可以少走点坑,下面就直接通过最简单的案例来说明它两的区别,颠覆你的认知。
@Configuration和@Component注解的区别
y516369的博客
10-30 795
@Configuration和@Component注解的区别
【知识积累】@Component和@Configuration的区别
Darren的博客
06-28 485
首先我们直接看@Configuration的代码: @Configuration是包含@Component注解的,所以我们可以认为@Configuration在@Component的基础上做了什么事情? 先说答案: @Configuration 中所有带 @Bean 注解的方法都会被动态代理,因此调用该方法返回的都是同一个实例。 看看代码: /** * Post-processes a BeanFactory in search of Configuration class BeanDe
@Configuration 和 @Component 注解的区别
05-30
@Configuration 和 @Component 注解的区别主要在于它们的作用和使用场景不同。 @Configuration 注解表示这是一个配置类,通常用于定义应用程序的配置信息,包括配置数据源、配置 Bean、配置拦截器等等。配置类中的方法通常使用 @Bean 注解来声明一个 Bean。 而 @Component 注解表示这是一个组件类,通常用于定义应用程序中的一个组件,例如 Service、Controller、Repository 等等。组件类中的方法通常不会返回一个 Bean,而是通过 @Autowired 注解来依赖注入其他 Bean。 总的来说,@Configuration 注解用于定义配置类,@Component 注解用于定义组件类。但是这两个注解也有一定的交叉使用场景。比如一个组件类可以通过 @Configuration 注解来声明一些 Bean,或者一个配置类中的方法也可以使用 @Component 注解来声明一个组件类。
写文章

热门文章

  • Redis (error) NOAUTH Authentication required.解决方法 124884
  • @component注解与@Configuration的理解 17244
  • 分布式定时任务SchedulerLock的配置 11362
  • kafka单机版的安装 4093
  • DefaultErrorAttributes 3329

分类专栏

  • idea 2篇
  • Linux 8篇
  • 数据库 1篇
  • springboot 4篇
  • java 28篇
  • redis 4篇
  • MQ 2篇
  • dubbo
  • zookeeper
  • Ngnix 2篇
  • JQuery 2篇
  • shiro
  • kafka 1篇
  • log 4篇
  • cache

最新评论

  • Spring Jpa实体中出现数据库关键字解决方法

    快乐柠檬: 请问您是从哪里得知可以这样解决的?

  • Spring Jpa实体中出现数据库关键字解决方法

    快乐柠檬: 多谢,原来可以这样解决。

  • Spring Jpa实体中出现数据库关键字解决方法

    wm20000: 有效,点赞

  • Redis (error) NOAUTH Authentication required.解决方法

    从清晨到日暮_: redis-cli进入之后再auth ‘password’

  • Redis (error) NOAUTH Authentication required.解决方法

    _暮落_: redis-cli -h 192.168.1.128 -c -p 7000 -a 123456

最新文章

  • (2)多线程-线程的常用方法与生命周期
  • (1)多线程-线程的创建
  • cas实现单点登录(2)
2022年2篇
2020年15篇
2019年37篇
2018年5篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家舟山宗教玻璃钢雕塑规划吕梁玻璃钢人物雕塑价格普通玻璃钢雕塑六安景观玻璃钢雕塑厂家温州玻璃钢花盆多少钱西安火烈鸟玻璃钢雕塑价格武威玻璃钢雕塑制作流程宽城区玻璃钢雕塑工程施工临沧广场玻璃钢雕塑价格丽水玻璃钢雕塑联系方式河北玻璃钢雕塑定制价格商场美陈dp点创意哈尔滨玻璃钢红军雕塑常德户外景观玻璃钢雕塑常州玻璃钢广场雕塑厂家洛阳花朵玻璃钢雕塑生产西藏仿铜玻璃钢雕塑镇江玻璃钢仿真水果雕塑厂家乐山玻璃钢雕塑摆件施工公司凌源玻璃钢雕塑商城艺术玻璃钢雕塑工厂广东欧式玻璃钢雕塑定制赣州玻璃钢雕塑销售厂家天津玻璃钢雕塑的特点浙江抽象玻璃钢雕塑定做价格商场美陈布置安装制作菏泽小区玻璃钢雕塑安装校园玻璃钢雕塑玻璃钢雕塑保养手册郑州工业玻璃钢雕塑服务至上香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化