有关组件添加的注解@Bean、@Component、@Controller、@Service、@Repository
@Configuration
- 之前spring创建xml的方式
2. 现在通过标有@Configuration的配置类
package com.ll.config;import com.ll.domain.Pets;
import com.ll.domain.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration // 告诉springboot这是配置文件,以前xml能做的,它都能做
public class MyConfig {
//给容器中添加一个user组件(组件id:方法名;组件类型:返回类型;返回值:组件容器中的实例(单例))// @Bean("user01") 自定义组件id@Beanpublic User user01(){
return new User(18,"zhangsan");}@Beanpublic Pets pets01(){
return new Pets("cat");}
}
- 打印的结果
可以看到MyConfig 本身就是组件
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);// 固定写法String[] beanDefinitionNames = run.getBeanDefinitionNames();for (String a:beanDefinitionNames) {
System.out.println(a);}}
}
4.容器中创建的组件实单例的
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);// 固定写法String[] beanDefinitionNames = run.getBeanDefinitionNames();for (String a:beanDefinitionNames) {
System.out.println(a);}User user1 = run.getBean("user01",User.class);User user2 = run.getBean("user01",User.class);System.out.println(user1==user2);// true 在容器中是单实例的}
- springboot2新增特性proxyBeanMethods
proxyBeanMethods:代理bean的方法
Full(proxyBeanMethods = true),速度会慢一点,默认为true
Lite(proxyBeanMethods = false),springboot不会检查bean是否在容器中已经存在,所以速度很快,适用于没有组件依赖的情况
// @Configuration的源码,其中有proxyBeanMethods()
@Target({
ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
@AliasFor(annotation = Component.class)String value() default "";boolean proxyBeanMethods() default true;
}
组件依赖
Dog和Pets有组件依赖
public class Pets {
private String name;public Pets(){
}private Dog dog;public Dog getDog() {
return dog;}public void setDog(Dog dog) {
this.dog = dog;}public Pets(String name) {
this.name = name;}public String getName() {
return name;}public void setName(String name) {
this.name = name;}@Overridepublic String toString() {
return "Pets{" +"name='" + name + '\'' +'}';}
}
@Import
给容器添加组件,类注解
@Import({User.class, DBHelper.class})
@Conditional
满足Conditional的条件,才进行组件注入
可以作用于类和方法
@ImportResource
springboot的容器中没有spring的xml中配置的bean
如果要做大量的bean迁移到springboot环境中,可以使用@ImportResource注解引入原来的xml的配置
@ImportResource("classpath:beans.xml")
public class MyConfig {
}
@ConfigurationProperties
是跟application.properties里面进行绑定的
组件需要在容器中
配置绑定
把properties配置文件配到javabean里
方式1:
@Component + @ConfigurationProperties
@Component
@ConfigurationProperties(prefix = "zhangsan")
public class User {
// 省略bean
}
方式2:
@EnableConfigurationProperties + @ConfigurationProperties
如果要注册的类是引的第三方包里的,不能加@Component注解到包里,这时候就需要用这种方式
开启配置绑定功能并把这个组件自动注册到容器中
@Component
@ConfigurationProperties(prefix = "zhangsan")
public class User {
// 省略bean
}
@EnableConfigurationProperties(User.class)
public class MyConfig {
// 省略
}
原来写法: