Spring注解开发

Spring注解开发

注册组件

@Configuration中配置@Bean注册组件

实体类

public class User {
    private int id;
    private String name;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

    public User() {
    }

    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

配置类

@Configuration
public class MyConfiguration {

    @Bean
    public User user() {
        return new User();
    }
}

测试类

public class Mytest {

    private ApplicationContext applicationContext
            = new AnnotationConfigApplicationContext(com.annotation.config.MyConfiguration.class);


    @Test
    public void test01() {
        // 按名称
        // User user = (User) applicationContext.getBean("user");
        // 按类型
        User user = applicationContext.getBean(User.class);
        System.out.println(user);
    }
}

利用@ComponentScan扫描注册

配置类

@Configuration
@ComponentScan(
        // 扫描的包
        value = "com.annotation",
        // 排除
        excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Service.class})},
        // 只包含(需要禁用默认规则)
        useDefaultFilters = false,
        includeFilters = {
                // 按照注解
                @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class}),
                // 按照类型
                @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {UserController.class}),
                // 可以自定义Filter
                @ComponentScan.Filter(type = FilterType.CUSTOM, classes = {MyTypeFilter.class})
        }
)
public class MyConfiguration {

}

自定义过滤器类

// 实现TypeFilter
public class MyTypeFilter implements TypeFilter {
    /**
     * @param metadataReader        可以获取到当前正在扫描类的信息
     * @param metadataReaderFactory 可以获取到其他类的信息
     * @return 返回值为布尔值,true为成功,false失败
     * @throws IOException
     */
    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
        // 获取当前类注解信息
        AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
        // 获取当前类的类信息
        ClassMetadata classMetadata = metadataReader.getClassMetadata();
        // 获取当前类的资源信息(路径)
        Resource resource = metadataReader.getResource();

        String className = classMetadata.getClassName();

        // 如果类名包含er则返回true
        if (className.contains("er")) {
            return true;
        }
        return false;
    }
}

组件类

@Controller
public class UserController {
}

测试类

@Test
public void test02() {
    UserController userController = (UserController) applicationContext.getBean("userController");
    System.out.println(userController);
}

使用@Conditional条件注册


配置类

@Configuration

public class MyConfiguration {

    @Conditional({FalseCondition.class})
    @Bean
    public User tom() {
        return new User(1, "tom");
    }

    // 参数为Condition数组
    @Conditional({TrueCondition.class})
    @Bean
    public User jack() {
        return new User(2, "jack");
    }
}

Condition类

public class TrueCondition implements Condition {
    /**
     * @param context   上下文环境
     * @param metadata  注释信息
     * @return
     */
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        // 获取到BeanFactory
        ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
        // 获取到类加载器
        ClassLoader classLoader = context.getClassLoader();
        // 获取到环境
        Environment environment = context.getEnvironment();
        // 获取到bean定义的注册类
        BeanDefinitionRegistry registry = context.getRegistry();

        return true;
    }
}
public class FalseCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return false;
    }
}

测试类

@Test
public void test03() {
    Map<String, User> beans = applicationContext.getBeansOfType(User.class);

    System.out.println(beans);

}

未完待续,更新ing

posted @ 2022-04-06 21:23  CoderCatIce  阅读(17)  评论(0编辑  收藏  举报