Spring注解配置框架

JAVA官方注解框架:
   JSR 303  数据合法性校验标准框架
     JSR 330  容器依赖注入注解              

注解可以包含属性和方法
     属性是没有参数的方法,方法名即为属性名,方法的返回值即使属性的类型。可以使用default定义默认值
     方法
     
注解的字段之上可以在使用注解注释。     


各种框架的注解:
   Spring框架的注解
   
   
   Hibernate框架的注解
   
注解:
    注解的可继承性
        如果父类使用的注解被标示为可继承,则其子类默认具有父类的可继承注解
    
    在Class的实现中,注解数据分为两部分:
          类的所有注解 getAnnotations
              类的所有注解= 类自身直接声明的注解 + 继承自父类的注解
              
          类声明的注解 getDeclaredAnnotations   
              类自身直接声明的注解
              
   
Class 
   Class代表类和接口。注解是接口,默认继承自Annotation接口,就像所有的类都默认继承自Object。所以Class也可以用于提取
注解的信息。
   getAnnotatedInterfaces  
       获取注解实现的接口。
       
   getAnnotatedSuperclass
       获取带注解的父类。如果继承的父类带注解,则返回。
       
           
              
              
GenericDeclaration
     泛型声明,Class继承,表示类的泛型信息。

TypeVariable
    用以表示泛型的类型变量,类型变量提供类型的边界,泛型的声明信息,类型名。在泛型的时候用
    
Type
    类型,代表类的类型,每个类都是类名。面向对象中的类型。类型名就是自定义类的类名,Class实现返回,
        getName = getTypeName     (数组类型是个列外) 
       
AnnotatedElement
    表示类能被注解,提供注解的相关信息,有Class,Method, Field, Constructor这些反射类实现,获取类型的注解信息。                     
    
    
AnnotatedType
   注解的类型,和Type类型,用于标示类的类型名,此AnnotatedType标示主机的类型名,一般就是注解接口名。
   
Annotation
     Class<? extends Annotation> annotationType();   返回注解对应的类类型,一如普通类的Class   
       
       
       
一个应用的加载流程:
     
     
     
     
Spring注解APT

    StandardAnnotationMetadata  对注解类进行注解元数据自省。
    
    ConditionEvaluator.shouldSkip  @Conditional check
    
Spring注解配置框架:
    
@Configuration
     1、类XML配置文件的功能,可以在其中声明使用@Bean注释的方法,用于导入Bean到Spring Bean容器中
                     @Configuration
                     public class AppConfig {
                          @Bean
                          public MyBean myBean() {
                              // instantiate, configure and return bean ...
                          }
                       }
         2、使用@Configuration注解作为上下文的资源配置文件,配合使用@Import、@ImportResource,以下几个Spring上下文可以使用
