上一篇已经介绍了自动化装配https://www.cnblogs.com/fionyang/p/11123900.html

  接下来就要介绍两种显示装配的方式了,分别是java代码装配和XML文件装配。。。

  那我不禁就要问了,既然自动装配方案这么好用,并且在大多数情况下也被推荐使用,为啥还要另外两种装配方案呢?那只是因为有时自动化装配方案也行不通,比如你想将第三方库中的组件装配到你的应用中,在这种情况下,是没有办法在它的类上添加@Component和@Autowired注解的啊,所以只能换方案喽。。。。

  2. 通过java代码装配bean

    1)创建配置类

      这种方案其实就是创建JavaConfig类,首先看看怎么用的,如下:

@Configuration
public class CarConfig{}

  上面这种,其实就创建了一个JavaConfig类,关键在于为其添加@Configuration注解,@Configuration表明这个类(CarConfig类)就是一个配置类,该类包含在Spring应用上下文中如何创建bean的细节。

2)声明简单bean

  要在JavaConfig类中声明bean,只需要编写一个方法,这个方法会创建一个实例,然后给这个方法添加@Bean注解即可,如下:

@Configuration
public class CarConfig{
@Bean
public Wheels getWheels() {
return new Wheels();
}
}

  这个@Bean注解会告诉Spring这个方法将会返回一个对象,该对象注册为Spring应用上下文中的bean,并且这个bean的ID将会和方法名相同,也就是getWheels。可是我不想去这个名字啊,太丑了吧,咋办?来来来,看下面:

@Configuration
public class CarConfig{
@Bean(name = "wheels")
public Wheels getWheels() {
return new Wheels();
}
}

  这才对嘛,通过name属性可以指定bean的ID,所以这里这个bean的ID将会是wheels。。。。事实上,这种方式来声明bean有很大的好处,就是@Bean所注解的方法内部可以自行发挥,只要最终生成的是一个返回类型的势力即可,如下:

//此处假设Wheels是一个接口,LexusWheels、AudiWheels和benzWheels都是Wheels的实现类
@Configuration
public class CarConfig{
@Bean(name = "wheels")
public Wheels getWheels() {
int flag = (int)Math.floor(Math.random() * 3);
if (flag == 0) {
return new LexusWheels();
}else if (flag == 1) {
return new AudiWheels();
}else {
return new BenzWheels();
}
}
}

  上面这段代码可以很好的说明,我们对bean的创建有更好的掌控性,可以尽情添加自己想要的东西。

3)借助JavaConfig实现注入

  在JavaConfig中装配bean最简单的方式就是引用创建bean的方法,如:

@Configuration
public class CarConfig{
@Bean(name = "wheels")
public Wheels getWheels() {
return new Wheels();
} @Bean
public Car getCar() {
return new Car(getWheels());
}
}

  这里在创建ID为getCar的bean时,会直接注入getWheels,看起来getWheels好像是通过调用getWheels()方法得到的,但是不是这样的,由于getWheels()方法上面加了@Bean注解,Spring会拦截对该方法的调用,并直接返回该方法生成的bean,而不是每次都实际调用。可是只能这么注入吗?看起来怪怪的,还难理解,有木有其他方式呢?那既然问了,就必须有,哈哈,

最新文章

  1. Latch2:Latch和性能
  2. Java笔记7-多态父类静态
  3. SVN(TortoiseSVN)提交时忽略bin跟obj目录
  4. 织梦dedecms模板调用标签大全-提高制作模板速度
  5. Python流程控制
  6. 用IDEA调试Play工程
  7. 统计php源码行
  8. 深入浅出Node.js (11) - 产品化
  9. 计算textView的高度
  10. java_JDBC(2)
  11. 《Github入门与实践》读书笔记 蟲咋先生的追求之旅(上)
  12. NOI 2009 诗人小G
  13. CTF---Web入门第五题 貌似有点难
  14. PyTorch官方中文文档:torch
  15. 【HDU - 1429】胜利大逃亡(续) (高级搜索)【状态压缩+BFS】
  16. LeetCode(115):不同的子序列
  17. 10款基于jquery的web前端动画特效
  18. 给PHP开启shmop扩展实现共享内存
  19. Hadoop如何将TB级大文件的上传性能优化上百倍?
  20. [日常] Go语言圣经--复合数据类型,数组习题

热门文章

  1. WPF范围选择控件(RangeSelector)
  2. 微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
  3. HDU5187 zhx's contest(计数问题)
  4. WPF中的资源简介、DynamicResource与StaticResource的区别
  5. 高手问答精选:Go 语言 —— 云计算时代的 C 语言(类似于一个FAQ)
  6. Linux参数调优
  7. Win8 Metro(C#)数字图像处理--2.52图像K均值聚类
  8. WPF 在一个dll创建一个Window(包含xaml),在另一个dll中再次继承 会出错
  9. Java中的逆变与协变 专题
  10. ps 专题