相信大家在学习spring时候都会遇到@Configuration和@Bean注解。该注解最终目的是将bean类交给Spring容器管理,前篇文章也对Spring容器做了解释 。】
【@Configuration 】
作用: @Configuration 作用于类上面,告诉spring当前类是作为配置文件使用的,相当于Spring中的xml配置文件。
//作用于类上面,告诉spring当前类是作为配置文件使用的,相当于Spring中的xml配置文件
@Configuration
public class TestConfig {
}
【@Bean】
作用:配置类里面使用@Bean注解,表示该对象被注册为在 Spring 容器中的 bean,带有 @Bean 的注解方法将返回一个对象,并默认是单实例的 。
一、先新建一个普通类TestBean,该类有个方法getBean()。
//新建一个普通类TestBean,该类有个方法getBean()
public class TestBean {
public void getBean() {
System.out.println("成功获取Bean类方法");
}
}
二、在配置类里面将该类交给Spring容器管理
//作用于类上面,告诉spring当前类是作为配置文件使用的,相当于Spring中的xml配置文件
@Configuration
public class TestConfig {
//带有 @Bean 的注解方法将返回一个对象,表示该对象被注册为在 Spring 容器中的 bean
@Bean
public TestBean getBean(){
return new TestBean();
}
}
三、创建一个controller,启动项目,访问获取Spring容器里面注册的Bean。
@RestController
public class BeanController {
@GetMapping("/getBean")
public void getBean() {
//1.返回我们IOC容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestConfig.class);
//2.查看容器里面的组件
String[] strings = applicationContext.getBeanDefinitionNames();
for(String string : strings) {
System.out.println(string);
}
}
}
在浏览器请求访问/getBean路径,结果如下:
可以看出,testConfig和getBean都被注入到Spring容器里面。配置了@Bean的方法将返回一个对象,以方法名作为Bean的id。返回类型就是Bean类型。
四、可以更改Bean注册的id
//作用于类上面,告诉spring当前类是作为配置文件使用的,相当于Spring中的xml配置文件
@Configuration
public class TestConfig {
//更改Bean注册的名字
@Bean("myBean")
public TestBean getBean(){
return new TestBean();
}
}
在浏览器请求访问/getBean路径,结果如下:
五、注入Bean,调用使用
@RestController
public class BeanController {
//调用
private TestBean myBean;
//通过构造器方式注入
public BeanController(TestBean myBean) {
this.myBean = myBean;
}
@GetMapping("/hello")
public void test() {
//这里并不需要重新new对象就可以调用方法,使用的是spring容器的实例
myBean.getBean();
}
}
调用方法成功返回方法的内容:
由上可见,访问TestBean的方法并不需要重新new对象,直接通过注入的方式就可以调用方法,使用的是spring容器的已经注册好的TestBean实例。
五、@Bean注册的对象默认是单实例
@RestController
public class BeanController {
//调用
private TestBean myBean;
public BeanController(TestBean myBean) {
this.myBean = myBean;
}
@GetMapping("/getBean")
public void getBean() {
//1.返回我们IOC容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestConfig.class);
//2.查看容器里面的组件
String[] strings = applicationContext.getBeanDefinitionNames();
for(String string : strings) {
System.out.println(string);
}
TestBean myBean = applicationContext.getBean("myBean",TestBean.class);
System.out.println("第一个Bean:"+myBean);
TestBean myBean2 = applicationContext.getBean("myBean",TestBean.class);
System.out.println("第二个Bean:"+myBean2);
}
}
在浏览器请求访问/getBean路径,结果如下:
由此可见,从spring容器里获取出的Bean类是同一个实例,也验证了@Bean注册的对象默认是单实例。
将Bean注册修改为多实例
//作用于类上面,告诉spring当前类是作为配置文件使用的,相当于Spring中的xml配置文件
@Configuration
public class TestConfig {
//@Scope("prototype")就是设置为多实例
@Bean("myBean")
@Scope("prototype")
public TestBean getBean(){
return new TestBean();
}
}
在浏览器请求访问/getBean路径,结果如下:
可以看出,配置@Scope(“prototype”)可以将Bean设置为多实例。