【Java高级】注解篇 - @Configureation
前言
@Configuration
用于定义配置类,可替换 XML 配置文件,被注解的类内部包含一个或多个@Bean
注解方法。可以被AnnotationConfigApplicationContext
或者AnnotationConfigWebApplicationContext
进行扫描。用于构建 bean 定义以及初始化 Spring 容器。 它是在 spring3.0 版本之后出现的。此注解是 spring 支持注解驱动开发的一个标志。表明当前类是 spring 的一个配置类,作用是替代 spring 的 applicationContext.xml。但其本质就是 @Component 注解,被此注解修饰的类,也会被存入 spring 的 IOC 容器。
属性:
value: 用于存入 spring 的 ioc 容器中 Bean 的 id
使用场景:
在注解驱动开发时,用于缩写配置的类,通常可以使用此注解。一般情况下,我们的配置也会分为主次配置,@Configureation 一般出现在主配置类上。值得注意的是,如果我们在注解驱动开发时,构建 ioc 容器使用的是传入字节码的构造函数,此注解可以省略,但是如果传入的是一个包,此注解则不能省略。
实例
@Configuration 加载 Spring 方法
Car.java
public class Car { private String name;</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String getName() { </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> name; } </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> setName(String name) { </span><span style="color: rgba(0, 0, 255, 1)">this</span>.name =<span style="color: rgba(0, 0, 0, 1)"> name; }
}
定义 Config 类
@Configuration public class Config { public Config() { System.out.println("TestConfig 容器初始化...");}@Bean(name </span>= "getMyCar"<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> Car getCar() { Car c </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Car(); c.setName(</span>"dankun"<span style="color: rgba(0, 0, 0, 1)">); </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> c; }
}
实例化
public void testConfig() { ApplicationContext context = new AnnotationConfigApplicationContext(Config.class); Car car = (Car)context.getBean("car"); System.out.println(car.getName()); } // 输出 // TestConfig 容器初始化... // dankun
@Configuration + @Component
@Configuration
也附带了 @Component 的功能。所以理论上也可以使用@Autowared
功能。上述代码可以改成下面形式
Car.java
@Component public class Car { @Value("dankun") private String name;</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String getName() { </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> name; } </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> setName(String name) { </span><span style="color: rgba(0, 0, 255, 1)">this</span>.name =<span style="color: rgba(0, 0, 0, 1)"> name; }
}
Config.java
@Configuration @ComponentScan("com.wuyue.annotation") public class Config { public Config() { System.out.println("TestConfig 容器初始化...");} }
测试主入口
public class TestConfig { @Test public void testConfig() { ApplicationContext context = new AnnotationConfigApplicationContext(Config.class); Car car = (Car)context.getBean("car"); System.out.println(car.getName()); } } // 输出 // TestConfig 容器初始化... // dankun
总结
- @Configuation 等价于
<Beans></Beans>
- @Bean 等价于
<Bean></Bean>
- @ComponentScan 等价于
<context:component-scan base-package="com.dxz.demo"/>
- @Component 等价于
<Bean></Bean>