Spring 注解驱动(一)基本使用规则

Spring 注解驱动(一)基本使用规则

Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html)

一、基本使用

@Configuration
@ComponentScan(basePackages = "com.github.binarylei",
        excludeFilters = {@Filter(type = FilterType.ANNOTATION, classes = {Controller.class})}
)
@Lazy(false)
public class AnnnotationConfig {

    // Scope 可取四个值:SCOPE_SINGLETON、SCOPE_PROTOTYPE、SCOPE_SESSION、SCOPE_REQUEST
    @Bean
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public User user() {
        return new User();
    }
}

启动测试:

public static void main(String[] args) {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AnnnotationConfig.class);
    // AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
    // context.register(AnnnotationConfig.class);
    // context.refresh();

    User user = context.getBean(User.class);
}

二、@ComponentScan

@Configuration
@ComponentScan(basePackages = "com.github.binarylei",
        excludeFilters = {
                @Filter(type = FilterType.ANNOTATION, classes = {Controller.class}),
                @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {User.class}),
                @Filter(type = FilterType.CUSTOM,classes = MyFilter.class)
        }, useDefaultFilters = false
)
public class AnnnotationConfig {
}

自定义的包扫描如下:

public class MyFilter implements TypeFilter {

    /**
     * @param metadataReader        当前类的信息
     * @param metadataReaderFactory 获取其他类的信息
     */
    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)
            throws IOException {
        // 1. 当前类的注解信息
        AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
        // 2. 当前类的信息
        ClassMetadata classMetadata = metadataReader.getClassMetadata();
        // 3. 当前类的资源信息(类路径)
        Resource resource = metadataReader.getResource();
        return true;
    }
}

三、@Conditional

@Bean
@Conditional(MyCondition.class)
public User user() {
    return new User();
}

// 条件装配
public class MyCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        // 1. IOC 容器
        ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
        // 2. 类加载器
        ClassLoader classLoader = context.getClassLoader();
        // 3. 环境变量
        Environment environment = context.getEnvironment();
        // 4. 可以向容器中注册 BeanDefinition
        BeanDefinitionRegistry registry = context.getRegistry();
        return environment.getProperty("os.name").contains("Windows");
    }
}

四、@Import

给容器中注册组件有以下方式:

  1. @Bean
  2. 包扫描(@ComponentScan) + 注解(@Componet/@Repository/@Service/@Controller)
  3. @Import
    • @Import({User.class}) 导入单个组件
    • @Import({User.class, MyImportSelector.class}) MyImportSelector 批量导入组件
    • @Import({User.class, MyImportBeanDefinitionRegistrar.class}) MyImportBeanDefinitionRegistrar 批量导入组件
  4. FactoryBean
@Import({User.class, MyImportSelector.class})
@Import({User.class, MyImportBeanDefinitionRegistrar.class})
public class AnnnotationConfig {
}

// 返回类名的全定限名称
public class MyImportSelector implements ImportSelector {

    /**
     * @param importingClassMetadata 获取标注 @Import 注解的类所有注解信息(不仅仅是 @Import)
     */
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        // 不要返回 null,否则会报空指针异常
        return new String[]{User.class.getName()};
    }
}

