本次主要整理四个注解 @ComponentScan、@Scope、@Conditional、@Import

1. @ComponentScan(value = "com.xiaoguo") 报扫描注解: 扫描该路径下的@controller @component @service 等等注解并将其交给spring容器管理。可以选择只扫描那些组件或是排除那些组件: includeFilters=Filter[]:指定只包含的组件
excludeFilters=Filter[]:指定需要排除的组件;

注解:

  1. @ComponentScan(value = "com.xiaoguo.annotation", excludeFilters = {
  2. @ComponentScan.Filter(type = FilterType.CUSTOM, classes = {MyTypeFilter.class})
  3. })

自定义过滤类:

  1. package com.xiaoguo.annotation.filter;
  2.  
  3. import com.xiaoguo.annotation.beans.Car;
  4. import org.springframework.core.io.Resource;
  5. import org.springframework.core.type.AnnotationMetadata;
  6. import org.springframework.core.type.ClassMetadata;
  7. import org.springframework.core.type.classreading.MetadataReader;
  8. import org.springframework.core.type.classreading.MetadataReaderFactory;
  9. import org.springframework.core.type.filter.TypeFilter;
  10.  
  11. import java.io.IOException;
  12.  
  13. /**
  14. * @author xiaoguo
  15. * @date 2019-10-14 下午 9:11
  16. */
  17. public class MyTypeFilter implements TypeFilter {
  18.  
  19. @Override
  20. public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
  21. //获取当前正在扫描的类的类信息
  22. ClassMetadata classMetadata = metadataReader.getClassMetadata();
  23. String className = classMetadata.getClassName();
  24. Class<?> forName = null;
  25. try {
  26. forName = Class.forName(className);
  27. if (Car.class.isAssignableFrom(forName)) {
  28. // true就加载到IOC容器
  29. return true;
  30. }
  31. } catch (ClassNotFoundException e) {
  32. e.printStackTrace();
  33. }
  34. return false;
  35. }
  36. }

2. @Scope("prototype") 此注解表示交给容器管理的对象为多例模式,不加默认为但例模式,加此注解每次从容器获取对象都是新new的对象。

3. @Conditional({WindowsCondition.class}) 按照一定的条件满足条件的则注册bean到容器中

注解:

  1. @Conditional({LinuxCondition.class})
  2. @Bean("linux")
  3. public Person person03() {
  4. return new Person("linux", 25);
  5. }

自定义条件类:

  1. package com.xiaoguo.annotation.condition;
  2.  
  3. import org.springframework.context.annotation.Condition;
  4. import org.springframework.context.annotation.ConditionContext;
  5. import org.springframework.core.env.Environment;
  6. import org.springframework.core.type.AnnotatedTypeMetadata;
  7.  
  8. /**
  9. * @author xiaoguo
  10. * @date 2019-10-11 下午 8:12
  11. */
  12. public class LinuxCondition implements Condition {
  13.  
  14. @Override
  15. public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
  16.  
  17. //3.获取到当前环境信息
  18. Environment environment = context.getEnvironment();
  19.  
  20. String property = environment.getProperty("os.name");
  21. if (property.contains("linux")) {
  22. //true 注入bean
  23. return true;
  24. }
  25. return false;
  26. }
  27. }

4. @Import({Car.class}) 快速将Car导入到spring容器中

ImportSelector 注册类到容器中:

  1. @Import({MyImportSelector.class})
  2.  
  3. public class MyImportSelector implements ImportSelector {
  4.  
  5. /**
  6. * 返回值就是导入容器中的组件全类名
  7. *
  8. * @param importingClassMetadata
  9. * @return
  10. */
  11. @Override
  12. public String[] selectImports(AnnotationMetadata importingClassMetadata) {
  13. return new String[]{"com.xiaoguo.annotation.beans.Red"};
  14. }
  15. }
  1. ImportBeanDefinitionRegistrar与上同理:
  1. public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
  2.  
  3. /**
  4. *
  5. * @param importingClassMetadata 当前类的注解信息
  6. * @param registry BeanDefinition注册类
  7. */
  8. @Override
  9. public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
  10. boolean tf = registry.containsBeanDefinition("com.xiaoguo.annotation.beans.Red");
  11. if (tf) {
  12. RootBeanDefinition beanDefinition = new RootBeanDefinition(XiaoGuo.class);
  13. registry.registerBeanDefinition("xiaoguo", beanDefinition);
  14. }
  15. }
  16. }

