先按照简单代码示例注解的作用,最后再做一个总结。
从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
1.先看看最简单的应用,我们创建一个类,加上Configuration注解
@Configuration
public class ConfigurationTest {
public ConfigurationTest() {
System.out.println("TestConfiguration容器启动初始化。。。");
}
}
然后启动主程序,让我们看看输出,很明显,只要加上了这个注解,就可以启动spring容器
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.4.1)
2021-01-12 20:13:46.018 INFO 35216 --- [ main] com.example.demo.DemoApplication : Starting DemoApplication using Java 1.8.0_211 on DESKTOP-AD5JM34 with PID 35216 (D:\Idea\workspace\demo\target\classes started by dell in D:\Idea\workspace\demo)
2021-01-12 20:13:46.022 INFO 35216 --- [ main] com.example.demo.DemoApplication : No active profile set, falling back to default profiles: default
2021-01-12 20:13:46.801 INFO 35216 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2021-01-12 20:13:46.809 INFO 35216 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2021-01-12 20:13:46.809 INFO 35216 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41]
2021-01-12 20:13:46.876 INFO 35216 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2021-01-12 20:13:46.876 INFO 35216 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 808 ms
TestConfiguration容器启动初始化。。。
2.我们再结合@Bean注解来加载对象,新建一个TestBean对象
public class TestBean {
private String username;
private String url;
private String password;
public void sayHello() {
System.out.println("TestBean sayHello...");
}
public String toString() {
return "username:" + this.username + ",url:" + this.url + ",password:" + this.password;
}
public void start() {
System.out.println("TestBean 初始化。。。");
}
public void cleanUp() {
System.out.println("TestBean 销毁。。。");
}
}
这次我们直接在刚刚的类里面用main方法来测试,而不是项目的启动类
@Configuration
public class ConfigurationTest {
public ConfigurationTest() {
System.out.println("TestConfiguration容器启动初始化。。。");
}
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(ConfigurationTest.class);
TestBean testBean = context.getBean(TestBean.class);
testBean.sayHello();
}
@Bean
@Scope("prototype")
public TestBean testBean() {
return new TestBean();
}
}
当启动main方法后,我们来看看输出
很明显,对象创建好了,而且sayHello方法也能正常调用
20:18:20.699 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'configurationTest'
TestConfiguration容器启动初始化。。。
20:18:20.704 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'testBean2'
TestBean sayHello...
当然@Bean还可以加其他参数
我们可以加上name(不指定就是方法名同名),destroyMethod ,initMethod 方法,指定为我们刚刚创建的对象中TestBean 中的方法
@Bean(name = "TestBean",destroyMethod = "cleanUp",initMethod = "start")
@Scope("prototype")
public TestBean testBean() {
return new TestBean();
}
让我们再看看输出
20:21:07.822 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'configurationTest'
TestConfiguration容器启动初始化。。。
TestBean 初始化。。。
TestBean sayHello..
@Bean注解默认作用域为单例singleton作用域,可通过@Scope(“prototype”)设置为原型作用域
3.我们可以用@Configuration配合@Component注册一个Bean
我们为对象加上@Component注解
@Component
public class TestBean {
private String username;
private String url;
private String password;
public void sayHello() {
System.out.println("TestBean sayHello...");
}
public String toString() {
return "username:" + this.username + ",url:" + this.url + ",password:" + this.password;
}
public void start() {
System.out.println("TestBean 初始化。。。");
}
public void cleanUp() {
System.out.println("TestBean 销毁。。。");
}
}
然后再@Configuration注解的类中加上@ComponentScan
@Configuration
@ComponentScan(basePackages = "com.example.demo.configuration")
public class ConfigurationTest {
public ConfigurationTest() {
System.out.println("TestConfiguration容器启动初始化。。。");
}
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(ConfigurationTest.class);
TestBean testBean = context.getBean(TestBean.class);
testBean.sayHello();
}
// @Bean(name = "TestBean",destroyMethod = "cleanUp",initMethod = "start")
// @Scope("prototype")
// public TestBean testBean() {
// return new TestBean();
// }
}
看看输出,仍然没有问题
20:24:41.892 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'configurationTest'
TestConfiguration容器启动初始化。。。
20:24:41.902 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'testBean'
TestBean sayHello...
最后总结一下,相比于SSM的xml
@Configuation等价于
@Bean等价于
@ComponentScan等价于