SpringBoot
【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】
SpringBoot 原理篇
文章目录
- SpringBoot
- SpringBoot 原理篇
- 1 自动配置
- 1.7 bean 的加载方式【五】
- 1.7.1 register
1 自动配置
1.7 bean 的加载方式【五】
1.7.1 register
之前我们又说了一种加载bean 的方式,使用@Import 注解可以无侵入的将一个普通类变成一个bean 放到容器中进行管理。
现在来说第五种:
这种方式平时开发的时候不常用,但是如果是要做一些框架的话就可能会用到…【啊这】
直接开干,先来一个运行程序
package com.dingjiaxiong.app;
import com.dingjiaxiong.config.SpringConfig33;
import com.dingjiaxiong.config.SpringConfig4;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* ClassName: App5
* date: 2022/10/24 13:42
*
* @author DingJiaxiong
*/
public class App5 {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig4.class);
String[] names = ctx.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
System.out.println("=========================");
}
}
直接运行一下看看
OK,出来了这些东西无所谓
第五种方式就是在上下文对象已经初始化完毕之后,手工加载bean
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig4.class);
不要配置类、也不要配置文件【直接编程干】
【怎么做?】
package com.dingjiaxiong.app;
import com.dingjiaxiong.bean.Cat;
import com.dingjiaxiong.config.SpringConfig33;
import com.dingjiaxiong.config.SpringConfig4;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* ClassName: App5
* date: 2022/10/24 13:42
*
* @author DingJiaxiong
*/
public class App5 {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig4.class);
//在上下文对象已经初始化完毕之后,手工加载bean
ctx.registerBean("tom", Cat.class);
String[] names = ctx.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
System.out.println("=========================");
}
}
现在就手工加载了一个tom
直接运行,看看效果
没啥毛病,上来了
如果多复制几个, 看看会不会有冲突
运行结果
可以看到,出来了, 说明没有冲突
那究竟是哪个留下来了,验证一下,修改一下实体类
package com.dingjiaxiong.bean;
import org.springframework.stereotype.Component;
/**
* ClassName: Cat
* date: 2022/10/24 10:33
*
* @author DingJiaxiong
*/
//这个注解就代表了<bean> 这个标签
@Component("tom")
public class Cat {
public Cat(){
}
int age;
public Cat(int age) {
this.age = age;
}
@Override
public String toString() {
return "Cat{" +
"age=" + age +
'}';
}
}
再修改一下运行类
package com.dingjiaxiong.app;
import com.dingjiaxiong.bean.Cat;
import com.dingjiaxiong.config.SpringConfig33;
import com.dingjiaxiong.config.SpringConfig4;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* ClassName: App5
* date: 2022/10/24 13:42
*
* @author DingJiaxiong
*/
public class App5 {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig4.class);
//在上下文对象已经初始化完毕之后,手工加载bean
ctx.registerBean("tom", Cat.class,0);
ctx.registerBean("tom", Cat.class,1);
ctx.registerBean("tom", Cat.class,2);
String[] names = ctx.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
System.out.println("=========================");
System.out.println(ctx.getBean(Cat.class));
}
}
直接运行,看看是哪只猫
OK,效果很明显,最后一个留下来了【就像map,因为key 一样,最终只留了最后那个】
这个很有用,假如说现在系统里面有个bean,现在再来一个,把原来那个覆盖了,这就相当于把现有东西给隐藏掉了,只有新的生效了
即一个新的值替换老的值【这个场景就很多了,不做配置用老的值,但凡我一做,就用我们自己的值】
最后再提一个,如果我们仅仅是想注册进去一个bean,还可更简单
ctx.register(Mouse.class);
直接运行
并不是全路径
OK, 回顾一下
- 使用上下文对象在容器初始化完毕后注入bean