spring注入相关注解的更多相关文章

  1. Spring中@相关注解的意义

    1.@controller 控制器(注入服务) 用于标注控制层,相当于struts中的action层 2.@service 服务(注入dao) 用于标注服务层,主要用来进行业务的逻辑处理 3.@rep ...

  2. 监听器中spring注入相关的问题

    问题描述: 需求是要求在项目启动自动触发一个service中的线程的操作,使用监听器来实现,但是自定义监听器中spring注解service失败,通过WebApplicationContextUtil ...

  3. Spring的相关注解

    说明写在最前面:摘录于   博客园--受伤滴小萝卜   文章 文章链接受伤滴小萝卜文章--Spring注解 本文章只用作学习和帮助其他人学习记录使用 Spring 注解学习笔记 声明Bean的注解: ...

  4. spring 注入使用注解(不用xml)

    (一):导入spring4的jar包 (二):在xml中配置扫描的包 <context:component-scan base-package="entity">< ...

  5. Spring bean依赖注入、bean的装配及相关注解

    依赖注入 Spring主要提供以下两种方法用于依赖注入 基于属性Setter方法注入 基于构造方法注入 Setter方法注入 例子: public class Communication { priv ...

  6. Spring注入方式及注解配置

    一:基于xml的DI(Dependency Injection) 注入类型: 定义学生Student实体类和小汽车Car实体类:进行封装和生成ToString(),并自定义属性Car Student ...

  7. Spring依赖注入:注解注入总结

    更多11   spring   依赖注入   注解   java 注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.S ...

  8. Spring依赖注入:注解注入

    注解注入顾名思义就是通过注解来实现注入, Spring和注入相关的常见注解有Autowired.Resource.Qualifier.Service.Controller.Repository.Com ...

  9. 【初识Spring】对象(Bean)实例化及属性注入(注解方式)

    通过xml的方式进行对象的实列化或属性注入或许有一些繁琐,所以在开发中常用的方式更多是通过注解的方式实现对象实例化和属性注入的. 开始之前 1.导入相关的包(除了导入基本的包还要导入aop的包): 创 ...

随机推荐

  1. hibernate无限递归问题

    项目异常如下: 2018-01-26 17:12:38.162 WARN 3128 --- [nio-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionReso ...

  2. PTA 6-2 多项式求值

    PTA 6-2 多项式求值 本题要求实现一个函数 本题要求实现一个函数,计算阶数为n,系数为a[0] ... a[n]的多项式f(x)=∑i=0n(a[i]×xi)" role=" ...

  3. 2019-10-24-dotnet-列表-Linq-的-Take-用法

    title author date CreateTime categories dotnet 列表 Linq 的 Take 用法 lindexi 2019-10-24 9:4:23 +0800 201 ...

  4. 2018-2-13-win10-uwp-unix-timestamp-时间戳-转-DateTime

    title author date CreateTime categories win10 uwp unix timestamp 时间戳 转 DateTime lindexi 2018-2-13 17 ...

  5. H3C 链路聚合分类

  6. 彻底弄懂slice和splice的区别

    总觉得数组和字符串中的一些方法的使用很难记,可能是日常都是在学理论,缺少实际应用.不多说了,继续学习吧! 一句话先提前概括: slice(start,end) 从哪到哪开始删 splice(strt, ...

  7. CodeForces 906D (欧拉降幂)

    Power Tower •题意 求$w_{l}^{w_{l+1}^{w_{l+2}^{w_{l+3}^{w_{l+4}^{w_{l+5}^{...^{w_{r}}}}}}}}$ 对m取模的值 •思路 ...

  8. Resharper 去掉注释拼写

    最近在 Resharper 的 2018.2.1 的版本,提供了单词拼写功能,如果自己写错了单词,可以在 Resharper 提示 Resharper 的拼写 在 Resharper 的 2018.2 ...

  9. .Net Core 3.0 发布为单独的可执行文件

    dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true /p:PublishTrimmed=true

  10. 【软帝学院】女生不适合学习java?其实女生学java更有优势,更好就业!

    女生适合学java吗?女生做IT怎么样 首先要表明我的观点,编程是不分男女,什么女生不适合学编程的说法,从客观上来说,我觉得这是一种偏见. 不少人潜意识里认为女生不适合从事IT开发岗位的工作,因为他们 ...