• 包扫描自定义注解类并实例化


    1.  新建Maven 项目   annotation

    2.   pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
            http://maven.apache.org/xsd/maven-4.0.0.xsd">
    
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.java</groupId>
        <artifactId>annotation</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    
    
        <!-- 配置版本常量 -->
        <properties>
            <jdk.version>1.7</jdk.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.reflections</groupId>
                <artifactId>reflections</artifactId>
                <version>0.9.11</version>
            </dependency>
    
        </dependencies>
    
        <build>
            <finalName>${project.artifactId}</finalName>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                    <configuration>
                        <source>${jdk.version}</source>
                        <target>${jdk.version}</target>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>

    3.   Service.java

    package com.java.annotation;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface Service {
    
        String value();
    
    }

    4.   TestService.java

    package com.java.service;
    
    import com.java.annotation.Service;
    
    @Service("test")
    public class TestService {
    
        public void sayHello() {
            System.out.println("Hello TestService!");
        }
    
    }

    5.   DemoService.java

    package com.java.service;
    
    import com.java.annotation.Service;
    
    @Service("demo")
    public class DemoService {
    
        public String execute(String name) {
            return "DemoService: " + name;
        }
    
    }

    6.   BeanFactory.java

    package com.java.factory;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Set;
    
    import org.reflections.Reflections;
    
    import com.java.annotation.Service;
    
    public class BeanFactory {
    
        /**
         * Bean对象容器
         */
        private static final Map<String, Object> beanContainer = new HashMap<String, Object>();
    
        /**
         * 初始化指定包下的所有@Service注解标记的类
         * 
         * @param packageName 初始化包路径
         * @throws InstantiationException
         * @throws IllegalAccessException
         */
        public static void init(String packageName) throws InstantiationException, IllegalAccessException {
            Reflections f = new Reflections(packageName);
            Set<Class<?>> set = f.getTypesAnnotatedWith(Service.class);
            for (Class<?> c : set) {
                Object bean = c.newInstance();
                Service annotation = c.getAnnotation(Service.class);
    
                beanContainer.put(annotation.value(), bean);
            }
        }
    
        /**
         * 根据注解名获取实例
         * 
         * @param beanName 注解的名称
         * @return 对应实例
         */
        public static Object getBean(String beanName) {
            return beanContainer.get(beanName);
        }
    
        /**
         * 根据注解名获取指定类型的实例
         * 
         * @param beanName bean名称,注解指定的value值
         * @param beanClass bean类型
         * @return 指定类型的实例
         */
        public static <T> T getBean(String beanName, Class<T> beanClass) {
            return beanClass.cast(getBean(beanName));
        }
    
    }

     

    7.   Run.java

    package com.java.run;
    
    import com.java.factory.BeanFactory;
    import com.java.service.DemoService;
    import com.java.service.TestService;
    
    public class Run {
        public static void main(String[] args) {
            try {
    
                // 实例化com.java.service下的所有@Service标记的类
                BeanFactory.init("com.java.service");
    
                TestService test = BeanFactory.getBean("test", TestService.class);
                test.sayHello();
    
                DemoService demo = BeanFactory.getBean("demo", DemoService.class);
                String result = demo.execute("Jack");
                System.out.println(result);
    
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    
    }

     

    8.   运行第7步创建的Run的主方法,测试运行结果,如下:

    Hello TestService!
    DemoService: Jack

    .

  • 相关阅读:
    WHU 1572 Cyy and Fzz (AC自动机 dp )
    Codeforces 441D Valera and Swaps(置换群)
    Codeforces 527E Data Center Drama(欧拉回路)
    差分约束小结
    Codeforces 193D Two Segments 解题报告
    SGU 231.Prime Sum
    SGU 249.Matrix(Gray码)
    SGU 222.Little Rooks
    SGU 207.Robbers
    risc-v的寻址模式
  • 原文地址:https://www.cnblogs.com/jonban/p/annotation.html
Copyright © 2020-2023  润新知