spring和springboot的核心注解(1)

一、spring核心注解

1.1 @Autowired

此注解用于bean的field、setter方法以及构造方法上,显式地声明依赖。根据type来autowiring。

当在field上使用此注解,并且使用属性来传递值时,Spring会自动把值赋给此field。也可以将此注解用于私有属性(不推荐),如下。

@Component
public class User {   
    @Autowired      
    private Address address;        
}

  最经常的用法是将此注解用于settter上,这样可以在setter方法中添加自定义代码。如下:

@Component
public class User {   
    private Address address;   
    @AutoWired   
    public setAddress(Address address) 
    {this.address=address;   }
}

当在构造方法上使用此注解的时候,需要注意的一点就是一个类中只允许有一个构造方法使用此注解。此外,在Spring4.3后,如果一个类仅仅只有一个构造方法,那么即使不使用此注解,那么Spring也会自动注入相关的bean。如下:

@Component
public class User {   
    private Address address;     
    public User(Address address) {  
    this.address=address;  }
}

1.2 @Qualifier

此注解是和@Autowired一起使用的。使用此注解可以让你对注入的过程有更多的控制。

@Qualifier可以被用在单个构造器或者方法的参数上。当上下文有几个相同类型的bean, 使用@Autowired则无法区分要绑定的bean,此时可以使用@Qualifier`来指定名称。  

@Component
public class User { 
    @Autowired 
    @Qualifier("address1")    
    private Address address;    
    ...
}

1.3 @Configuration

@Configuration 用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被 @Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。配置类一般放在congfig的包下  ,配置类如下
@Configuration //注解@Configuration告诉spring这是一个配置类。配置类==配置文件

public class MainConfig {

    @Bean   //给容器中注册一个Bean;类型为返回值的类型,id默认使用方法名作为id
    public Person person()
    {
        return new Person("李思思",18);
    }
}

使用如下:通过注解

public AnnotationConfigApplicationContext(Class<?>... componentClasses)
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(MainConfig.class);
Person person=context.getBean("person",Person.class);

1.4 @Bean 

@Bean 结合@Configuration(full mode)使用或结合@Component(light mode)使用。可以导入第三方组件,入方法有参数默认从IOC容器中获取,可以指定initMethod和destroyMethod 指定初始化和销毁方法,多实例对象不会调用销毁方法.

1.5 @ComponentScan
包扫描@ComponentScan (@ComponentScans可以配置多个扫描,@TypeFilter:指定过滤规则,自己实现TypeFilter类),在beans.xml中一般配置包扫描注册

<!-- 包扫描、只要标注了@Controller、@Service、@Repository、@Component-->
<context:component-scan base-package="com.athorse"></context:component-scan>

@ComponentScan注解一般和@Configuration注解一起使用,指定Spring扫描注解的package。如果没有指定包,那么默认会扫描此配置类所在的package。

@ComponentScan(value="com.athorse",excludeFilters = {
       @ComponentScan.Filter(type= FilterType.ANNOTATION,classes = {Controller.class})
})
//excludeFilters=Filter[],指定扫描的时候按照什么规则排除哪些组件
//includeFilters=Filter[],指定扫描的时候按照什么规则包含哪些组件
public class MainConfig {}
@ComponentScan(value="com.athorse",includeFilters = {
     @ComponentScan.Filter(type= FilterType.ANNOTATION,classes = {Controller.class})
},useDefaultFilters=false)
//excludeFilters=Filter[],指定扫描的时候按照什么规则排除哪些组件
//includeFilters=Filter[],指定扫描的时候按照什么规则包含哪些组件
public class MainConfig {}

1.5 @Scope 调解作用域 

@Configuration
public class MainConfig {

    @Bean(value = "person")
    @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    /* ConfigurableBeanFactory.SCOPE_PROTOTYPE 多实例:ioc容器启动不会调用方法创建对象放在容器中,
    * 每次获取的时候才会调用方法创建对象
    *ConfigurableBeanFactory.SCOPE_SINGLETON 单实例(默认):ioc容器启动会调用方法创建对象放到ioc容器中。
    *以后每次获取都是直接从容器中拿
     */
    public Person person()
    {
        System.out.println("给容器中添加对象...");
        return new Person("曹操",65);
    }
}

1.6 @Lazy 懒加载

此注解使用在Spring的组件类上。默认的,Spring中单实例的Bean依赖一开始就被创建和配置。如果想要延迟初始化一个bean,那么可以在此类上使用Lazy注解,表示此bean只有在第一次被使用的时候才会被创建和初始化。此注解也可以使用在被@Configuration注解的类上,表示其中所有被@Bean注解的方法都会延迟初始化。     

1.7 @Conditional 按照条件注册bean

   

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {

	//All Condition classes that must match in order for the component to be registered.
	Class<? extends Condition>[] value();

}

   从源码中可以看到可以标注在类和函数上,value是一个数组,而且要实现接口Condition,并重写方法matches方法。matches方法返回true在注入bean,返回false则不注入bean

@FunctionalInterface
public interface Condition {
	boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);

}

如例,创建一个@Condition注解,第一步创建类实现Condition

public class WindsCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment env=context.getEnvironment();
        String property = env.getProperty("os.name");
        if(property.contains("Windows"))
        {
            return true;
        }
        return false;
    }
}

第二步:加注解在类上或函数上

@Bean
@Conditional({WindsCondition.class})
public Person person()
{
   return new Person("Bill",51);
}

@Value

此注解使用在字段、构造器参数和方法参数上。@Value可以指定属性取值的表达式,支持通过#{}使用SpringEL来取值,也支持使用${}来将属性来源中(Properties文件、本地环境变量、系统属性等)的值注入到bean的属性中。此注解值的注入发生在AutowiredAnnotationBeanPostProcessor类中。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值