spring源码学习分析(一)

1. @Configuration

标注在类上,表示这是一个spring的配置类。使用@bean注解向容器中添加一个组件

2. @bean

标注在方法上,表示向容器中添加一个组件。组件的类型为返回值的类型;组件的id默认为方法名,也可以指定组件的名称@bean(value="bean的名称")。

3. @CompentScan

标注在类上,用来进行包扫描,扫描@component、@Controller、@Service、@Repository注解标注的类,添加到容器中

  1. excludeFilters:指定一下排除策略,排除某些注解
  2. includeFilters:指定包含策略,指定包含某些注解。需要把useDefaultFilters属性设置为false(true表示扫描全部的)
  3. @ComponentScan.Filter type的类型
    1. 注解形式的FilterType.ANNOTATION @Controller @Service @Repository @Compent
    2. 指定类型的 FilterType.ASSIGNABLE_TYPE
    @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,value = {GobaioService.class})
    
    1. aspectj类型的 FilterType.ASPECTJ(不常用)
    2. 正则表达式的 FilterType.REGEX(不常用)
    3. 自定义的 FilterType.CUSTOM
    public enum FilterType { 
        //注解形式 比如@Controller @Service @Repository @Compent 
       ANNOTATION, 
        //指定的类型 
       ASSIGNABLE_TYPE, 
       //aspectJ形式的 
       ASPECTJ, 
      //正则表达式的 
      REGEX, 
      //自定义的 CUSTOM
     }
    
    1. FilterType.CUSTOM 自定义类型如何使用
    public class GobaioFilterType implements TypeFilter { 
    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { 
        //获取当前类的注解源信息 
        AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata(); 
        //获取当前类的class的源信息 
        ClassMetadata classMetadata = metadataReader.getClassMetadata(); 
        //获取当前类的资源信息 
        Resource resource = metadataReader.getResource(); 
        if(classMetadata.getClassName().contains("dao")) {
         return true; 
        }
        return false;
     }
    }
    
      @ComponentScan(basePackages = {"com.gobaio.testcompentscan"},
    includeFilters = { @ComponentScan.Filter(type = FilterType.CUSTOM,value = GobaioFilterType.class) },useDefaultFilters = false) 
      public class MainConfig { }
    

4. @scop

在不指定@Scope的情况下,所有的bean都是单实例的bean,而且是饿汉加载,指定@Scope为 prototype 表示为多实例的,而且还是懒汉模式加载(IOC容器启动的时候,并不会创建对象,而是 在第一次使用的时候才会创建)
@Scope指定的作用域方法取值:
a. singleton 单实例的(默认)
b. prototype 多实例的
c. request 同一次请求
d. session 同一个会话级别

5. @Lazy

Bean的懒加载
@Lazy(主要针对单实例的bean 容器启动的时候,不创建对象,在第一次使用的时候才会创建该对象)

6. @Conditional进行条件判断

public class GobaioCondition implements Condition {
  @Override 
  public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
    return false;
  }
@Conditional(value = GobaioCondition.class) 
 public GobaioLog gobaioLog() { return new gobiaoLog(); }

7. 往IOC 容器中添加组件的方式

  1. 通过@CompentScan +@Controller @Service @Respository @compent
    适用场景: 针对我们自己写的组件可以通过该方式来进行加载到容器中。
  2. 通过@Bean的方式来导入组件(适用于导入第三方组件的类)
  3. 通过@Import来导入组件(导入组件的id为全类名路径);通过@Import 的ImportSeletor类实现组件的导入 (导入组件的id为全类名路径);通过@Import的 ImportBeanDefinitionRegister导入组件 (可以指定bean的名称);@ImportResource(value = {"classpath:beans/beans.xml"})导入一个spring的配置文件
  4. 通过实现FacotryBean接口来实现注册 组件

7. @Value+@PropertySource

通过@Value +@PropertySource来给组件赋值

