spring基于注解和配置源码解读

我们先来建立一个maven项目,引入spring文件,不爱弄的在文章最下面有代码地址可以去下载。先看,后面自己下载代码自己去尝试。先给你们吧,边尝试边看吧。

一、IOC容器注册组件的方式

1. 基础XML注入Bean

是不是超级简单的,我们由浅入深一点点来。

2. 基于注解的方式来配置

我们通过方法名就可以直接得到我们的对象了,默认就是按照方法来装配。也可以通过@Bean(value="newName") 来指定装配的名字。

3. 按照包扫描的方式装配(重点),使用@ComponentScan(basePackages={"包的全路径"})

这里在来说几个参数,excludeFilters排除某一些对象,语法如下

FilterType有五种,分别是ANNOTATION(注解类),ASSIGNABLE_TYPE(类名),ASPECTJ(不常用,文档说AspectJ类型模式表达式匹配),REGEX(正则表达式匹配),CUSTOM(自定义),常用的三种我标记了红色。下面看一下具体写法

刚才我们说到了自定义过滤,我们来看一下怎么写自定义的过滤,实现我们TypeFilter接口,重写我们的match即可,只关注返回的true。下面是一个事例

与包含相反的还有一个,只允许引入什么,也就是我们的includeFilters,需要注意需要把useDefaultFilters属性设置为false(true表示扫描全部的)。语法和excludeFilters完全一致

4.回过头来,我们看一下Bean的作用域。

@Lazy懒加载,使用才实例化,看下代码,我们在Bean里加入构造方法,更方便得出什么时候实例化的。

指定@Scpoe可以有四种作用域

a) singleton 单实例的(默认),单例的生命周期有spring容器来控制,非懒加载时在spring实例化以后就产生了对象,容器销毁则对象销毁

输出结果为true,说明我们的对象是单例的,单例的对象,生命周期由spring来管理的。

b) prototype 多实例的

多例的不受ioc容器来管理,销毁时是由GC来清理的,还有request同一次请求和session同一个会话级别的,这里就不一一演示了。

[email protected]注解,来判断是否注入Bean的。

上面的代码什么意思呢?就是我们是否需要注入carBean,如果包含user这个对象,就注入我们的carBean,不包含就不注入,这里有个意思的事,Configuration配置里类的注入是有顺序的,我们必须把我们作为判断条件的Bean放在上面,否则Conditional会识别你没有那个判断条件的Bean。

[email protected]引入方式注入Bean

直接在注解内写入我们的要注入的类即可,也可以使用接口的方式来实现,我们来看换一下。

实现ImportSelector类,然后返回类名全路径即可。自动装配就是基于@Import实现的。

实现ImportBeanDefinitionRegistrar,重写registerBeanDefinitions方法,也是可以的。

7.通过FactoryBean注入

说到这所有往IOC容器中添加组件的方式就全部说完了,简单总结一下:

  • @Bean注入,可以指定四种作用域,单例,多例(生命周期不受IOC容器管理),一次请求和一次会话,也可以设置懒加载,
  • @ComponentScan指定包扫描的方式来注入,配合@Controller,@Repository,@Service,@Component注解来使用。
  • @Import方式注入,两种实现类ImportSelector和ImportBeanDefinitionRegistrar两种方式。
  • @FactoryBean,工程Bean的方式也可以注入。注意不带&是取得最终对象,带&是取得真实Bean。三个方法,一个指定对象,一个指定类型,一个指定是否为单例。

二、Bean的生命周期---初始化方法和销毁方法

针对单实例bean的话,容器启动的时候,bean的对象就创建了,而且容器销毁的时候,也会调用Bean的销毁方法。

针对多实例bean的话,容器启动的时候,bean是不会被创建的而是在获取bean的时候被创建,而且bean的销毁不受IOC容器的管理。

1.我们先来看个最简单的方法,用initMethod和destroyMethod来指定我们的初始化方法和销毁方法

我们在指定了我们的init初始方法,销毁方法为destroy方法。调用顺序是,Car的构造方法,Car的init方法,Car的destroy方法,也可以自己尝试使用@Lazy注解。码云代码里有可以自己去尝试。

2.通过 InitializingBean和DisposableBean 的两个接口实现bean的初始化以及销毁方法

3.通过JSR250规范 提供的注解@PostConstruct 和@ProDestory标注的方法

4.通过Spring的BeanPostProcessor的 bean的后置处理器会拦截所有bean创建过程 (这个方法后面讲源码的时候会去讲内部实现,自己觉得有必要看这个的源码)

这里也总结一下,我们来指定容器内对象的初始化方法和销毁方法的方式一共有四种

  • 用@Bean的initMethod 和destroyMethod 来给予初始化方法和销毁方法。
  • 通过 InitializingBean和DisposableBean 的二个接口实现bean的初始化以及销毁方法。
  • 通过JSR250规范 提供的注解@PostConstruct 和@ProDestory标注的方法。
  • 通过Spring的BeanPostProcessor的 bean的后置处理器会拦截所有bean创建过程。

三、给属性赋值

这里的东西不多,我就尽快说一下啦,赋值的方式有三种我们来看一下。

这里值得一提的就是导入文件最好设置一下encoding = "utf-8",不然汉字会乱码。

四、自动装配:

主动装配平时是我们最熟悉的,用的也是最多的,我们来复习一下。

[email protected] 自动装配首先时按照类型进行装配,若在IOC容器中发现了多个相同类型的组件,那么就按照 属性名称来进行装配

