Spring 笔记

Spring 创建Bean创建的步骤

Spring中bean的生命周期:

class:java中的class类。

实例化:通过class的构造方法,去反射无参构造方法实例化,如果多个构造方法,推断构造方法。

可以在构造方法上加上@Autowired注解来告诉Spring用这个。

如果只有一个有参数构造方法。那么他会通过参数的类型,去单例池中找。如果找到多个再根据名字去查找其中的一个。自动入参。

如果没找到对应的参数入参会报错。

如果存在多个有参的构造方法,也会报错没办吧实例化对象。

实例化过程中将对象存在单例池中。 Map<"bean名称",bean对象>

属性填充:依赖注入。IOC

@Autowired工作原理

先去寻找注入点,寻找加了Autowired的属性或者方法。

先byType ,再byName。

根据Type从Sprig容器中查找,有没有对应的类型。

查找到对应的类型之后判断是不是isAutowireCandidate=true,这个默认是true

查找有没有Qualifier("别名");

如果通过ByType查找找到Primary之后,就确定是这个主Bean,直接注入。  @Primary只能写一个

然后查看Bean是否配置了优先级。

如果上面步骤都没有找到,就根据名称ByName去查找对应的bean。

@Resource工作原理

先去寻找注入点,寻找加了Resource的属性或者方法。

如果@Resource注解指定了name属性,那么Spring就直接根据名字查找对应的Bean。找到就成功,没找到直接报错。

如果@Resource注解没有指定name属性,先通过属性名字,去查找有没有对应的属性名称的bean,如果有直接拿返回。

如果没有再根据属性的类型去查找。

@Resource根据名字去找,如果在方法上,他是根据方法setXXX的XXX去找,如果在属性上是更具变量名称查找。

初始化init:  如果要对bent初始化参数,可以进行下面步骤。

实现接口implements InitializingBean接口

