有关组件添加的注解@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
@Bean
public User user01(){
return new User(18,"zhangsan");
}
@Bean
public 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;
}
@Override
public 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 {
// 省略
}
原来写法: