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);
        }
    }
  • 相关阅读:
    20165220《网络对抗技术》week1 Exp0 Kali安装
    2018-2019-1 20165220 实验五 通讯协议设计
    20165220 《信息安全系统设计基础》第9周学习总结
    20165204 20165216 20165220 实验四 外设驱动程序设计
    20165220 mybash
    2018-2019-1 20165220 《信息安全系统设计基础》第八周学习总结
    20165220 实验三《并发程序》
    2018-2019-1 20165220 《信息安全系统设计基础》第7周学习总结
    2018-2019-1 20165220 《信息安全系统设计基础》第6周学习总结
    实验二 固件程序设计
  • 原文地址:https://www.cnblogs.com/1540340840qls/p/7923019.html
Copyright © 2011-2022 走看看