public void afterPropertiesSet() throw Exception{ //要初始化的内容  } ;

//afterPropertiesSet()该方法注入Bean的时候回默认先执行该方法

或者使用自定义方法,不需要实现该接口。自定义一个方法后 使用注解@PostConstruct

AOP:如果实例化Bean对象的时候,该对象存在AOP拦截,这时候不是原来的对象,而是一个代理对象。

去Spring 容器里面拿到所有切面的Bean。查看方法上的@Before注解有没有拦截我当前创建的Bean。

生成代理对象:

如果找到匹配的切点,进行AOP。如果当前我创建的bean是UserService。 AOP会发生下面:

class UserServiceProxy extend UserService{

    //原来的对象
    private UserService target;
    public void tast(){
        //代理逻辑
        //代理逻辑是通过反射区执行被切面的逻辑
       target。test();
        
    }
}

最后Bean实例化的是UserServiceProxy的代理对象。

对象  :最后得到的对象结果。

bean  

Spring 事务:@Transactional

事务是采用切面AOP实现的,也就是会产生代理类。

class UserServiceProxy extend UserService{

    //事务的切面
    private UserService target;
    public void tast(){
        //建立数据库连接
        //conn.setAutocommit(false)
       target。test();
        commit;
    }
}

Spring的传播机制:

@Transaction(Propagation=XXX) 中的Propagation参数决定的。

 

Spring  ->谈一下对Spring 的理解

创建对象后,通过xml配置文件或者注解加入Spring 中的Bean

这个步骤就将该对象创建一个BeanDefintion。

实例化的过程是将BeanDefintion实例化

循环依赖

事务

生命周期

传播特性

IOC

AOP

设计模式

源码

Spring  boot笔记:

Spring  boot关键是下面两点:

启动类注解:@SpringBootApplication(注解配置类的核心注解)

        @SpringBootConfiguration    用来声明配置类 

                      javaConfig技术:Spring3.0版本以后开发出来的一个核心技术,用java代码去代替项目中的XML配置。

                     所谓自动配置就是Spring boot帮你准备了一大堆的javaconfig类,你只需要选择一部分就可以了。或者全部使用

         第一步:剔除Web项目中  web.xml替换成java类

        要实现0xml配置我们需要将这个类去        实现WebAppliceationInitializer接口

        该类只有onStarup(ServletContext servletCxt)方法。ServletContext是上下文对象

         该方法先去初始化Spring容器对象

          AnnotationConfigWebAppLicationContext ac=new AnnotationConfigWebAppLicationContext();

         因为Service3.0 oapi的一个新规范 SPI

          如果你有类或者方法,在容器启动的时候,需要被调用的话

         那么"你"  可以在项目中的启动的根路径下面指定一个文件META-INF/services

@EnableAutoConfiguration   (开启自动自动配置主键)

            @Import(Spring 里面的主键 通过注解的形式 注入一个Bean 到Spring  容器当中)

            @AutoConfigurationPackage(配置你自动扫描包的路径,自动扫描你加了AutoConfigurationPackage类的下面所有目录)

    import注入了一个bean到Spring容器中:AutoConfigurationImporSelector类   

     实现了ImportSelector接口,里面有一个String[]  selectImports(AnnotationMetadata varl);

     这个方法是会根据你实现这个方法的返回值的String数值去初始化javaBean 

      返回值必须要是java类的路径  com.test.**这种路径

     总结:通过Import注解注入了AutoConfigurationImporSelector类   ,实现了ImportSelector接口实现了接口方法selectImports。

     selectImports方法去扫描META-INF/Spring.factuirues的配置文件

     getAutConfigurationEntry(拿到所有自动配置的节点)

     getCanddateConfigurations()  (对所有配置文件进行过滤)

     loadFactoryNames() (去扫描配置文件的所有自动配置类)

   

 

启动main类的:SpringBootApplication.run(App.class,age)方法

 

    @SpringBootConfiguration ->@Configuration

   他就是javaConfig形式的Spring  ioc容器的配置类使用的拿给@configuration,

   Spring boot社区推荐使用基于javaConfig的配置形式,所以,这里的启动类标注了Configuration以后

   本身其实也是一个IOC容器的配置类,任何一个标注了@Configuration的java类定义都是一个java配置类

   如果一个bean定义依赖其他beanm则直接调用对应的javaConfig类Bean创建就可以,

   Configuration的注解表示的这个类可以使用Spring ioc容器作为Bean的来源

 

@ComponentScan

   这个主键在Spring中很重要,他对应XML配置中的元素,ComponentScan的功能就是自动扫描并加载复合条件的组建

   最终将这些bean定义加载到IOC容器中

   我们可以通过basePackages等属性来指定扫描范围,如果不指定则会从最外面包含扫描

 

@EnableAutoConfiguration(自动导入配置)

借助@Import的支持,收集和注册特定场景相关的bean定义

     @enableScheduling是通过Import将Spring调度框架相关的依赖

 

自动配置:

pom.xml

      Spring-boot-dependencied:核心依赖在父工程中

        我们在写或者引入一些依赖的时候,不需要版本,就是因为有这些版本仓库

启动器:Spring boot的启动场景

      Spring-boot-startter  包

      他就会帮我们自动导入web环境所有的依赖

     Spring boot会将所有的功能场景,都变成一个启动器

主程序:

     @SpringBootApplication(标注这个类是一个Springboot的引用)

总结:Springboot所有的自动配置都在启动的时候扫描并加载,扫描了spring.factores所有的自动配置都在这里面

但是不一定生效,要判断条件是否成立,只要导入了对应的start,就有对应的启动器了,有了启动器,我们自动装配就会生效,

然后就配置成功

1、Spring boot 在启动的时候,从类路径下/META-INF/spring.factores获取指定的值。

2、将自动配置的类导入容器,自动配置类就会生效,帮我们进行自动配置

3、以前我们需要自动配置的东西,现在springboot帮我们做了。

4、整个javaEE,解决方案和自动配置的东西都在Spring -boot-autoconfigure包下

5、它会把所有需要导入的组件,以类名的方式返回。这些组件就回被添加到容器;

6、容器中也会存在非常多的XXXAutoConfiguration的文件,就是这些类给容器导入了这些场景需要的组件。并自动配置,@Configuration,javaConfig

7、有了自动配置类,就免去了我们需要手动配置的工作。

 

主启动类怎么运行:

 SpringApplication

  这个类主要做了下面4个事情

1、推断应用的类型是普通的项目还是web项目

2、查找并加载所有的初始化器

3、找出所有的应用程序的监听器,加入到初始化中。

4、推断并设置main方法的定义类,找到运行的主类。

Spring boot的理解

自动装配

run()方法;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值