美文网首页
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