Spring常用注解

125 阅读5分钟
  1. @Configuration、@Bean@Configuration作用于类,其标注的类为配置类,被其标注的类的功能相当于一个Bean的xml配置文件。@Bean作用于方法,该方法的返回值会作为Bean对象注册到容器中,默认将方法名称作为Bean名,也可通过value属性设置Bean名与Bean的别名,value是一个String数组,数组中有多个值时,第一个值作为Bean名,其他作为别名。有没有@Configuration注解@Bean都会起作用将方法返回值注册到容器,区别是Spring会为@Configuration标注的类通过cglib生成动态代理,拦截所有被@Bean标注的方法使其只执行一次,确保一些Bean是单例的。

  2. @ComponentScan、@Component@ComponentScan作用于类,用于批量注册Bean,这个注解会让spring去扫描某些包及其子包中所有的类,然后将满足一定条件的类作为bean注册到spring容器容器中。 @ComponentScan工作的过程:

    1. Spring会扫描指定的包,且会递归下面子包,得到一批类的数组。

    2. 然后这些类会经过上面的各种过滤器,最后剩下的类会被注册到容器中。 需要扫描哪些包?通过value、backPackages、basePackageClasses这3个参数来控制。 过滤器有哪些?通过useDefaultFilters、includeFilters、excludeFilters这3个参数来控制过滤器

    @Component通常作用于类,被其标注的类在默认情况下会被注册到Spring容器。该注解的value属性用来指定Bean名,若不指定,默认Bean名为标注的类的类名小写。@Controller、@Service、@Repository与@Component作用相同。

  3. @Import:通常作用于类,用来导入需要注册的Bean。该注解有一个Class类型数组的属性value,用来设置需要导入的类。可以导入的类型有:

    1. value为普通的类
    1. value为@Configuration标注的类
    1. value为@CompontentScan标注的类
    1. value为ImportBeanDefinitionRegistrar接口类型
    1. value为ImportSelector接口类型
    1. value为DeferredImportSelector接口类型
  4. @Conditional:可以用在任何类型或者方法上面,通过@Conditional注解可以配置一些条件判断,当所有条件都满足的时候,被@Conditional标注的目标才会被spring容器处理。比如可以通过@Conditional来控制Bean是否需要注册,控制被@Configuration标注的配置类是需要需要被解析等。这个注解只有一个value参数,Condition类型的数组,Condition是一个接口,表示一个条件判断,内部有个方法返回true或false,当所有Condition都成立的时候,@Conditional的结果才成立。@Conditional使用的3步骤:

    1. 自定义一个类,实现Condition或ConfigurationCondition接口,实现matches方法
    1. 在目标对象上使用@Conditional注解,并指定value的指为自定义的Condition类型
    1. 启动spring容器加载资源,此时@Conditional就会起作用了
  5. @Autowired、@Resource:这两个注解都是用于依赖注入的,区别在于@Autowired是Spring提供的,在容器中查找合适的Bean进行注入的顺序是先按类型找->通过限定符@Qualifier过滤->@Primary->@Priority->根据名称找(字段名称或者方法名称),可以作用于字段、构造器、方法、方法参数及注解上;@Resource是JavaEE提供的,查找顺序是先按Resource的name值作为bean名称找->按名称(字段名称、方法名称、set属性名称)找->按类型找->通过限定符@Qualifier过滤->@Primary->@Priority->根据名称找(字段名称或者方法参数名称),可以作用于任意类型字段与方法上。

  6. @Primary、@Qualifier@Primary可以作用于类和方法上,常与@Component和@Bean一起使用,该注解标注的Bean将会成为优选候选者,在依赖注入时有多个候选者时被优先选中。@Qualifier可以作用于字段、方法、方法参数、任意类型与注解上,其作为限定符可以在依赖注入查找候选者的过程中对候选者进行过滤以及与@Autowired一起使用指定要注入的Bean(@Autowired+@Qualifier作用等同与@Resource)。

  7. @Scope:可以作用于类和方法上,一般与@Component和@Bean一起使用,用来指定Bean的作用域。

  8. @DependenOn:可以作用于类和方法上,一般与@Component和@Bean一起使用,用于指定当前Bean依赖的Bean,可以控制Bean的创建顺序与销毁顺序。

  9. @ImportResource:作用于类,用来导入Bean定义配置文件(xml或properties)

  10. @Lazy:可以作用于任意类型、方法、构造器、参数、字段上面,用于实现Bean的延迟初始化。常用的3种方式:

    1. 和@Compontent一起标注在类上,可以是这个类延迟初始化
    1. 和@Configuration一起标注在配置类中,可以让当前配置类中通过@Bean注册的bean延迟初始化
    1. 和@Bean一起使用,可以使当前bean延迟初始化
  11. @PropertySource、@Value:@PropertySource作用于类,用来引入配置文件,@Value("${配置文件中的key}")作用于字段,用来引入配置文件中的值。可以结合@Scope的proxyMode实现动态刷新。

  12. @EnableAspectJAutoProxy、@Aspect、@Pointcut以及通知注解@EnableAspectJAutoProxy作用于类,用于批量为符合条件的Bean自动生成代理对象,该注解会找到容器中所有标注有@Aspect注解的Bean以及Advisor类型的Bean,将他们转换为Advisor集合,spring会通过Advisor集合对容器中满足切入点表达式的bean生成代理对象。@Aspect作用于类,用来定义切面类,@Pointcut作用于方法上,用来定义切入点。@Before、@After、@AfterReturning、@Afterthrowing、@Around作用于方法,用来定义通知。

  13. @EnableAsync、@Async:实现方法的异步调用。

  14. @EnableScheduling、@Scheduled:实现定时任务。

  15. @EnableCaching、@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig:实现本地缓存。

  16. @EnableTransactionManagement、@Transaction:实现事务提交回滚。