各种注解

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");
 2):Spring是如何获取Bean的定义的?通过注解启动,通过ApplicationContext获取的 基于ComponentScan() 来获取Bean的定义@Configuration 使用@Component 进行原注解,因此@Configuration 类也可以被组件扫描到(特别是使用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

使用后创建一个无参构造函数

原文地址:https://www.cnblogs.com/fanBlog/p/11115175.html