spring基础组件和使用


文章目录

  • spring基础组件和使用
  • 前言
  • 一、spring加载bean
  • 1.通过XML加载bean
  • 2.通过注解加载bean,简化配置
  • 二、spring常见注解及其功能
  • 1.bean扫描注解@ComponentScan
  • 2.基本作用域注解@Scope
  • 3.懒加载@Lazy
  • 4.bean角色声明注解
  • 总结



前言

此系列主要复习spring相关知识点,记录spring使用各种方式

一、spring加载bean

1.通过XML加载bean

1.在resources文件夹下建立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.bean.Person">
        <property name="name" value="james"></property>
        <property name="age" value="19"></property>
    </bean>
    </beans>

2.加载XML获取其中bean信息

public static void main(String[] args) {
        //读取XML文件
        ApplicationContext app = new ClassPathXmlApplicationContext("com/bean.xml");
        //通过预先配置好的bean名称加载bean
        Person person = (Person) app.getBean("person"); 
        System.out.println(person.toString());

    }

2.通过注解加载bean,简化配置

1.通过注解@Configuration定义配置类,@Bean定义bean信息

//用于定义配置类 取代XML
@Configuration
public class MainConfig {

    @Bean
    public Person getPerson() {
        return new Person("测试", 20);
    }


}

2.加载注册类,获取其中的bean
注意@Bean不配置名称则取方法名为bean名称

public static void main(String[] args) {
        //读取config类
        ApplicationContext app = new AnnotationConfigApplicationContext(MainConfig.class);
        //获取bean 默认bean是由方法名决定 也可在@Bean中自定义
        Person person = (Person) app.getBean("getPerson");
        System.out.println(person.toString());

    }

二、spring常见注解及其功能

1.bean扫描注解@ComponentScan

1.该注解通过配置扫描路径,从中找出标识了需要装配的类自动装配到spring的bean容器中
即扫描被@Component注解标记的bean。@Controller @Service等注解源码均存在@Component

@Configuration
//ComponentScan 用于扫描bean注解(例如@Controller @Service等)
@ComponentScan(value = "com.test2")
public class Test2Config {
}

2.通过配置@Filter可自由定义扫描规则,实现TypeFilter 接口可自由判断是否需要注册bean

@Configuration
//ComponentScan 用于扫描bean注解(例如controller service等)
//@ComponentScan value:指定要扫描的包
//excludeFilters = Filter[] 指定扫描的时候按照什么规则排除那些组件
//includeFilters = Filter[] 指定扫描的时候只需要包含哪些组件
//useDefaultFilters = false 默认是true,扫描所有组件,要改成false
//----扫描规则如下
//FilterType.ANNOTATION:按照注解
//FilterType.ASSIGNABLE_TYPE:按照给定的类型;比如按BookService类型
//FilterType.ASPECTJ:使用ASPECTJ表达式
//FilterType.REGEX:使用正则指定
//FilterType.CUSTOM:使用自定义规则,自已写类,实现TypeFilter接口
@ComponentScan(value = "com.test2", includeFilters = {
        @ComponentScan.Filter(type = FilterType.CUSTOM, classes = {Test2TypeFilter.class})
}, useDefaultFilters = false)
public class Test2Config {
}
public class Test2TypeFilter implements TypeFilter {
    /**
     * @param metadataReader        读取到当前正在扫描类的信息
     * @param metadataReaderFactory 可以获取到其他任何信息
     * @return
     * @throws IOException
     */
    //自定义扫描注解规则
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
        //获取当前类注解信息
        AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
        System.out.println("bean注解信息:" + annotationMetadata.getAnnotationTypes());

        //获取当前正在扫描类信息
        ClassMetadata classMetadata = metadataReader.getClassMetadata();
        System.out.println("bean信息:" + classMetadata.getClassName());
        //获取当前类资源信息
        Resource resource = metadataReader.getResource();
        System.out.println("bean资源信息:" + resource.getURL());
        if (classMetadata.getClassName().contains("Order")) {
            return true;
        }
        return false;
    }
}

2.基本作用域注解@Scope

prototype: 多实例:IOC容器启动并不会去调用方法创建对象放在容器中,而是 每次获取的时候才会调用方法创建对象
singleton: 单实例(默认):IOC容器启动会调用方法创建对象放到IOC容器中
以后每交获取就是直接从容器中取
prototype主要应用在bean信息不共享的场景,即一个请求所需的bean信息重新初始化,不与其余请求公用

//singleton单例模式 -- 全局有且仅有一个实例
    //prototype原型模式 -- 每次获取Bean的时候会有一个新的实例
    //可防止多线程共用非静态变量引起的问题 获取bean时才会创建
    //request -- request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
    //session -- session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
    //globalsession -- global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义
    @Bean
    @Scope("prototype")
    public Person getPerson01() {
        return new Person("测试", 20);
    }

3.懒加载@Lazy

IOC容器初始化是不会创建,bean获取bean时创建

4.bean角色声明注解

@Component 组件,标记为bean,没有明确的角色

@Service 在业务逻辑层使用(service层)

@Repository 在数据访问层使用(dao层)

@Controller 在展现层使用,控制器的声明

总结

这里只是列举spring使用基本注解,后续还有切面,异步,定时慢慢更新