Spring之@Configuration、@Component、@Bean

@Configuration

代表这个类是一个配置类,可理解为用spring的时候xml里面的<beans>标签

@Bean

用来定义一个bean,可以指定初始、销毁方法,及bean范围等,可理解为用spring的时候xml里面的<bean>标签

@ComponentScan

用来扫描指定包下面的注解类,相当于<context:component-scan base-package="com.xxx.xxx" />,普通的spring项目好多注解都需要扫包才有用

@Scope 调整作用域,来指定bean生成的对象是什么类型的。prototype:多实例的。singleton:单实例的(默认值)。request:同一次请求创建一个实例。session:同一个session创建一个实例。

@Lazy

懒加载,只有在创建单实例bean时才会生效,默认在容器启动的时候创建对象,添加了此注解后,容器启动不创建对象,而是在第一次使用(获取)Bean创建对象,并初始化。

@Import

用来导入其他的@Configuration配置类。

@ImportResource

用来导入xml配置文件,比如某些配置一定要xml配置。

@Component

加到类路径自动扫描 。@Controller:一个web的控制层,在Spring MVC中使用 。@Repository:数据管理/存储,企业级应用使用(Dao, DDD) 。@Service 提供一个商业逻辑: 一个无状态的切面。

Spring帮助我们管理Bean分为两个部分,一个是注册Bean,一个装配Bean。 完成这两个动作有三种方式,一种是使用自动配置的方式、一种是使用JavaConfig的方式,一种就是使用XML配置的方式。

在自动配置的方式中,使用@Component去告诉Spring,我是一个bean,你要来管理我,然后使用@AutoWired注解去装配Bean(所谓装配,就是管理对象直接的协作关系)。

在JavaConfig中,@Configuration其实就是告诉spring,spring容器要怎么配置(怎么去注册bean,怎么去处理bean之间的关系(装配))。@Bean的意思就是,我要获取这个bean的时候,你spring要按照这种方式去帮我获取到这个bean。

在使用xml的方式中,<bean>标签就是告诉spring怎么获取这个bean,各种<ref>就是手动的配置bean之间的关系。

用@Bean注解的方法:会实例化、配置并初始化一个新的对象,这个对象会由spring IoC 容器管理。

@Configuration public class AppConfig {

@Bean public MyService myService() { return new MyServiceImpl(); }

}

相当于在 XML 文件中配置

<beans> <bean id="myService" class="com.acme.services.MyServiceImpl"/> </beans>

生成对象的名字:默认情况下用@Bean注解的方法名作为对象的名字。但是可以用 name属性定义对象的名字

@Configuration public class AppConfig { @Bean(name = "myFoo") public Foo foo() { return new Foo(); } }

而且还可以使用name为对象起多个名字。

@Configuration public class AppConfig { @Bean(name = { "dataSource", "subsystemA-dataSource", "subsystemB-dataSource" }) public DataSource dataSource() { // instantiate, configure and return DataSource bean... } }

在 @Component 注解的类中不能定义 类内依赖的@Bean注解的方法。@Configuration可以。 @Configuration public class AppConfig {

@Bean public Foo foo() { return new Foo(bar()); }

@Bean public Bar bar() { return new Bar(); }

}

@Component和@Configuration作为配置类的差别

@Configuration public class MyTestConfig {

@Bean public Driver driver(){ Driver driver = new Driver(); driver.setId(1); driver.setName("driver"); driver.setCar(car()); return driver; }

@Bean public Car car(){ Car car = new Car(); car.setId(1); car.setName("car"); return car; } }

测试代码如下

@RunWith(SpringRunner.class) @SpringBootTest public class TestApplicationTests {

@Autowired private Car car;

@Autowired private Driver driver;

@Test public void contextLoads() { boolean result = driver.getCar() == car; System.out.println(result ? "同一个car" : "不同的car"); }

}

打印结果如下: 同一个car

替换为Component后的打印结果: 不同的car

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android小知识

CLEARTEXT communication to *** not permitted by network security policy

30720
来自专栏Java研发军团

SpringBoot注解大全,收藏一波!!!

@SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration...

10140
来自专栏流川疯编写程序的艺术

基于soap 的python 的web services 服务

web services 已经不再流行,但是,由于它的在接口技术中有着非常重要的地位,同时现在最主要的Web 服务设计模型REST其实也属于web servic...

15510
来自专栏JiekeXu之路

Python爬虫常用库的安装

Urllib、re是自带的库,而requests库可使用pip3 install requests安装

15020
来自专栏老码农的一亩三分地

《细说PHP》第四版 样章 第二章 PHP的应用与发展 1

学习任何编程语言之前,先了解一下它的应用与发展是很有必要的。从Web开发的历史看来,PHP、Python和Ruby几乎是同时出现的,都是十分有特点、优秀的开源语...

9710
来自专栏Super 前端

iBatis搭建JAVA项目

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

9120
来自专栏Super 前端

jQuery中调用JSON和XML数据--jQuery基础知识点(6)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

8620
来自专栏Super 前端

tomcat的jvm和session同步配置

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

9510
来自专栏Super 前端

Ajax在jQuery中应用--jQuery基础知识点(5)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

8120
来自专栏蚂蚁开源社区

微信小程序实战教程:火车票查询(含demo)

微信小程序自九月份推出内测资格以来,经历了舆论热潮到现在看似冷清,但并不意味着大家不那么关注或者不关注了。我想不管是否有内测资格,只要是感兴趣的开发者已经进入潜...

26030

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励