在这里我们设置了两个AutowiredDao的对象,一个标识为1,一个标识为2,ServiceBean默认是按照名字来装配的。

2.我们也可以通过@Qualifier来指定装配名字。

3.我们使用Qualifier是如果名字写错了,可能装配错误会报错,这时我们可以使用required = false来阻止异常的抛出

注意:这里我并没有说@Resource注解,这个注解其实不是spring里的,是JSR250规范的,但是不支持@Primary 和@Qualifier的支持

五、环境切换:

我们有时候需要通过不同的环境来切换我们的配置,我们通过@Profile注解,来根据环境来激活标识不同的Bean,

@Profile标识在类上,那么只有当前环境匹配,整个配置类才会生效

@Profile标识在Bean上 ,那么只有当前环境的Bean才会被激活

激活切换环境的方法

  • 方法一:通过运行时jvm参数来切换 -Dspring.profiles.active=test,dev,prod多个参数表中间使用英文的逗号来分隔
  • 方法二:通过代码的方式来激活

如果两个都写了,按照代码中的来实现,参数不再起作用

本文转自:https://www.toutiao.com/i6739477833774531084/?tt_from=mobile_qq&utm_campaign=client_share&timestamp=1569194991&app=news_article&utm_source=mobile_qq&utm_medium=toutiao_android&req_id=2019092307295101001104910817789FC5&group_id=6739477833774531084

原文地址:https://www.cnblogs.com/nizuimeiabc1/p/12178384.html

时间: 2024-10-12 12:03:10

spring基于注解和配置源码解读的相关文章

(spring-第4回)spring基于注解的配置

基于XML的bean属性配置:bean的定义信息与bean的实现类是分离的. 基于注解的配置:bean的定义信息是通过在bean实现类上标注注解实现. 也就是说,加了注解,相当于在XML中配置了,一样一样的. 一.举个栗子: 1 package com.mesopotamia.annotation; 2 3 import org.springframework.stereotype.Component; 4 5 @Component 6 public class Car { 7 private

java Spring 基于注解的配置(一)

注解引用:1.service.xml 配置注解模式 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://w

Spring基于注解的配置之@Autowired

学习地址:https://www.w3cschool.cn/wkspring/rw2h1mmj.html @Autowired注释 @Autowired注释对在哪里和如何完成自动连接提供了更多的细微控制. Setter方法中的@Autowired SpellChecker.java: package com.lee.autowired; public class SpellChecker { public SpellChecker() { System.out.println("Inside S

(转)Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义

1.从Spring2.0以后的版本中,Spring也引入了基于注解(Annotation)方式的配置,注解(Annotation)是JDK1.5中引入的一个新特性,用于简化Bean的配置,某些场合可以取代XML配置文件.开发人员对注解(Annotation)的态度也是萝卜青菜各有所爱,个人认为注解可以大大简化配置,提高开发速度,同时也不能完全取代XML配置方式,XML 方式更加灵活,并且发展的相对成熟,这种配置方式为大多数 Spring 开发者熟悉:注解方式使用起来非常简洁,但是尚处于发展阶段,

从源码分析 Spring 基于注解的事物

在spring引入基于注解的事物(@Transactional)之前,我们一般都是如下这样进行拦截事物的配置: <!-- 拦截器方式配置事物 --> <tx:advice id="transactionAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add*" propagation=&q

SpringMVC源码解读 - RequestMapping注解实现解读 - RequestMappingInfo

使用@RequestMapping注解时,配置的信息最后都设置到了RequestMappingInfo中. RequestMappingInfo封装了PatternsRequestCondition,RequestMethodsRequestCondition,ParamsRequestCondition等,所以自己不干活,所有的活都是委托给具体的condition处理. 先看下封装的RequestCondition吧,之前的文章将的比较细了,不清楚各个类具体是做什么的,可以移步这里<Sprin

Spring源码解读之核心容器上节

Spring架构图 说明 Spring的流行程度就不用我来说了,相信大家如果使用JAVA开发就一定知道它.写这篇文章的初衷在于:1.了解Spring底层实现原理,提升对Spring的认识与理解.2.学习优秀框架编程实现,学习优秀的设计模式.3.使用Spring三年多,对于底层细节希望知道更多,便于求职. 对于Spring整个架构是很庞大的,很难一下看完和思考完,所以我会从Core Container进行切入,一步一步往上走,从而解开Spring神秘的底层面纱.同时对Spring的IOC\AOP\

SpringMVC源码解读 - RequestMapping注解实现解读 - RequestCondition体系

一般我们开发时,使用最多的还是@RequestMapping注解方式. @RequestMapping(value = "/", param = "role=guest", consumes = "!application/json") public void myHtmlService() { // ... } 台前的是RequestMapping ,正经干活的却是RequestCondition,根据配置的不同条件匹配request. @Re

spring 源码解读与设计详解:2 BeanFactory

在spring的官网中我们看到,spring的产品已经发展的非常壮大,然而很多产品对于很多公司来讲用的非常少,甚至用不到.因此本系列的源码解读也不会涉及全部的spring的产品.而是只对spring的核心功能IoC和AOP进行解释. 所谓源码解读,解读的是什么?实际上源码解读读的更多的是源码的注释,因为一个类的作用.一个接口或者一个方法的作用,我们往往是要根据注释才知道,这也是为什么在代码规范中,注释是一个非常重要的模块的原因. 参考: Spring源码分析--BeanFactory体系之接口详