zoukankan      html  css  js  c++  java
  • 用filters定制化spring的包扫描

    Fiter的信息如下:

    Filter的类型有:annotation(这是spring默认的),assignable,aspectj, regex,custom

    首先看一下我这个demo的目录结构:

    上图中所有被红色圆圈圈住的都是本demo要写的代码:

    AppConfig的代码如下:

    package com.timo.resourceJavaConfig;
    import com.timo.entity.Master;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.FilterType;
    import org.springframework.stereotype.Repository;
    
    /**
     * The following example shows the configuration ignoring all @Repository annotations and using
     "stub" repositories instead.
     */
    @Configuration
    @ComponentScan(basePackageClasses = Master.class,
    includeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern =
    ".*Stub.*Repository"),
    excludeFilters = @ComponentScan.Filter(Repository.class))
    public class AppConfig {
    }

    等价于用xml写的:appconfig.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:p="http://www.springframework.org/schema/p"
           xmlns:c="http://www.springframework.org/schema/c"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">
        <!--<context:annotation-config/> only looks for annotations on beans in the same application context in which
        it is defined  RequiredAnnotationBeanPostProcessor   AutowiredAnnotaionBeanPostProcessor
        CommonAnnotationBeanPostProcessor PersistenceAnnotaionBeanPostProcessor-->
        <context:component-scan base-package="com.timo.entity" annotation-config="true">
            <context:include-filter type="regex" expression=".*Sub.*Respository"/>
            <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
        </context:component-scan>
    </beans>

    com.timo.entity包下

    Dog的代码如下:

    package com.timo.entity;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Repository;
    import org.springframework.stereotype.Service;
    
    /**
     * 这里可以写@Component,@Service,@Controller注解,写@Repository注解会报错
     * 报错的原因是在配置文件或者注解排除了@Repository.
     */
    @Service
    public class Dog {
        @Value("pug")
        private String name;
        @Value("18")
        private Integer age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    }

    Master的代码如下:

    package com.timo.entity;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    @Component
    public class Master {
        @Autowired
        private Dog dog;
    
        public Dog getDog() {
            return dog;
        }
    
        public void setDog(Dog dog) {
            this.dog = dog;
        }
        public void showDogInfo(){
            System.out.println("name="+dog.getName());
            System.out.println("age="+dog.getAge());
        }
    }

    测试用xml的代码如下:

    Test4的代码如下:

    package com.timo.test2;
    
    
    import com.timo.entity.Dog;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Test4 {
        public static void main(String[] args) {
            ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("appconfig.xml");
            Dog dog = applicationContext.getBean(Dog.class);
            System.out.println("name="+dog.getName());
            System.out.println("age="+dog.getAge());
        }
    }

    测试用注解写的Test3的代码如下:

    package com.timo.test2;
    
    import com.timo.entity.Dog;
    import com.timo.resourceJavaConfig.AppConfig;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    public class Test3 {
        public static void main(String[] args) {
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
            Dog dog = applicationContext.getBean(Dog.class);
            System.out.println("dog="+dog);
        }
    }
  • 相关阅读:
    【原】Go语言及Web框架Beego环境无脑搭建
    Treap学习笔记
    读书笔记--Head First PMP目录
    Linux操作系统常用命令合集——第四篇-文件系统权限操作(5个命令)
    Linux操作系统常用命令合集——第三篇-系统管理操作(25个命令)
    Linux操作系统常用命令合集——第二篇- 用户和组操作(15个命令)
    路由器与交换机配置——配置文件和系统映像备份与恢复
    路由器配置——密码重置
    交换机配置——端口安全
    路由器与交换机配置——交换机默认网关(实现跨网段telnet)
  • 原文地址:https://www.cnblogs.com/1540340840qls/p/7923019.html
Copyright © 2011-2022 走看看