一、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类中。