1.@Configuration有什么用? configuration
2.Spring是如何获取Bean的定义的?
1):通过启动一个AnnotationConfigApplicationContext 来引导这个@Configuration 注解的类,比如:
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.register(AllConfig.class); ctx.scan("com.test.aa"); ctx.refresh(); //web项目 AnnotationConfigWebApplicationContext configWebApplicationContext=new AnnotationConfigWebApplicationContext(); configWebApplicationContext.register(AllConfig.class); configWebApplicationContext.scan("com.test.aa"); configWebApplicationContext.refresh();
xml文件获取bean
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
3.@Autowired 、 @Inject、@Resource 的区别
@Inject: (表示该成员需要注入依赖项,可用在构造方法,方法,属性上面)通过AutowiredAnnotationBeanPostProcessor 类实现的依赖注入。位于javax.inject包内,是Java自带的注解。
@Autowired: 是Spring提供的注解,通过AutowiredAnnotationBeanPostProessor 类实现注入。位于org.springframework.beans.factory.annotation 包内,是Spring 中的注解,@Autowired 默认是通过byType 实现注入
@Resource: 通过CommonAnnotationBeanPostProcessor 类实现注入,@Resource 一般会指定一个name属性,默认是通过byName 实现注入。
区别:@Autowired和@Inject基本是一样的,因为两者都是使用AutowiredAnnotationBeanPostProcessor来处理依赖注入。但是@Resource是个例外,它使用的是CommonAnnotationBeanPostProcessor来处理依赖注入。当然,两者都是BeanPostProcessor。
4.@Value、@PropertySource 和 @Configuration?
@Configuration 可以和@Value 和@PropertySource 一起使用读取外部配置文件,具体用法如下:
在config 包下新建一个ReadValueFromPropertySource类,代码如下
通过@PropertySource引入的配置文件,使@Value 能够获取到属性值,在给myBean()方法指定了一个名称叫做myTestBean。
@PropertySource("classpath:beanName.properties") @Configuration public class ReadValueFromPropertySource { @Value("bean.name.component") String beanName; @Bean("myTestBean") public MyBean myBean(){ return new MyBean(beanName); } }
5.@Configuration 嵌套
@Configuration注解作用在类上,就和普通类一样能够进行相互嵌套,定义内部类。
@Configuration public class AppConfig{ @Inject DataSource dataSource; @Bean public MyBean myBean(){ return new MyBean(dataSource); } @Configuration static class DataConfig(){ @Bean DataSource dataSource(){ return new EmbeddedDatabaseBuilder().build() } } }
6.@ConditionalOnMissingBean(PaginationInterceptor.class)
在没有PaginationInterceptor改bean的时候,创建bean到spring容器中
7.@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
在没有SqlSessionFactory,SqlSessionFactoryBean已经存在spring容器的时候加载
@AllArgsConstructor
使用后添加一个构造函数,该构造函数含有所有已声明字段属性参数
@NoArgsConstructor
使用后创建一个无参构造函数