AnnotationConfigApplicationContext、AnnotationConfigWebApplicationContext。
             AnnotationConfigApplicationContext ctx =  new AnnotationConfigApplicationContext();
                         ctx.register(AppConfig.class);
                         ctx.refresh();
                         
                         MyBean myBean = ctx.getBean(MyBean.class);         
          
          也可以这样:扫描配置文件,从配置文件加载注解类。
              <beans>
                                <context:annotation-config/>
                                <bean class="com.acme.AppConfig"/>
                          </beans>       
     3、可以<context:component-scan/>被组件扫描器扫描加载
     4、可以在@Configuration修饰的配置文件上使用@ComponentScan
             @Configuration
                     @ComponentScan("com.acme.app.services")
                     public class AppConfig {
                         // various &#064;Bean definitions ...
                     }
     5、在@Configuration修饰的配置使用外部值,通过引入Enviroment
                   @Configuration
                      public class AppConfig {
                          @Inject Environment env;  //也可以使用@Autowire
                     
                          @Bean
                          public MyBean myBean() {
                              MyBean myBean = new MyBean();
                              myBean.setName(env.getProperty("bean.name"));
                              return myBean;
                          }
           }
    6、可以使用properties文件,使用@Properties注解,将properties文件注入到Enviroment实例中
             @Configuration
                         @PropertySource("classpath:/com/acme/app.properties")
                         public class AppConfig {
                             @Inject Environment env;
                        
                             @Bean
                             public MyBean myBean() {
                                 return new MyBean(env.getProperty("bean.name"));
                             }
                         }     
        7、使用@PropertySource和@Value配合使用,引入外部值
                     @Configuration
                     @PropertySource("classpath:/com/acme/app.properties")
                     public class AppConfig {
                         @Value("${bean.name}") String beanName;
                    
                         @Bean
                         public MyBean myBean() {
                             return new MyBean(beanName);
                         }
                     }        
          8、@Configuration和@Import组合使用:
                     
                     @Configuration
                     public class DatabaseConfig {
                         @Bean
                         public DataSource dataSource() {
                             // instantiate, configure and return DataSource
                         }
                     }
                     
                      @Configuration
                      @Import(DatabaseConfig.class)
                      public class AppConfig {
                          @Inject DatabaseConfig dataConfig;
                     
                          @Bean
                          public MyBean myBean() {
                              // reference the dataSource() bean method
                              return new MyBean(dataConfig.dataSource());
                          }
                      }
            9、@Profile、@Configuration结合使用,那个Profile被激活,加载那个类
            
                          @Profile("embedded")
                          @Configuration
                          public class EmbeddedDatabaseConfig {
                              @Bean
                              public DataSource dataSource() {
                                  // instantiate, configure and return embedded DataSource
                              }
                          }          
                          
                         @Profile("production")
                         @Configuration
                         public class ProductionDatabaseConfig {
                             @Bean
                             public DataSource dataSource() {
                                 // instantiate, configure and return production DataSource
                             }
                         }
            10、@Configuration和@ImportResource结合使用
                   @Configuration
                         @ImportResource("classpath:/com/acme/database-config.xml")
                         public class AppConfig {
                             @Inject DataSource dataSource; // from XML
                        
                             @Bean
                             public MyBean myBean() {
                                 // inject the XML-defined dataSource bean
                                 return new MyBean(this.dataSource);
                             }
                         }             
            11、使用内嵌的@Configuration,内嵌的@Configuration可以和@Profile结合使用,提供可选项。
                         @Configuration
                         public class AppConfig {
                             @Inject DataSource dataSource;
                        
                             @Bean
                             public MyBean myBean() {
                                 return new MyBean(dataSource);
                             }
                        
                             @Configuration
                             static class DatabaseConfig {
                                 @Bean
                                 DataSource dataSource() {
                                     return new EmbeddedDatabaseBuilder().build();
                                 }
                             }
                         }    
                         
            12、@Configuration懒加载。使用@Bean修饰的方法都是立即创建实例,可以使用@Lazy修饰符,来实现懒加载。
                         @Configuration
                         public class AppConfig {
                             @Inject DataSource dataSource; // from XML
                        
                             @Lazy
                             @Bean
                             public MyBean myBean() {
                                 // inject the XML-defined dataSource bean
                                 return new MyBean(this.dataSource);
                             }
                         }            
                         
            13、Spring框架支持@Configuration,使用@ContextConfiguration
                         @RunWith(SpringJUnit4ClassRunner.class)
                         @ContextConfiguration(classes={AppConfig.class, DatabaseConfig.class})
                         public class MyTests {
                        
                             @Autowired MyBean myBean;
                        
                             @Autowired DataSource dataSource;
                        
                             @Test
                             public void test() {
                                 // assertions against myBean ...
                             }
                         }
                         
            14、和其他注解结合使用@Enable、@EnableAsync、@EnableScheduling、@EnableTransactionManagement、@EnableAspectJAutoProxy
                 @EnableWebMvc。
                         
          15、一个应用可以使用一个@Configuration修饰的AppConfig拉起应用。通过@Import @ImportResource导入关联。将这个配置文件传给
Spring容器的启动类。                         
          对应的注解解析器是ConfigurationClassPostProcessor。使用注解要保证所有的注解解析器能正确加载到Spring容器中。
          使用@Configuration修饰的类必须满足以下条件:
              classes must be non-final
              classes must be non-local (may not be declared within a method)
              classes must have a default/no-arg constructor and may not use @Autowired constructor parameters. 
              Any nested configuration classes must be static.
     
@Import
    1、可以引入一个或多个@Configuration修饰的类。
    2、引入@Component修饰的类
    3、引入ImportSelector实现,解析器自动调用selectImports方法
    4、ImportBeanDefinitionRegistrar实现,解析器自动调用registerBeanDefinitions方法
    5、提供了XML配置文件<import/>同样的功能
    6、可以作为元注解或者使用在Class上,接口/注解/类都是Class。
    
    
@ImportResource
    1、提供和<bean/>类似的功能
    2、引入Groovy文件,需满足GroovyBeanDefinitionReader能处理
    3、引入XML文件,需满足XmlBeanDefinitionReader能处理
    4、可以声明自定义的解析器
         
@Bean

1、作用同XML配置的<bean/> 一般在@Configuration注解修饰的类中使用
                @Configuration
                    public
                    class Bootstrap {
                    
                        @Bean
                        public MyBean myBean(){
                            // instantiate and configure MyBean obj
                            return obj;
                        }
                    }
    2、为Bean声明一个或多个别名、作用域、依赖、是否懒加载。
          @Configuration
                    public
                    class Bootstrap {
                    
                        @Bean({"b1","b2"})
                        @Scope("prototype")  
                        @Lazy
                        @DependsOn
                        @Primary
                        public MyBean myBean(){
                            // instantiate and configure MyBean obj
                            return obj;
                        }
                    }
    3、@Bean一般都在@Configuration中使用
    
    4、@Bean在lite mode中使用,即在普通类或者带有@Component修饰的类中使用,@Bean修饰的方法会被Spring容器当做是
    Bean创建工厂方法,同XML配置中的factory-method类似。
          @Component
                    public class Calculator {
                        public int sum(int a, int b) {
                            return a+b;
                        }
                    
                        @Bean
                        public MyBean myBean() {
                            return new MyBean();
                        }
                    }    
@Conditional

注解关系
@Component
    @Configuration  @Service  @Controller @Repository    

  
            
            
                      
            
 

转载于:https://my.oschina.net/773355/blog/2986797

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值