// 使用 BeanDefinitionRegistry 注册
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    /**
     * @param importingClassMetadata 获取标注 @Import 注解的类所有注解信息(不仅仅是 @Import)
     * @param registry               向容器中注册 BeanDefinition
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
                                        BeanDefinitionRegistry registry) {

        boolean definition1 = registry.containsBeanDefinition("red");
        boolean definition2 = registry.containsBeanDefinition("blue");
        if (definition1 && definition2) {
            RootBeanDefinition beanDefinition = new RootBeanDefinition(User.class);
            registry.registerBeanDefinition("user", beanDefinition);
        }
    }
}

五、Bean 的生命周期

  1. @Bean(initMethod = "init", destroyMethod = "destroy")
  2. 实现 InitializingBean, DisposableBean 接口


每天用心记录一点点。内容也许不重要,但习惯很重要!

原文地址:https://www.cnblogs.com/binarylei/p/10203385.html

时间: 2024-10-05 03:46:11

Spring 注解驱动(一)基本使用规则的相关文章

Spring 注解驱动(二)WEB 注解开发

Spring 注解驱动(二)WEB 注解开发 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) 一.基本使用 在 Servlet 3.0 时支持注解启动,不再需要 web.xml 配制文件. 1.1 Servlet 3.0 注解 Servlet 3.0 常用注解: @WebServlet @WebFilter @WebInitParam @WebListener @WebServlet("/hello") pu

Spring注解驱动开发(一)--项目搭建

一. 前言 <Spring注解驱动开发>系列文章是基于Spring的4.3.11.RELEASE版本,通过注解的方式进行开发演示. 二. 项目搭建 1.依赖包引用 创建一个maven工程,引入相关的依赖包.我们以依赖最少的原则只引用spring-context和junit包. <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>s

Spring注解驱动开发(二)--组件注入

一.前言 上一篇我们搭建了一个简单的Spring项目,并简单的使用了 组件注册.这一篇中,我们来详细的讲解组件注入. 二.组件注入 1. @ComponentScan 在上一篇中,我们使用了@Configuration和@Bean实现了组件注入.但是如果需要注入的组件很多的情况下,每个组件都需要通过一个@Bean注解进行注入,这样就会很麻烦.所以Spring提供了@ComponentScan注解. @ComponentScan可以指定需要扫描的包,在这些包下,@Component注解标注的组件都

SSH框架搭建 笔记 (含spring注解驱动)

分类: web 开发2014-04-27 12:33 354人阅读 评论(0) 收藏 举报 框架springinterface注解 好久没有搭建框架了,今天整理下以前的知识,整合下SSH,没想到手生了,一时半会各种异常出来,经过一番挣扎后,终于搞出来了雏形, 下面是我做整合框架的笔记,如果大家开发过程中又遇到的情况,可以参考下 首先是包的结构,(命名不算正规哈~,临时写的仓促了点) 框架是基于JAR包的基础上构建的,所以必须必备的jar包必须先下好, 如图: 没有的可以在本文源代码里下: 搭建框

Spring注解驱动开发之IOC

1.最简单的注解驱动开发实例: <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.8.RELEASE</version> </dependency> public class Student { String name; public String ge

Spring注解驱动开发之web

前言:现今SpringBoot.SpringCloud技术非常火热,作为Spring之上的框架,他们大量使用到了Spring的一些底层注解.原理,比如@Conditional.@Import.@EnableXXX等.如果掌握这些底层原理.注解,那么我们对这些高层框架就能做到高度定制,使用的游刃有余 一.servlet3.0规范 1.新增的注解支持 在servlet3.0之前的话,我们要添加Servlet.Filter.Listener都需要在web.xml中注册,而在servlet3.0添加了注

Spring注解驱动开发(一)-----组件注册

注册bean xml方式 1.beans.xml-----很简单,里面注册了一个person bean <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xm

Spring注解驱动开发(四)-----aop、声明式事务

AOP 概念 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式:-----基于动态代理 一个aop示例 1.导入aop模块:Spring AOP:(spring-aspects)-----导入相关jar包 2.MathCalculator-----一个业务逻辑的类-----在业务逻辑运行的时候将日志进行打印(方法之前.方法运行结束.方法出现异常,xxx) package com.atguigu.aop; public class MathCalculator { publ

Spring注解驱动开发(七)-----servlet3.0、springmvc

ServletContainerInitializer Shared libraries(共享库) / runtimes pluggability(运行时插件能力) 1.Servlet容器启动会扫描,当前应用里面每一个jar包的 ServletContainerInitializer的实现2.提供ServletContainerInitializer的实现类: 必须绑定在,META-INF/services/javax.servlet.ServletContainerInitializer 文件