美文网首页
01 Spring基础及组件使用_01

01 Spring基础及组件使用_01

作者: 攻城狮哦哦也 | 来源:发表于2019-10-10 14:05 被阅读0次

    1 Spring概述

    1.1 Spring是什么?

    1.2 Spring的发展历程

    1.3 Spring目标

    1.4 Spring的体系目标

    image.png

    1 Spring Core:即,Spring核心,它是框架最基础的部分,提供IOC和依赖注入特性
    2 Spring Context:即,Spring上下文容器,它是BeanFactory功能加强的一个子接口
    3 Spring Web:它提供Web应用开发的支持
    4 Spring MVC:它针对Web应用中MVC思想的实现
    5 Spring DAO:提供对JDBC抽象层,简化了JDBC编码,同时,编码更具有健壮性。
    6 Spring ORM:它支持用于流行的ORM框架的整合,比如:Spring + Hibernate、Spring + iBatis、Spring + JDO的整合等等。
    7 Spring AOP:AOP即,面向切面编程,它提供了与AOP联盟兼容的编程实现

    1.5 Spring常用组件

    image.png

    2 Sping注入bean的方式

    2.1 第一种:bean.xml

    • bean.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"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="person" class="com.enjoy.cap1.Person">
            <property name="name" value="james"></property>
            <property name="age" value="19"></property>
        </bean>
    </beans>
    
    

    利用<bean>标签将需要注入spring容器的对象进行配置,此方式现在比较少用

    • 加载bean.xml至容器中
    public class MainTest1 { 
        public static void main(String args[]){
            //把beans.xml的类加载到容器
            ApplicationContext app = new ClassPathXmlApplicationContext("beans.xml");
            //从容器中获取bean
            Person person = (Person) app.getBean("person");
            
            System.out.println(person);
        }
    }
    
    
    • 输出结果
    Person [name=james, age=19]
    

    获取到了xml中配置的类和类的属性值

    2.2 第二种:@Configuration @Bean

    @Configuration注解,就相当于把设置了此注解的类作为配置类,替代了之前的bean.xml
    @bean 就相当于之前xml中的<bean>标签,可设置注入对象

    //配置类====配置文件
    @Configuration
    public class MainConfig {
        //给容器中注册一个bean, 类型为返回值的类型
            //person01()方法名默认为bean的ID
            // 如何更改bean的ID值
            //       1、直接改person01()的方法名
            //       2、直接在@Bean("abcPerson")添加你想要的的ID名,比如当前这个bean的ID就被改为"abcPerson"
        @Bean("abcPerson")
        public Person person01(){
            return new Person("james",20);
        }
    }
    
    

    调用类

    public class MainTest2 { 
        public static void main(String args[]){     
            ApplicationContext app = new AnnotationConfigApplicationContext(MainConfig.class);      
            //获取容器中所有已注入Person类型的beanName
           //beanName相当于之前<bean>标签的id="person"属性
            String[] namesForBean = app.getBeanNamesForType(Person.class);
            for(String name:namesForBean){
                System.out.println(name);
            }
            
            
        }
    }
    

    2.3 第三种:@Configuration @ComponentScan

    @ComponentScan(value="com.enjoy.cap2")表示扫描此目录下的包

    • Config类
    @Configuration
    //@Controller  @Service  @Respostry  @Component
    @ComponentScan(value="com.enjoy.cap2", includeFilters={     
            @Filter(type=FilterType.ANNOTATION, classes={Controller.class})     
    }, useDefaultFilters=false)
    
    
    public class Cap2MainConfig {
        //给容器中注册一个bean, 类型为返回值的类型, 
        @Bean
        public Person person01(){
            return new Person("james",20);
        }
    }
    
    

    在@ComponentScan中加入扫描规则

    • @ComponentScan value:指定要扫描的包
    • excludeFilters = Filter[] 指定扫描的时候按照什么规则排除那些组件
    • includeFilters = Filter[] 指定扫描的时候只需要包含哪些组件
    • useDefaultFilters = false 默认是true,扫描所有组件,要改成false,使用自定义扫描范围,否则自定义不生效
      ----扫描规则如下
    • FilterType.ANNOTATION:按照注解
    • FilterType.ASSIGNABLE_TYPE:按照给定的类型;比如按BookService类型
    • FilterType.ASPECTJ:使用ASPECTJ表达式
    • FilterType.REGEX:使用正则指定
    • FilterType.CUSTOM:使用自定义规则,自已写类,实现TypeFilter接口

    FilterType.CUSTOM的例子,常用
    先新增自定义过滤规则类:

    public class CunstomTypeFilter implements TypeFilter{
        private ClassMetadata classMetadata;
    
        /*
         * MetadataReader:读取到当前正在扫描类的信息
         * MetadataReaderFactory:可以获取到其他任何类信息
         */
        
        @Override
        public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)
                throws IOException {
            //获取当前类注解的信息
            AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
            //获取当前正在扫描的类信息
            classMetadata = metadataReader.getClassMetadata();
            //获取当前类资源(类的路径)
            Resource resource = metadataReader.getResource();
            
            String className = classMetadata.getClassName();
            System.out.println("----->"+className);
            if(className.contains("order")){//当类包含er字符, 则匹配成功,返回true
                return true;
            }
            return false;
        }
    
    }
    

    在config类中声明并调用

    在Cap2MainConfig申明
    @ComponentScan(value="com.enjoy.cap2",includeFilters={
            @Filter(type=FilterType.CUSTOM,classes={JamesTypeFilters.class})
    },useDefaultFilters=false) 
    public class Cap2MainConfig2 {}
    
    image.png

    2.4 注入条件判断

    2.5 对bean的属性设置

    2.5.1 @Scope注解

    该注解主要是定义当前bean在Spring容器中是否单例,Spring默认是单例
    语法如下

    image.png

    @Scope(“prototype”) //多实例
    prototype: 多实例:IOC容器启动并不会去调用方法创建对象放在容器中,而是 每次获取的时候才会调用方法创建对象,见test02
    singleton: 单实例(默认):IOC容器启动会调用方法创建对象放到IOC容器中
    以后每交获取就是直接从容器(理解成从map.get对象)中拿
    request: 主要针对WEB应用,同一次请求创建一个实例
    session: 同一个session创建一个实例(后面两个用得不多,了解即可)

    2.5.2 @lazy懒加载

    config类

    image.png
    调用类
    image.png

    当在Cap4MainConfig加入@Lazy时, 只有获取anno.getBean时才会加载到IOC容器中

    相关文章

      网友评论

          本文标题:01 Spring基础及组件使用_01

          本文链接:https://www.haomeiwen.com/subject/icruyctx.html