注解开发
将xml格式的配置,按照annotation改写增强
依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
最简配置
(什么都不做,无自定义的Bean)
使用注解
- @Configuration标识为配置类
- @Bean标签标识的方法的返回值是bean实例(默认使用方法名作为bean的id,重复出现是 后出现的bean覆盖先出现的bean)
- 使用new AnnotationConfigApplicationContext(MainConfig.class)创建IOC容器
package cn.config;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MainConfig {
}
package cn.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import cn.config.MainConfig1;
public class TestMainConfig {
@Test
public void mainConfig1(){
ApplicationContext ac = new AnnotationConfigApplicationContext(MainConfig.class);
System.out.println(ac.getApplicationName());
String[] beans = ac.getBeanDefinitionNames();
for(int i=beans.length-1;i>=0;i--){
System.out.println(beans[i]);
}
}
}
添加自定义Bean
@Configuration
public class MainConfig {
//字符串类型Bean
@Bean
public String test(){
return "Hello";
}
//自定义类型Person的Bean
@Bean
public Person person(){
return new Person();
}
//默认配置下会覆盖前一个Bean
@Bean
public Person person(String name){
return new Person(test(),13);
}
}
public class Person {
private String name;
private int age;
public Person(){
}
public Person(String name,int age){
this.name = name;
this.age = age;
}
public String toString(){
return this.name+" "+this.age;
}
}
public class TestMainConfig {
@Test
public void mainConfig1(){
ApplicationContext ac = new AnnotationConfigApplicationContext(MainConfig.class);
System.out.println(ac.getApplicationName());
String[] beans = ac.getBeanDefinitionNames();
for(int i=beans.length-1;i>=0;i--){
System.out.println(beans[i]);
}
System.out.println(ac.getBean("test"));
System.out.println(ac.getBean("person"));//输出第二个person
}
}
观察发现
@Component
public @interface Configuration {
@AliasFor(
annotation = Component.class
)
String value() default "";
}
@Configuration标签是Component的别名 也就是组件
(此处未仔细深究 暂且这么理解,测试发现将@Configuration-->@Component测试类正常运行)