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

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

注解:

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

自定义过滤类:

 package com.xiaoguo.annotation.filter;

 import com.xiaoguo.annotation.beans.Car;
import org.springframework.core.io.Resource;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.ClassMetadata;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.core.type.filter.TypeFilter; import java.io.IOException; /**
* @author xiaoguo
* @date 2019-10-14 下午 9:11
*/
public class MyTypeFilter implements TypeFilter { @Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
//获取当前正在扫描的类的类信息
ClassMetadata classMetadata = metadataReader.getClassMetadata();
String className = classMetadata.getClassName();
Class<?> forName = null;
try {
forName = Class.forName(className);
if (Car.class.isAssignableFrom(forName)) {
// true就加载到IOC容器
return true;
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return false;
}
}

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

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

注解:

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

自定义条件类:

 package com.xiaoguo.annotation.condition;

 import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata; /**
* @author xiaoguo
* @date 2019-10-11 下午 8:12
*/
public class LinuxCondition implements Condition { @Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { //3.获取到当前环境信息
Environment environment = context.getEnvironment(); String property = environment.getProperty("os.name");
if (property.contains("linux")) {
//true 注入bean
return true;
}
return false;
}
}

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

ImportSelector 注册类到容器中:

 @Import({MyImportSelector.class})

 public class MyImportSelector implements ImportSelector {

     /**
* 返回值就是导入容器中的组件全类名
*
* @param importingClassMetadata
* @return
*/
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.xiaoguo.annotation.beans.Red"};
}
}
ImportBeanDefinitionRegistrar与上同理:
 public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

     /**
*
* @param importingClassMetadata 当前类的注解信息
* @param registry BeanDefinition注册类
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
boolean tf = registry.containsBeanDefinition("com.xiaoguo.annotation.beans.Red");
if (tf) {
RootBeanDefinition beanDefinition = new RootBeanDefinition(XiaoGuo.class);
registry.registerBeanDefinition("xiaoguo", beanDefinition);
}
}
}

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. [转]ECMAScript 2016,2017 和 2018 中所有新功能的示例

    很难追踪 JavaScript(ECMAScript)中的新功能. 想找到有用的代码示例更加困难. 因此,在本文中,我将介绍 TC39 已完成 ES2016,ES2017 和 ES2018(最终草案) ...

  2. Codeforces Round #186 (Div. 2)

    A. Ilya and Bank Account 模拟. B. Ilya and Queries 前缀和. C. Ilya and Matrix 考虑每个元素的贡献. 边长为\(2^n\)时,贡献为最 ...

  3. Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence(思维)

    传送门 题意: 给你一个只包含 '(' 和 ')' 的长度为 n 字符序列s: 给出一个操作:将第 i 个位置的字符反转('(' ')' 互换): 问有多少位置反转后,可以使得字符串 s 变为&quo ...

  4. 同一个页面 andriod和ios设备上的按钮颜色不一致

    andriod系统显示蓝色的按钮,正常:ios设备显示灰色的按钮,不正常. style属性添加-webkit-appearance: none;

  5. H3C IPv6邻居发现协议

  6. ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(16)之轻博客

    源码下载地址:http://www.yealuo.com/Sccnn/Detail?KeyValue=c891ffae-7441-4afb-9a75-c5fe000e3d1c 项目到上面一步其实已经算 ...

  7. C# 判断系统版本

    本文告诉大家如何判断系统是 win7 还是 xp 系统 使用下面代码可以判断 private static readonly Version _osVersion = Environment.OSVe ...

  8. JS与JSP分别是什么

    JS:JavaScript: JSP:Java Server Pages. jsp:只是servlet的一个变种,方便书写html内容才出现的,servlet是根本,所有jsp能做的,servlet全 ...

  9. Linux 内核class_simple 接口

    class_simple 接口意图是易于使用, 以至于没人会抱怨没有暴露至少一个包含设备的被 分配的号的属性. 使用这个接口只不过是一对函数调用, 没有通常的和 Linux 设备模型 关联的样板. 第 ...

  10. Java 学习笔记(7)——接口与多态

    上一篇说了Java面向对象中的继承关系,在继承中说到:调用对象中的成员变量时,根据引用类型来决定调用谁,而调用成员方法时由于多态的存在,具体调用谁的方法需要根据new出来的对象决定,这篇主要描述的是J ...