@SpringBootApplication //表示是主配置类。主配置的字节码对象是SpringApplication.run()方法(启动方法)的参数,
1.@Configuration(配置类)
2.@Bean(返回值注入sppring容器)
//@Configuration //表示这是一个配置类,配置类也是组件 //proxyBeanMethods=true(默认)表示代理这个配置类的方法,调用方法获取的对象都是容器中对象(容器中还是单例的) @Configuration(proxyBeanMethods=true) public class MyConfig { @Bean //给容器添加组件(ioc),以方法名作为id,返回值就是容器中的实例,默认单实例的 public Student student(){ return new Student(); } }
@SpringBootApplication //表示是主配置类 public class SpringMybatisApplication { public static void main(String[] args) { //返回值类型ConfigurableApplicationContext是ios容器 ConfigurableApplicationContext run = SpringApplication.run(SpringMybatisApplication.class, args); // 可以获得里面的组件 String[] beanDefinitionNames = run.getBeanDefinitionNames(); for (String beanName:beanDefinitionNames){ System.out.println(run.getBean(beanName)); } //获得配置类的组件 System.out.println(run.getBean("student")); System.out.println(run.getBean("student")); } }
1.当/proxyBeanMethods=flase
2.当/proxyBeanMethods=true(默认)
结论:
1.proxyBeanMethods不管为true还是flase,容器中都默认是单实例
2.可以发现当/proxyBeanMethods=true(默认)表示代理这个配置类的方法,调用方法获取的对象都是容器中对象(单例),不会返回一个新对象,也就是依赖容器中的·对象
3.proxyBeanMethods=flase时是每次获取的对象都一样,(方法没被代理,返回一个新对象)
(也就是说springboot会根据这个属性true or flase来选择是否代理我们的配置类方法;代理的方法就是去spring容器中获取对象,没代理的就该怎么返回怎么返回
3.@Component 、 @Controller、@Service、@Reposity (用法和spring中一样)
4.@ComponentScan、@Import
.4.1@ComponentScan
表示组件扫描,不能和springbootApplication一起用,因为springbootapplication注解被他注解了
(好像可以用@ComponentScans)
4.2@Import
作用给spring容器中注入组件
@Import(组件字节码对象) :会调用无参构造注入spring容器,默认组件名字是全类名
5.@Conditional:使用他的派生注解
条件装配,满足Conditional指定条件的,则组件进行注入。
5.1@ConditionalOnBean(name = "name")判断容器中是否有名字是name的组件,有注入,没有就不注入,
还可以标注在配置类上,表示类中所有方法都要这个条件成体才能注入对应组件
还有很多个其他的条件装配类。如下
6.@ImportResource("classpath:***.xml")
这样可以将配置文件中配置的bean注入容器