7种SpringBoot注⼊Bean的⽅式
背景
通过注解注⼊的⼀般形式
通过构造⽅法注⼊Bean
通过set⽅法注⼊Bean
通过属性去注⼊Bean
通过List注⼊Bean
通过Map去注⼊Bean
背景
我们谈到Spring的时候⼀定会提到IOC容器、DI依赖注⼊,Spring通过将⼀个个类标注为Bean的⽅法注⼊到IOC容器中,达到了控制反转的效果。那么我们刚开始接触Bean的时候,⼀定是使⽤xml⽂件,⼀个⼀个的注⼊,就例如下⾯这样。
<bean id="bean" class="beandemo.Bean" />
我们的项⽬⼀般很⼤的话,就需要成千上百个Bean去使⽤,这样写起来就很繁琐。那么Spring就帮我们实现了⼀种通过注解来实现注⼊的⽅法。只需要在你需要注⼊的类前⾯加上相应的注解,Spring就会帮助我们扫描到他们去实现注⼊。
xml扫描包的⽅式
<context:component-scan base-package="company.beandemo"/>
通过注解注⼊的⼀般形式
⼀般情况下,注⼊Bean有⼀个最直⽩,最易懂的⽅式去实现注⼊,下⾯废话先不多说,先贴代码。
Bean类
public class MyBean{
}
Configuration类
//创建⼀个class配置⽂件
@Configuration
public class MyConfiguration{
//将⼀个Bean交由Spring进⾏管理
@Bean
public MyBean myBean(){
return new MyBean();
}
}
Test类
与xml有⼀点不同,这⾥在Test中,实例化的不再是ClassPathXmlApplicationContext,⽽是获取的AnnotationConfigApplicationContext实例。
ApplicationContext context = new AnnotationConfigApplicationContext(MyConfiguration.class);
MyBean myBean = Bean("myBean",MyBean.class);
System.out.println("myBean = " + myBean);
上⾯的代码中MyBean也就是我们需要Spring去管理的⼀个Bean,他只是⼀个简单的类。⽽MyConfiguration中,我们⾸先⽤
@Configuration注解去标记了该类,这样标明该类是⼀个Spring的⼀个配置类,在加载配置的时候会去加载他。
在MyConfiguration中我们可以看到有⼀个⽅法返回的是⼀个MyBean的实例,并且该⽅法上标注着@Bean的注解,标明这是⼀个注⼊Bean 的⽅法,会将下⾯的返回的Bean注⼊IOC。
通过构造⽅法注⼊Bean
我们在⽣成⼀个Bean实例的时候,可以使⽤Bean的构造⽅法将Bean实现注⼊。直接看代码
public class MyBeanConstructor {
private AnotherBean anotherBeanConstructor;
@Autowired
public MyBeanConstructor(AnotherBean anotherBeanConstructor){
this.anotherBeanConstructor = anotherBeanConstructor;
}
@Override
public String toString() {
return "MyBean{" +
"anotherBeanConstructor=" + anotherBeanConstructor +
'}';
}
}
AnotherBean类
@Component(value="Bean的id,默认为类名⼩驼峰")
public class AnotherBean {
}
Configuration类
@Configuration
@ComponentScan("company.annotationbean")
public class MyConfiguration{
}
这⾥我们可以发现,和⼀般⽅式注⼊的代码不⼀样了,我们来看看新的注解都是什么意思:
@AutoWired
简单粗暴,直接翻译过来的意思就是⾃动装配:wrench:,还不理解为什么叫⾃动装配:wrench:?看了下⼀个注解的解释你就知道了。若是在这⾥注⼊的时候指定⼀个Bean的id就要使⽤@Qualifier注解
@Component(默认单例模式)
什么??这翻译过来是零件,怎么感觉像是修汽车??是的,Spring管理Bean的⽅法就是修汽车的⽅式。我们在需要将⼀个类变成⼀个Bean被Spring可以注⼊的时候加上注解零件@Conmonent,那么我们就可以在加载Bean的时候把他像零件⼀样装配:wrench:到这个IOC汽车上了
在这⾥我们还有⼏个其他的注解也可以实现这个功能,也就是细化的@Component:
@Controller 标注在Controller层
@Service 标注在Service层
@Repository 标注在dao层
@ComponentScan("")
还是翻译,零件扫描,我们去看看括号⾥的“零件仓库”⾥⾯,哪些“零件”(类)需要被装载,Spring就会去扫描这个包,将⾥⾯所有标注了@Component的类进⾏注⼊。
这⾥的通过构造⽅法进⾏注⼊就很好理解了,我们在装配MyBean这个零件的时候,突然发现他必须在AnotherBean的基础上才能安装到IOC⾥⾯,那么我们就在每次装配MyBean的时候⾃动装配:wrench:⼀个AnotherBean进去。举个:chestnut:吧:
还是以汽车为例,我们在踩油门出发之前,是不是必须发车??这⾥的AutoWired的内容就像发车,你不发车,这个油门你踩断都没有⽤,他都不会⾛。
通过set⽅法注⼊Bean
我们可以在⼀个属性的set⽅法中去将Bean实现注⼊,看代码吧
public class MyBeanSet {
private AnotherBean anotherBeanSet;
@Autowired
spring ioc注解public void setAnotherBeanSet(AnotherBean anotherBeanSet) {
this.anotherBeanSet = anotherBeanSet;
}
@Override
public String toString() {
return "MyBeanSet{" +
"anotherBeanSet=" + anotherBeanSet +
'}';
}
}
Configuration类和 Test类
同上⼀个,就不贴了
这⾥我们发现在setter⽅法上我们有⼀个@AutoWired,与上⾯不同的是,我们不会在实例化该类时就⾃动装配:wrench:这个对象,⽽是在显式调⽤setter的时候去装配。
通过属性去注⼊Bean
我们前⾯两种注⼊的⽅式诸如时间不同,并且代码较多,若是通过属性,即就是
@Component
public class MyBeanProperty {
@Autowired
private AnotherBean anotherBeanProperty;
@Override
public String toString() {
return "MyBeanProperty{" +
"anotherBeanProperty=" + anotherBeanProperty +
'}';
}
}
这⾥我们可以看到我们这个类中需要使⽤AnotherBean这个实例对象,我们可以通过@AutoWired去⾃动装配它。
对于有些⼩伙伴问私有属性,Spring怎么去加载它到IOC的?推荐去看看反射
通过List注⼊Bean
MyBeanList类
@Component
public class MyBeanList {
private List<String> stringList;
@Autowired
public void setStringList(List<String> stringList) {
this.stringList = stringList;
}
public List<String> getStringList() {
return stringList;
}
}
MyConfiguration类
@Configuration
@ComponentScan("annoBean.annotationbean")
public class MyConfiguration {
@Bean
public List<String> stringList(){
List<String> stringList = new ArrayList<String>();
stringList.add("List-1");
stringList.add("List-2");
return stringList;
}
}
这⾥我们将MyBeanList进⾏了注⼊,对List中的元素会逐⼀注⼊。下⾯介绍另⼀种⽅式注⼊List
MyConfiguration类
@Bean
//通过该注解设定Bean注⼊的优先级,不⼀定连续数字
@Order(34)
public String string1(){
return "String-1";
}
@Bean
@Order(14)
public String string2(){
return "String-2";
}
注⼊与List中泛型⼀样的类型,会⾃动去匹配类型,及时这⾥没有任何List的感觉,只是String的类型,但他会去通过List的Bean的⽅式去注⼊。
第⼆种⽅式的优先级⾼于第⼀种,当两个都存在的时候,若要强制去使⽤第⼀种⽅式,则要去指定Bean的id即可
通过Map去注⼊Bean
@Component
public class MyBeanMap {
private Map<String,Integer> integerMap;
public Map<String, Integer> getIntegerMap() {
return integerMap;
}
@Autowired
public void setIntegerMap(Map<String, Integer> integerMap) {
this.integerMap = integerMap;
}
}
@Bean
public Map<String,Integer> integerMap(){
Map<String,Integer> integerMap = new HashMap<String, Integer>();
integerMap.put("map-1",1);
integerMap.put("map-2",2);
return integerMap;
}
@Bean
public Integer integer1(){
return 1;
}
@Bean
public Integer integer2(){
return 2;
}
同样这⾥也具有两种⽅式去注⼊Map类型Bean,且第⼆种的优先值⾼于第⼀种
以上就是Bean通过注解注⼊的⼏种⽅式,⼤家可以对⽐着xml注⼊的⽅式去看。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论