@PropertySource(value = {"classpath:person.properties"}) //指定外部文件的位置

8. 自动装配

8.1 @AutoWired

  1. 自动装配首先时按照类型进行装配,若在IOC容器中发现了多个相同类型的组件,那么就按照 属性名称来进行装配
    @Autowired
    private GobaioDao gobaioDao;
    比如,我容器中有两个GobaioDao类型的组件 一个叫gobaioDao 一个叫gobaioDao2 那么我们通过@AutoWired 来修饰的属性名称时gobaioDao,那么拿就加载容器的gobaiaoDao组件,若属性名称为 gobaioDao2 那么他就加载的时gobaioDao2组件
  2. 假设我们需要指定特定的组件来进行装配,我们可以通过使用@Qualifier("gobaioDao")来指定装配的组件 或者在配置类上的@Bean加上@Primary注解
  3. 假设我们容器中即没有gobaioDao 和gobaioDao2,那么在装配的时候就会抛出异常
    No qualifying bean of type 'com.gobaio.testautowired.GobaioDao' available;
    若我们想不抛异常 ,我们需要指定 required为false的时候可以了
@Autowired(required = false) 
@Qualifier("gobaioDao") 
private GobaioDao gobaioDao2;
  1. @Resource(JSR250规范)
    功能和@AutoWired的功能差不多一样,但是不支持@Primary 和@Qualifier的支持
  2. @InJect(JSR330规范)
    需要导入jar包依赖 功能和支持@Primary功能 ,但是没有Require=false的功能
<dependency>
   <groupId>javax.inject</groupId> 
   <artifactId>javax.inject</artifactId>
   <version>1</version> 
</dependency>
  1. 使用autowired 可以标注在方法上
    标注在set方法上
//@Autowired 
public void setGobaioLog(GobaioLog gobaioLog) {
  this.gobaioLog = gobaioLog; 
}

标注在构造方法上

@Autowired 
public GobaioAspect(GobaioLog gobaioLog) { 
  this.gobaioLog = gobaioLog;
 }

标注在配置类上的入参中(可以不写)

@Bean 
public GobaioAspect gobaioAspect(@Autowired GobaioLog gobaioLog) { 
  GobaioAspect gobaioAspect = new GobaioAspect(gobaioLog); 
  return gobaioAspect;
 }

9. @Profile

通过@Profile注解 来根据环境来激活标识不同的Bean

  1. @Profile标识在类上,那么只有当前环境匹配,整个配置类才会生效
  2. @Profile标识在Bean上 ,那么只有当前环境的Bean才会被激活
  3. 没有标志为@Profile的bean 不管在什么环境都可以被激活
    激活切换环境的方法:
  4. 通过运行时jvm参数来切换 -Dspring.profiles.active=test|dev|prod
  5. 通过代码的方式来激活
public static void main(String[] args) {
  AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
  ctx.getEnvironment().setActiveProfiles("test","dev"); 
  ctx.register(MainConfig.class); 
  ctx.refresh(); printBeanName(ctx); 
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • 深入使用 Spring两种后处理器Bean 后处理器容器后处理器属性占位符配置器重写占位符配置器Spring 的自...
    渐丶忘阅读 1,083评论 0 1
  • Spring致力于提供一种方法管理你的业务对象。在大量Java EE的应用中,随处可见Spring。今天我将简单的...
    JAVA架构师的圈子阅读 1,312评论 0 16
  • 如何学习Spring框架 了解Spring的出现是为了解决什么问题!!!了解Spring的出现是为了解决什么问题!...
    G_慧慧阅读 677评论 0 0
  • 来源:关于Spring IOC (DI-依赖注入)你需要知道的一切作者:zejian Dao层(AccountDa...
    杨井阅读 5,324评论 0 27
  • 如下是整篇文章的结构,所需阅读时间大约20min Spring简介 Spring框架由Rod Johnson开发,...
    李序锴阅读 886评论 0 15